summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--share/txr/stdlib/optimize.tl20
1 files changed, 13 insertions, 7 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl
index cf8a42b0..31702cb4 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -425,13 +425,19 @@
(not (memqual reg bb.lt-dregs)))
^((jmp ,jlabel)))
(((jmp @jlabel) . @rest)
- (let ((jinsns (cdr [bb.hash jlabel].insns)))
- (match-case jinsns
- (((jend @nil) . @nil)
- ^(,(car jinsns) ,*rest))
- ((@nil (jend @nil) . @nil)
- ^(,(car jinsns) ,(cadr jinsns) ,*rest))
- (@else insns))))
+ (let* ((jinsns (cdr [bb.hash jlabel].insns))
+ (oinsns (match-case jinsns
+ (((jend @nil) . @nil)
+ ^(,(car jinsns) ,*rest))
+ ((@nil (jend @nil) . @nil)
+ ^(,(car jinsns) ,(cadr jinsns) ,*rest))
+ (@else insns))))
+ (when (neq insns oinsns)
+ (pushnew bl bb.rescan)
+ (set bb.recalc t
+ bl.next nil
+ bl.links nil))
+ oinsns))
(@else insns))))
(defmeth basic-blocks peephole (bb)