diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 89553c8127..2bb3487d2f 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -5013,12 +5013,14 @@ static Scheme_Object *optimize_branch(Scheme_Object *o, Optimize_Info *info, int && scheme_ir_duplicate_ok(fb, 0)) { Scheme_Branch_Rec *b2 = (Scheme_Branch_Rec *)t; if (SCHEME_FALSEP(b2->fbranch)) { + Scheme_Object *fb3; Scheme_Branch_Rec *b3; b3 = MALLOC_ONE_TAGGED(Scheme_Branch_Rec); b3->so.type = scheme_branch_type; b3->test = b2->tbranch; b3->tbranch = tb; - b3->fbranch = fb; + fb3 = optimize_clone(0, fb, info, empty_eq_hash_tree, 0); + b3->fbranch = fb3; t = b2->test; tb = (Scheme_Object *)b3; } @@ -6725,20 +6727,14 @@ static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, in /* Although this variable's uses do not necessarily cross a continuation capture, the inference of its type depends on that crossing, so we treat as having a crossing. - This is an accomodation to the bytecode format and + This is an accommodation to the bytecode format and validator, which has no way to distinguish between a known type and unboxing capability for that type. */ SCHEME_VAR(pre_body->vars[0])->escapes_after_k_tick = 1; } } - if (SAME_TYPE(SCHEME_TYPE(value), scheme_ir_local_type)) { - /* shouldn't get here, since scheme_ir_propagate_ok() - should have returned true, but just in case... - local is in unoptimized coordinates */ - pred = NULL; - } else - pred = expr_implies_predicate(value, rhs_info); + pred = expr_implies_predicate(value, rhs_info); if (pred) add_type(body_info, (Scheme_Object *)pre_body->vars[0], pred);