From ec96592702ea4c0f16c661d2d710bb486488809c Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 27 May 2014 08:59:03 +0100 Subject: [PATCH] optimizer: treat known procedure bindings, etc., as #t for `if` Closes PR 14526 --- .../racket-test/tests/racket/optimize.rktl | 30 +++++++++++++++++++ racket/src/racket/src/optimize.c | 23 +++++++++++--- racket/src/racket/src/schvers.h | 4 +-- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 94bcdc7e3c..25befdf4f9 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -1158,6 +1158,36 @@ (a1) (a2)))) +(test-comp '(lambda (y) + (let ([f (lambda (x) x)]) + (if f + (+ y 1) + (- y 1)))) + '(lambda (y) + (+ y 1))) + +(test-comp '(module m racket/base + (define (f x) x) + (define (g y) + (if f + (+ y 1) + (- y 1)))) + '(module m racket/base + (define (f x) x) + (define (g y) + (+ y 1)))) + +(test-comp '(module m racket/base + (struct p (x y) #:omit-define-syntaxes) + (define (g y) + (if p-x + (+ y 1) + (- y 1)))) + '(module m racket/base + (struct p (x y) #:omit-define-syntaxes) + (define (g y) + (+ y 1)))) + (test-comp '(values 10) 10) (test-comp '(let ([x (values 10)]) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index c67f87a6cb..eca6a55c5c 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -6005,7 +6005,10 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in case scheme_with_cont_mark_type: return optimize_wcm(expr, info, context); case scheme_compiled_unclosed_procedure_type: - return optimize_closure_compilation(expr, info, context); + if (context & OPT_CONTEXT_BOOLEAN) + return scheme_true; + else + return optimize_closure_compilation(expr, info, context); case scheme_compiled_let_void_type: return scheme_optimize_lets(expr, info, 0, context); case scheme_compiled_toplevel_type: @@ -6025,6 +6028,9 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in } if (c) { + if (context & OPT_CONTEXT_BOOLEAN) + return (SCHEME_FALSEP(c) ? scheme_false : scheme_true); + if (scheme_compiled_duplicate_ok(c, 0)) return c; @@ -6052,8 +6058,12 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in optimize_info_used_top(info); return expr; case scheme_compiled_quote_syntax_type: - info->size += 1; - optimize_info_used_top(info); + if (context & OPT_CONTEXT_BOOLEAN) + return scheme_true; + else { + info->size += 1; + optimize_info_used_top(info); + } return expr; case scheme_variable_type: case scheme_module_variable_type: @@ -6070,7 +6080,10 @@ Scheme_Object *scheme_optimize_expr(Scheme_Object *expr, Optimize_Info *info, in case scheme_begin_for_syntax_type: return begin_for_syntax_optimize(expr, info, context); case scheme_case_lambda_sequence_type: - return case_lambda_optimize(expr, info, context); + if (context & OPT_CONTEXT_BOOLEAN) + return scheme_true; + else + return case_lambda_optimize(expr, info, context); case scheme_begin0_sequence_type: return begin0_optimize(expr, info, context); case scheme_apply_values_type: @@ -6943,11 +6956,13 @@ static Scheme_Object *do_optimize_info_lookup(Optimize_Info *info, int pos, int if (single_use) *single_use = SCHEME_TRUEP(SCHEME_VEC_ELS(p)[3]); if (SAME_TYPE(SCHEME_TYPE(n), scheme_compiled_unclosed_procedure_type)) { + if (context & OPT_CONTEXT_BOOLEAN) return scheme_true; if (!closure_offset) break; else *closure_offset = delta; } else if (SAME_TYPE(SCHEME_TYPE(n), scheme_case_lambda_sequence_type)) { + if (context & OPT_CONTEXT_BOOLEAN) return scheme_true; if (!closure_offset) break; else diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index a53bd53a61..4c80ac13a0 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "6.0.1.10" +#define MZSCHEME_VERSION "6.0.1.11" #define MZSCHEME_VERSION_X 6 #define MZSCHEME_VERSION_Y 0 #define MZSCHEME_VERSION_Z 1 -#define MZSCHEME_VERSION_W 10 +#define MZSCHEME_VERSION_W 11 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)