optimizer: (cdr <list?>) is a <list?>

In case it is not an error, the result is a list.
This commit is contained in:
Gustavo Massaccesi 2018-11-28 19:28:43 -03:00
parent 88b165314a
commit ff5f2ae69a
2 changed files with 20 additions and 1 deletions

View File

@ -2535,6 +2535,25 @@
(test-reduce 'k:list-pair? '(cdr (list 1)) #f)
)
(test-comp '(lambda (z)
(when (and (list? z) (pair? z))
(list? (cdr z))))
'(lambda (z)
(when (and (list? z) (pair? z))
#t)))
(test-comp '(lambda (z)
(when (list? z)
(list? (unsafe-cdr z))))
'(lambda (z)
(when (list? z)
#t)))
(test-comp '(lambda (z)
(when (list? z)
(list? (cdr z))))
'(lambda (z)
(when (list? z)
(begin (cdr z) #t))))
(let ([test-bin
(lambda (bin-name)
(test-comp `(lambda (z)

View File

@ -3441,7 +3441,7 @@ static Scheme_Object *do_expr_implies_predicate(Scheme_Object *expr, Optimize_In
|| SAME_OBJ(app->rator, scheme_unsafe_cdr_proc)) {
Scheme_Object *p;
p = do_expr_implies_predicate(app->rand, info, NULL, fuel-1, ignore_vars);
if (SAME_OBJ(p, scheme_list_pair_p_proc))
if (predicate_implies(p, scheme_list_p_proc))
return scheme_list_p_proc;
}