]> git.eshelyaron.com Git - emacs.git/commitdiff
* Introduce `comp-fwprop-max-insns-scan' as heuristic threshold
authorAndrea Corallo <akrl@sdf.org>
Thu, 14 Jan 2021 22:54:52 +0000 (23:54 +0100)
committerAndrea Corallo <akrl@sdf.org>
Sun, 17 Jan 2021 21:33:02 +0000 (22:33 +0100)
* lisp/emacs-lisp/comp.el (comp-fwprop-max-insns-scan): New
constant.
(comp-fwprop*): Give-up when `comp-fwprop-max-insns-scan' is
exceeded.

lisp/emacs-lisp/comp.el

index 238d86f7d515c9336df25f74e2643aefa2b86d3c..d4faa207b5dd8eb3699e08333e572bd7559ce7f8 100644 (file)
@@ -2926,6 +2926,11 @@ Return t when one or more block was removed, nil otherwise."
 ;; This is also responsible for removing function calls to pure functions if
 ;; possible.
 
+(defconst comp-fwprop-max-insns-scan 4500
+  ;; Choosen as ~ the greatest required value for full convergence
+  ;; native compiling all Emacs codebase.
+  "Max number of scanned insn before giving-up.")
+
 (defun comp-copy-insn (insn)
   "Deep copy INSN."
   ;; Adapted from `copy-tree'.
@@ -3086,7 +3091,9 @@ Fold the call in case."
 (defun comp-fwprop* ()
   "Propagate for set* and phi operands.
 Return t if something was changed."
-  (cl-loop with modified = nil
+  (cl-loop named outer
+           with modified = nil
+           with i = 0
            for b being each hash-value of (comp-func-blocks comp-func)
            do (cl-loop
                with comp-block = b
@@ -3094,9 +3101,13 @@ Return t if something was changed."
                for orig-insn = (unless modified
                                  ;; Save consing after 1th change.
                                  (comp-copy-insn insn))
-               do (comp-fwprop-insn insn)
+               do
+               (comp-fwprop-insn insn)
+               (cl-incf i)
                when (and (null modified) (not (equal insn orig-insn)))
                  do (setf modified t))
+               when (> i comp-fwprop-max-insns-scan)
+                 do (cl-return-from outer nil)
            finally return modified))
 
 (defun comp-rewrite-non-locals ()