summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stdlib/compiler.tl3
-rw-r--r--stdlib/optimize.tl33
2 files changed, 31 insertions, 5 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index 19dbf260..0d8e1de2 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -1622,7 +1622,8 @@
bb.(elim-dead-code))
(when (>= olev 5)
bb.(calc-liveness)
- bb.(peephole))
+ bb.(peephole)
+ bb.(elim-dead-code))
(cond
((>= olev 6)
bb.(merge-jump-thunks)
diff --git a/stdlib/optimize.tl b/stdlib/optimize.tl
index bf5dfdaa..a947c715 100644
--- a/stdlib/optimize.tl
+++ b/stdlib/optimize.tl
@@ -486,6 +486,16 @@
(each ((bl bb.list))
(set bl.insns bb.(thread-jumps-block bl.insns))))
+(defmeth basic-blocks check-bypass-empty (bb bl nx)
+ (unless (cdr bl.insns)
+ (each ((pb bl.rlinks))
+ (if (eq pb.next bl)
+ (set pb.next nx))
+ (upd pb.links (subst bl nx))
+ (upd pb.insns (mapcar [iffi consp (op subst bl.label nx.label)]))
+ (push pb nx.rlinks))
+ bl))
+
(defmeth basic-blocks elim-next-jump (bb bl nx)
(let* ((tail (last bl.insns))
(linsn (car tail)))
@@ -523,10 +533,25 @@
(for ((bl bb.root)) (bl) ((set bl bl.next))
(visit bl))
(visit bb.root))
- (set bb.list [keep-if visited bb.list])
- (each ((bl bb.list)
- (nx (cdr bb.list)))
- bb.(elim-next-jump bl nx)))
+ (upd bb.list (keep-if visited))
+ (let (flg)
+ (each ((bl bb.list)
+ (nx (cdr bb.list)))
+ (when bb.(check-bypass-empty bl nx)
+ (set flg t)
+ (del [visited bl])))
+ (if flg
+ (upd bb.list (keep-if visited))))
+ (while
+ (let (rep)
+ (each ((bl bb.list)
+ (nx (cdr bb.list)))
+ bb.(elim-next-jump bl nx)
+ (when bb.(check-bypass-empty bl nx)
+ (set rep t)
+ (del [visited bl])))
+ (if rep
+ (upd bb.list (keep-if visited))))))
bb.(join-blocks))
(defmeth basic-blocks merge-jump-thunks (bb)