From 50ef3a82956d213b853372f2dae749f7e61d30ca Mon Sep 17 00:00:00 2001 From: Gustavo Massaccesi Date: Tue, 17 Jun 2014 21:56:44 -0300 Subject: [PATCH] optimizer: optimizes the argument of not in a Boolean context This enables more reductions, for example: (not (if x y 2)) => (not (if x y #t)) --- .../racket-test/tests/racket/optimize.rktl | 3 +++ racket/src/racket/src/optimize.c | 12 ++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 2e98e73706..26c003c6b2 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -1335,6 +1335,9 @@ (quote-syntax no!)) ''ok) +(test-comp '(lambda (x) (not (if x #f 2))) + '(lambda (x) (not (if x #f #t)))) + (test-comp '(lambda (x) (if x x #f)) '(lambda (x) x)) (test-comp '(lambda (x) (if (cons 1 x) 78 78)) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 17178702cf..529152b012 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -2724,7 +2724,7 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf if (le) return le; - le = scheme_optimize_expr(app->rator, info, sub_context); + le = scheme_optimize_expr(app->rator, info, 0); app->rator = le; { @@ -2734,9 +2734,13 @@ static Scheme_Object *optimize_application2(Scheme_Object *o, Optimize_Info *inf return le; } - ty = wants_local_type_arguments(app->rator, 0); - if (ty) - sub_context |= (ty << OPT_CONTEXT_TYPE_SHIFT); + if (SAME_PTR(scheme_not_prim, app->rator)){ + sub_context = OPT_CONTEXT_BOOLEAN; + } else { + ty = wants_local_type_arguments(app->rator, 0); + if (ty) + sub_context |= (ty << OPT_CONTEXT_TYPE_SHIFT); + } le = scheme_optimize_expr(app->rand, info, sub_context); app->rand = le;