More associativity-based constant-folding
authorPaul Khuong <pvk@pvk.ca>
Fri, 7 Jun 2013 23:06:32 +0000 (19:06 -0400)
committerPaul Khuong <pvk@pvk.ca>
Sat, 8 Jun 2013 06:29:29 +0000 (02:29 -0400)
 Detect patterns like (+ (- x k1) k2) and (* (/ x k1) k2).

src/compiler/srctran.lisp

index c1aa106..d408fa3 100644 (file)
                   (splice-fun-args x ',folded 2)
                   `(lambda (x y z)
                      (declare (ignore y z))
-                     (,',operator x ',(,folded y (lvar-value z))))))))
+                     ;; (operator (folded x y) z)
+                     ;; == (operator x (folded z y))
+                     (,',operator x ',(,folded (lvar-value z) y)))))))
   (def logand)
   (def logior)
   (def logxor)
   (def logtest :folded logand)
   (def + :type rational)
-  (def * :type rational))
+  (def + :type rational :folded -)
+  (def * :type rational)
+  (def * :type rational :folded /))
 
 (deftransform mask-signed-field ((width x) ((constant-arg unsigned-byte) *))
   "Fold mask-signed-field/mask-signed-field of constant width"