0.8.21.43: "oops" -- that wasn't an optimization!
authorNikodemus Siivola <nikodemus@random-state.net>
Fri, 15 Apr 2005 16:08:52 +0000 (16:08 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Fri, 15 Apr 2005 16:08:52 +0000 (16:08 +0000)
 * don't transform EQL to EQ if either argument is known to
    be a fixnum, as we have backend magic to deal with that. The
    effect of the previous "improvement" was rather horrible
    for bignums. Still apply the transform if the fixnumness is
    in question.

src/compiler/srctran.lisp
version.lisp-expr

index 4b1f05a..5e76032 100644 (file)
 ;;; -- If both args are characters, convert to CHAR=. This is better than
 ;;;    just converting to EQ, since CHAR= may have special compilation
 ;;;    strategies for non-standard representations, etc.
-;;; -- If either arg is definitely not a number, or a fixnum, then we
+;;; -- If either arg is definitely a fixnum we punt and let the backend
+;;;    deal with it.
+;;; -- If either arg is definitely not a number or a fixnum, then we
 ;;;    can compare with EQ.
 ;;; -- Otherwise, we try to put the arg we know more about second. If X
 ;;;    is constant then we put it second. If X is a subtype of Y, we put
        (y-type (lvar-type y))
        (char-type (specifier-type 'character)))
     (flet ((simple-type-p (type)
-            (csubtypep type (specifier-type '(or fixnum (not number))))))
+             (csubtypep type (specifier-type '(or fixnum (not number)))))
+           (fixnum-type-p (type)
+             (csubtypep type (specifier-type 'fixnum))))
       (cond
-       ((same-leaf-ref-p x y) t)
-       ((not (types-equal-or-intersect x-type y-type))
-        nil)
-       ((and (csubtypep x-type char-type)
-             (csubtypep y-type char-type))
+        ((same-leaf-ref-p x y) t)
+        ((not (types-equal-or-intersect x-type y-type))
+         nil)
+        ((and (csubtypep x-type char-type)
+              (csubtypep y-type char-type))
         '(char= x y))
-       ((or (simple-type-p x-type) (simple-type-p y-type))
-        '(eq x y))
+        ((or (fixnum-type-p x-type) (fixnum-type-p y-type))
+         (give-up-ir1-transform))
+        ((or (simple-type-p x-type) (simple-type-p y-type))
+         '(eq x y))
        ((and (not (constant-lvar-p y))
              (or (constant-lvar-p x)
                  (and (csubtypep x-type y-type)
index 6fbb56f..af26ab4 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.8.21.42"
+"0.8.21.43"