[prev in list] [next in list] [prev in thread] [next in thread] 

List:       sbcl-commits
Subject:    [Sbcl-commits] master: ir1-transform-type-predicate: don't transform to some intersections.
From:       stassats via Sbcl-commits <sbcl-commits () lists ! sourceforge ! net>
Date:       2023-06-30 11:24:16
Message-ID: 1688124257.4265.26284 () sfp-scm-3 ! v30 ! lw ! sourceforge ! com
[Download RAW message or body]

The branch "master" has been updated in SBCL:
       via  a105c51e016924e7de1b7608b528f84daf897e02 (commit)
      from  3e9848156ec8665008eb603d1988f911f4df6691 (commit)

- Log -----------------------------------------------------------------
commit a105c51e016924e7de1b7608b528f84daf897e02
Author: Stas Boukarev <stassats@gmail.com>
Date:   Fri Jun 30 13:47:09 2023 +0300

    ir1-transform-type-predicate: don't transform to some intersections.
    
    Some subtypes are more expensive to check and some end up being
    transformed in an infinite loop.
    
    Fixes lp#2025405
---
 src/compiler/arm64/type-vops.lisp |  7 ++++---
 src/compiler/typetran.lisp        | 10 +++++++++-
 2 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/compiler/arm64/type-vops.lisp b/src/compiler/arm64/type-vops.lisp
index 9db962b33..b1db418e9 100644
--- a/src/compiler/arm64/type-vops.lisp
+++ b/src/compiler/arm64/type-vops.lisp
@@ -38,11 +38,12 @@
   (cond ((= immediate single-float-widetag)
          (when (types-equal-or-intersect (tn-ref-type value-tn-ref)
                                          (specifier-type 'single-float))
-           (inst cmp (32-bit-reg value) single-float-widetag)))
+           (inst cmp (32-bit-reg value) single-float-widetag)
+           (inst b :eq (if not-p drop-through target))))
         (t
          (inst mov temp immediate)
-         (inst cmp temp (extend value :uxtb))))
-  (inst b :eq (if not-p drop-through target))
+         (inst cmp temp (extend value :uxtb))
+         (inst b :eq (if not-p drop-through target))))
   (%test-headers value temp target not-p nil headers
                  :drop-through drop-through
                  :value-tn-ref value-tn-ref
diff --git a/src/compiler/typetran.lisp b/src/compiler/typetran.lisp
index c39104002..eb81a34df 100644
--- a/src/compiler/typetran.lisp
+++ b/src/compiler/typetran.lisp
@@ -120,8 +120,16 @@
                      (current (combination-fun-source-name node)))
                  (when (and new-predicate
                             (neq new-predicate current)
+                            ;; Some subtypes are more expensive to check
                             (not (and (eq current 'listp)
-                                      (eq new-predicate 'consp))))
+                                      (eq new-predicate 'consp)))
+                            (not (and (eq current 'functionp)
+                                      (eq new-predicate 'compiled-function-p)))
+                            (not (eq current 'characterp))
+                            (not (eq new-predicate #+64-bit 'signed-byte-64-p
+                                                   #-64-bit 'signed-byte-32-p))
+                            (not (eq new-predicate #+64-bit 'unsigned-byte-64-p
+                                                   #-64-bit 'unsigned-byte-32-p)))
                    `(,new-predicate object))))
               ;; (typep (the float x) 'double-float) =>
               ;; (typep x 'single-float)

-----------------------------------------------------------------------


hooks/post-receive
-- 
SBCL


_______________________________________________
Sbcl-commits mailing list
Sbcl-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sbcl-commits
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic