]> git.eshelyaron.com Git - emacs.git/commitdiff
Negate only values while constraining variables (bug#45376)
authorAndrea Corallo <akrl@sdf.org>
Wed, 23 Dec 2020 14:51:55 +0000 (15:51 +0100)
committerAndrea Corallo <akrl@sdf.org>
Wed, 23 Dec 2020 15:17:58 +0000 (16:17 +0100)
* lisp/emacs-lisp/comp-cstr.el (comp-cstr-value-negation): New
function.
* lisp/emacs-lisp/comp.el (comp-fwprop-insn): Use
`comp-cstr-value-negation'.
* test/src/comp-test-funcs.el (comp-test-45376-1-f): Rename.
(comp-test-45376-2-f): New funcion.
* test/src/comp-tests.el (bug-45376-1): Rename test.
(bug-45376-2): Add test.

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

index 92c981f5acf6b13a7d4495929b6f4925986055db..8b5639c8a4dd314fa60ff36ae6a6cac5e496e8ad 100644 (file)
@@ -701,6 +701,20 @@ DST is returned."
           (neg dst) (not (neg src)))
     dst))
 
+(defun comp-cstr-value-negation (dst src)
+  "Negate values in SRC setting the result in DST.
+DST is returned."
+  (with-comp-cstr-accessors
+    (if (or (valset src) (range src))
+        (setf (typeset dst) ()
+              (valset dst) (valset src)
+              (range dst) (range src)
+              (neg dst) (not (neg src)))
+      (setf (typeset dst) (typeset src)
+            (valset dst) ()
+            (range dst) ()))
+    dst))
+
 (defun comp-cstr-negation-make (src)
   "Negate SRC and return a new constraint."
   (comp-cstr-negation (make-comp-cstr) src))
index 485e5dc6ad2c77445364cbf6ee0ea9a8e42cffa5..6ed50dc01224b1502c417d118a78ea5fd4a72775 100644 (file)
@@ -2534,7 +2534,7 @@ Fold the call in case."
        (not
         ;; Prevent double negation!
         (unless (comp-cstr-neg (car operands))
-          (comp-cstr-negation lval (car operands))))))
+          (comp-cstr-value-negation lval (car operands))))))
     (`(setimm ,lval ,v)
      (setf (comp-mvar-value lval) v))
     (`(phi ,lval . ,rest)
index d6bcfca2d944e1fe3bf466531ef98e2877508f1a..7731e6547b172849ddd541da930f7fe9b4f0bb49 100644 (file)
        (setq args (cons (substring arg start pos) args))))
     args))
 
-(defun comp-test-45376-f ()
+(defun comp-test-45376-1-f ()
   ;; Reduced from `eshell-ls-find-column-lengths'.
   (let* (res
         (len 2)
            i (1+ i)))
     res))
 
+(defun comp-test-45376-2-f ()
+  ;; Also reduced from `eshell-ls-find-column-lengths'.
+  (let* ((x 1)
+        res)
+    (while x
+      (let* ((y 4)
+            (i 0))
+       (while (> y 0)
+         (when (= i x)
+           (setq i 0))
+         (setf res (cons i res))
+         (setq y (1- y)
+               i (1+ i)))
+       (if (>= x 3)
+           (setq x nil)
+         (setq x (1+ x)))))
+    res))
+
 \f
 ;;;;;;;;;;;;;;;;;;;;
 ;; Tromey's tests ;;
index 5f2d702fca0e4cbedc072b3f1591a9b12c317fb0..e0d4bf8df5ed2b481474b207b912ce36702e0c4e 100644 (file)
@@ -409,9 +409,13 @@ https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html."
   "Broken call args assumptions lead to infinite loop."
   (should (equal (comp-test-assume-in-loop-1-f "cd") '("cd"))))
 
-(comp-deftest bug-45376 ()
+(comp-deftest bug-45376-1 ()
   "<https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-12/msg01883.html>"
-  (should (equal (comp-test-45376-f) '(1 0))))
+  (should (equal (comp-test-45376-1-f) '(1 0))))
+
+(comp-deftest bug-45376-2 ()
+  "<https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-12/msg01883.html>"
+  (should (equal (comp-test-45376-2-f) '(0 2 1 0 1 0 1 0 0 0 0 0))))
 
 (defvar comp-test-primitive-advice)
 (comp-deftest primitive-advice ()