]> git.eshelyaron.com Git - emacs.git/commitdiff
Add 1+ 1- integer range propagation support
authorAndrea Corallo <akrl@sdf.org>
Sun, 27 Dec 2020 20:33:07 +0000 (21:33 +0100)
committerAndrea Corallo <akrl@sdf.org>
Sun, 27 Dec 2020 20:50:34 +0000 (21:50 +0100)
* lisp/emacs-lisp/comp-cstr.el (comp-cstr-one): New special var.
* lisp/emacs-lisp/comp.el (comp-fwprop-call): Propagate integer
ranges on +1 -1.
* test/src/comp-tests.el (comp-tests-type-spec-tests): Add two tests.

lisp/emacs-lisp/comp-cstr.el
lisp/emacs-lisp/comp.el
test/src/comp-tests.el

index 28cffcf0661abee7e334dc4f2a211d637898835b..57d93912d2f05e58b20960385ec864f8eae2dcf7 100644 (file)
@@ -154,6 +154,10 @@ Return them as multiple value."
      collect cstr into positives
    finally return (cl-values positives negatives)))
 
+(defvar comp-cstr-one (make-comp-cstr :typeset ()
+                                      :range '((1 . 1)))
+  "Represent the integer immediate one (1).")
+
 \f
 ;;; Value handling.
 
index 336ed39145d1510c816cc782aa5204ef887a0453..6b06ac5840d5710d6f86fa22322d74049868f5b7 100644 (file)
@@ -2651,7 +2651,9 @@ Fold the call in case."
               (comp-mvar-neg lval) (comp-cstr-neg cstr))))
     (cl-case f
       (+ (comp-cstr-add lval args))
-      (- (comp-cstr-sub lval args)))))
+      (- (comp-cstr-sub lval args))
+      (1+ (comp-cstr-add lval `(,(car args) ,comp-cstr-one)))
+      (1- (comp-cstr-sub lval `(,(car args) ,comp-cstr-one))))))
 
 (defun comp-fwprop-insn (insn)
   "Propagate within INSN."
index 154229ec872526535b55502b927e8040294a454f..d0e482bb5019207fdb871a7a550b4fd7845fe52f 100644 (file)
@@ -1125,7 +1125,19 @@ Return a list of results."
                    (< 1 j 5)
                    (< 1 k 5))
            (+ x y z i j k)))
-       (or null float (integer 12 24)))))
+       (or null float (integer 12 24)))
+
+      ;; 45
+      ((defun comp-tests-ret-type-spec-f (x)
+         (when (<= 1 x 5)
+           (1+ x)))
+       (or null float (integer 2 6)))
+
+      ;;46
+      ((defun comp-tests-ret-type-spec-f (x)
+         (when (<= 1 x 5)
+           (1- x)))
+       (or null float (integer 0 4)))))
 
   (defun comp-tests-define-type-spec-test (number x)
     `(comp-deftest ,(intern (format "ret-type-spec-%d" number)) ()