From fa6e7101dff29e67a7f43998c9b2eabd0f3853d1 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 30 Jan 2020 08:31:04 -0700 Subject: [PATCH] adjust inliner to avoid infinite inline Fixes optimization for an expression like (define (f x) (lambda (y) (letrec ([recursion (f x)]) (+ x y)))) by adjusting the inlining hueristic to support less inlining on a second pass of `letrec` right-hand sides. Closes #3027 --- pkgs/racket-test-core/tests/racket/optimize.rktl | 8 ++++++++ racket/src/racket/src/optimize.c | 3 +++ 2 files changed, 11 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index bb1bcca073..c592cd45de 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -6583,4 +6583,12 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(module regression-test-to-make-sure-inlining-does-not-go-crazy racket/base + (define (f x) + (lambda (y) + (letrec ([recursion (f x)]) + (+ x y))))) + +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (report-errs) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index f596bb9dc1..6dbf879580 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -8096,6 +8096,8 @@ static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, in avoid the possibility of N^2 behavior. */ if (!OPT_DISCOURAGE_EARLY_INLINE) rhs_info->letrec_not_twice++; + inline_fuel = rhs_info->inline_fuel; + rhs_info->inline_fuel >>= 1; use_psize = rhs_info->use_psize; rhs_info->use_psize = info->use_psize; @@ -8111,6 +8113,7 @@ static Scheme_Object *optimize_lets(Scheme_Object *form, Optimize_Info *info, in if (!OPT_DISCOURAGE_EARLY_INLINE) --rhs_info->letrec_not_twice; + rhs_info->inline_fuel = inline_fuel; rhs_info->use_psize = use_psize; irlv->value = value;