optimizer: treat known procedure bindings, etc., as #t for if

Closes PR 14526
This commit is contained in:
Matthew Flatt 2014-05-27 08:59:03 +01:00
parent 5ad11c85e6
commit ec96592702
3 changed files with 51 additions and 6 deletions

View File

@ -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)])

View File

@ -6005,6 +6005,9 @@ 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:
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);
@ -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:
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,6 +6080,9 @@ 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:
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);
@ -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

View File

@ -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)