emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 2a17925: Cease attempts to const-propagate through setq


From: Mattias Engdegård
Subject: master 2a17925: Cease attempts to const-propagate through setq
Date: Thu, 5 Aug 2021 09:33:12 -0400 (EDT)

branch: master
commit 2a17925aab75735b40f9b0ccaab4c46f6b9a9a32
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Cease attempts to const-propagate through setq
    
    The current method of propagating constants through setq was unsound
    because it relied on each setq form only being traversed at most once
    during optimisation, which isn't necessarily true in general; it could
    be made to miscompile code in rare cases.
    
    Since it was only used in limited circumstances, disabling this
    optimisation doesn't cost us much.
    
    * lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker):
    Don't update the known value when traversing `setq`.
    * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases):
    Add test case.
---
 lisp/emacs-lisp/byte-opt.el            | 12 +++---------
 test/lisp/emacs-lisp/bytecomp-tests.el |  9 +++++++++
 2 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 96072ea..6475f69 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -601,15 +601,9 @@ Same format as `byte-optimize--lexvars', with shared 
structure and contents.")
                   (lexvar (assq var byte-optimize--lexvars))
                   (value (byte-optimize-form expr nil)))
              (when lexvar
-               ;; Set a new value or inhibit further substitution.
-               (setcdr (cdr lexvar)
-                       (and
-                        ;; Inhibit if bound outside conditional code.
-                        (not (assq var byte-optimize--vars-outside-condition))
-                        ;; The new value must be substitutable.
-                        (byte-optimize--substitutable-p value)
-                        (list value)))
-               (setcar (cdr lexvar) t))   ; Mark variable to be kept.
+               (setcar (cdr lexvar) t)    ; Mark variable to be kept.
+               (setcdr (cdr lexvar) nil)) ; Inhibit further substitution.
+
              (push var var-expr-list)
              (push value var-expr-list))
            (setq args (cddr args)))
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index 5aa853c..80003c2 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -432,6 +432,15 @@
     (let ((x 2))
       (list (or (bytecomp-test-identity 'a) (setq x 3)) x))
 
+    (mapcar (lambda (b)
+              (let ((a nil))
+                (+ 0
+                   (progn
+                     (setq a b)
+                     (setq b 1)
+                     a))))
+            '(10))
+
     (let* ((x 1)
            (y (condition-case x
                   (/ 1 0)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]