summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stdlib/optimize.tl18
1 files changed, 15 insertions, 3 deletions
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl
index 04df66e8..518264f5 100644
--- a/stdlib/optimize.tl
+++ b/stdlib/optimize.tl
@@ -444,6 +444,15 @@
bl.next nil
bl.links (list [bb.hash jlabel]))
^((jmp ,jlabel)))
+ ;; wasteful move of previously tested value
+ (@(require ((ifq (t @reg) (d @n) @nil) . @nil)
+ (let* ((nxbl bl.next)
+ (nxinsns nxbl.insns))
+ (if (null (cdr nxbl.rlinks))
+ (if-match (@label (mov (t @reg) (d @n)) . @rest) nxinsns
+ (set nxbl.insns ^(,label ,*rest)
+ bb.recalc t)))))
+ insns)
(((jmp @jlabel) . @nil)
(let* ((jinsns (cdr [bb.hash jlabel].insns))
(oinsns (match-case jinsns
@@ -497,9 +506,12 @@
(defmeth basic-blocks elim-next-jump (bb bl nx)
(let* ((tail (last bl.insns))
(linsn (car tail)))
- (when-match (jmp @jlabel) linsn
- (when (eql nx.label jlabel)
- (set bl.insns (butlast bl.insns))))))
+ (match-case linsn
+ (@(or (jmp @jlabel)
+ (if @nil @jlabel)
+ (@(or ifq ifql) @nil @nil @jlabel))
+ (when (eql nx.label jlabel)
+ (set bl.insns (butlast bl.insns)))))))
(defmeth basic-blocks join-blocks (bb)
(labels ((joinbl (list)