Preserve types when swapping constant arguments and commute LOGTEST
authorPaul Khuong <pvk@pvk.ca>
Wed, 22 May 2013 18:12:17 +0000 (14:12 -0400)
committerPaul Khuong <pvk@pvk.ca>
Wed, 22 May 2013 18:12:17 +0000 (14:12 -0400)
 * Add a transform to ensure any constant argument to LOGTEST is in
   second position.

 * Commutative-arg-swap used to often cause suboptimal code: subsequent
   transforms fire before constraint propagation has tightened types
   back to their original value.  Hack with TRULY-THE for now. A more
   general fix (e.g. by declaring the type of arguments in spliced-in
   lambda expressions) would be even better.

src/compiler/srctran.lisp

index 22d9f48..caed9bf 100644 (file)
   (if (and (constant-lvar-p x)
            (not (constant-lvar-p y)))
       `(,(lvar-fun-name (basic-combination-fun node))
-        y
+        (truly-the ,(lvar-type y) y)
         ,(lvar-value x))
       (give-up-ir1-transform)))
 
-(dolist (x '(= char= + * logior logand logxor))
+(dolist (x '(= char= + * logior logand logxor logtest))
   (%deftransform x '(function * *) #'commutative-arg-swap
                  "place constant arg last"))