optimizer: transform (if v x v) to (if v x #f)

This commit is contained in:
Gustavo Massaccesi 2014-07-07 19:55:13 -03:00 committed by Matthew Flatt
parent 55c040cf3a
commit 82ffd40592
2 changed files with 38 additions and 7 deletions

View File

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

View File

@ -3620,17 +3620,24 @@ static Scheme_Object *optimize_branch(Scheme_Object *o, Optimize_Info *info, int
tb = b->tbranch;
fb = b->fbranch;
/* Convert (if <id> expr <id>) to (if <id> 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 <expr> #t #f) to <expr> */
if (SAME_OBJ(tb, scheme_true) && SAME_OBJ(fb, scheme_false))
return scheme_optimize_expr(t, info, context);
/* Convert (if <id> <id> expr) to (if <id> #t expr) */
/* For test position, convert (if <id> <id> expr) to (if <id> #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 <expr> #t #f) to <expr> */
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);