From 82ffd40592ee8a32c41dae6d3ca423592166271e Mon Sep 17 00:00:00 2001 From: Gustavo Massaccesi Date: Mon, 7 Jul 2014 19:55:13 -0300 Subject: [PATCH] optimizer: transform (if v x v) to (if v x #f) --- .../racket-test/tests/racket/optimize.rktl | 26 ++++++++++++++++++- racket/src/racket/src/optimize.c | 19 +++++++++----- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl index 9e562de543..112a6ef69e 100644 --- a/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl +++ b/pkgs/racket-pkgs/racket-test/tests/racket/optimize.rktl @@ -1361,10 +1361,34 @@ (if r r (something-else))) (a1) (a2))) - '(lambda (x) (if (if (something) #t (something-else)) + '(lambda (x) (if (if (something) #t (something-else)) + (a1) + (a2)))) + +(test-comp '(lambda (x) (if (if x x (something-else)) + (a1) + (a2))) + '(lambda (x) (if (if x #t (something-else)) (a1) (a2)))) +(test-comp '(lambda (x) (if x (something-else) x)) + '(lambda (x) (if x (something-else) #f))) + +(test-comp '(lambda (x) (if (if x #t #f) + (a1) + (a2))) + '(lambda (x) (if x + (a1) + (a2)))) + +(test-comp '(lambda (x) (if (if x x x) + (a1) + (a2))) + '(lambda (x) (if x + (a1) + (a2)))) + (test-comp '(if (let ([z (random)]) null) 1 2) '(if (let ([z (random)]) #t) 1 2)) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index ec2d890598..5c35f3c0c2 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -3620,17 +3620,24 @@ static Scheme_Object *optimize_branch(Scheme_Object *o, Optimize_Info *info, int tb = b->tbranch; fb = b->fbranch; + /* Convert (if expr ) to (if expr #f) */ + if (SAME_TYPE(SCHEME_TYPE(t), scheme_local_type) + && SAME_TYPE(SCHEME_TYPE(fb), scheme_local_type) + && (SCHEME_LOCAL_POS(t) == SCHEME_LOCAL_POS(fb))) { + fb = scheme_false; + } + if (context & OPT_CONTEXT_BOOLEAN) { - /* For test position, convert (if #t #f) to */ - if (SAME_OBJ(tb, scheme_true) && SAME_OBJ(fb, scheme_false)) - return scheme_optimize_expr(t, info, context); - - /* Convert (if expr) to (if #t expr) */ + /* For test position, convert (if expr) to (if #t expr) */ if (SAME_TYPE(SCHEME_TYPE(t), scheme_local_type) && SAME_TYPE(SCHEME_TYPE(tb), scheme_local_type) && (SCHEME_LOCAL_POS(t) == SCHEME_LOCAL_POS(tb))) { - b->tbranch = tb = scheme_true; + tb = scheme_true; } + + /* Convert (if #t #f) to */ + if (SAME_OBJ(tb, scheme_true) && SAME_OBJ(fb, scheme_false)) + return scheme_optimize_expr(t, info, context); } optimize_info_seq_init(info, &info_seq);