diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 4d4954d811..31c3883cbf 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -3711,6 +3711,16 @@ (test 'c dynamic-require ''check-jit-registers-shortcut 'result) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Check (non-)inference of flonums with `if` branches: + +(let () + (define f (lambda (x) + (let ([v (if x 1 2.0)]) + (fl+ v v)))) + (set! f f) + (err/rt-test (f #t))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 53edbcaf83..d986b85a54 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -2021,8 +2021,14 @@ static int expr_produces_local_type(Scheme_Object *expr, int fuel) case scheme_branch_type: { Scheme_Branch_Rec *b = (Scheme_Branch_Rec *)expr; - return (expr_produces_local_type(b->tbranch, fuel / 2) - && expr_produces_local_type(b->fbranch, fuel / 2)); + int t1, t2; + + t1 = expr_produces_local_type(b->tbranch, fuel / 2); + if (t1) { + t2 = expr_produces_local_type(b->fbranch, fuel / 2); + return ((t1 == t2) ? t1 : 0); + } else + return 0; } break; case scheme_sequence_type: