~ chicken-core (chicken-5) 44348a9f9ab8bd3312e89e751a6307fe653e33f7
commit 44348a9f9ab8bd3312e89e751a6307fe653e33f7 Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Jun 27 10:33:54 2011 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Jun 27 10:33:54 2011 +0200 drop else-branch when conditional test is non-boolean (as suggested by Joerg Wittenberger) diff --git a/scrutinizer.scm b/scrutinizer.scm index bf0ed22d..36e3b566 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -100,6 +100,7 @@ (let ((blist '()) (aliased '()) (noreturn #f) + (dropped-branches 0) (safe-calls 0)) (define (constant-result lit) @@ -625,11 +626,18 @@ ((##core#variable) (variable-result (first params) e loc flow)) ((if) (let* ((tags (cons (tag) (tag))) - (rt (single "in conditional" (walk (first subs) e loc #f #f flow tags) loc)) + (tst (first subs)) + (rt (single "in conditional" (walk tst e loc #f #f flow tags) loc)) (c (second subs)) (a (third subs)) (nor0 noreturn)) - (always-true rt loc n) + (when (and (always-true rt loc n) specialize) + (set! dropped-branches (+ dropped-branches 1)) + (copy-node! + (build-node-graph + `(let ((,(gensym) ,tst)) + ,c)) + n)) (set! noreturn #f) (let* ((r1 (walk c e loc dest tail (cons (car tags) flow) #f)) (nor1 noreturn)) @@ -904,6 +912,8 @@ specialization-statistics)) (when (positive? safe-calls) (debugging 'x "safe calls" safe-calls)) ;XXX + (when (positive? dropped-branches) + (debugging 'x "dropped branches" dropped-branches)) ;XXX rn))) (define (compatible-types? t1 t2)Trap