summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-03-25 07:26:09 -0700
committerKaz Kylheku <kaz@kylheku.com>2021-03-25 07:26:09 -0700
commitcf1ecfc1cb104ce29174c748e7a8567cd93ac8bb (patch)
treee3ec7d67d4c584e250192bd4093b39db7505507d
parent7fe16da96f86fe39f3524c91226916975d112c9f (diff)
downloadtxr-cf1ecfc1cb104ce29174c748e7a8567cd93ac8bb.tar.gz
txr-cf1ecfc1cb104ce29174c748e7a8567cd93ac8bb.tar.bz2
txr-cf1ecfc1cb104ce29174c748e7a8567cd93ac8bb.zip
compiler: new jump skid optimization case.
ifq tN t0 label0 ifq tN t0 label1 ... ... label0: --> ... if tN label2 label1: label1: ... ... * share/txr/stdlib/optimize.tl (basic-blocks thread-jumps-block): Implement case. There are there are 56 "hits" for this in the standard library.
-rw-r--r--share/txr/stdlib/optimize.tl9
1 files changed, 9 insertions, 0 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl
index 31702cb4..83abaa1e 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -318,6 +318,15 @@
(ifq @reg @creg
@(and @jjlabel @(not @jlabel))) . @nil)
^(ifq ,reg ,creg ,jjlabel))
+ ((@(require @jlabel (equal creg '(t 0)))
+ (if @reg
+ @(and @jjlabel @(not @jlabel))) . @jrest)
+ (let ((xbl (if jrest
+ bb.(cut-block [bb.hash jlabel] jrest jinsns)
+ bb.(next-block [bb.hash jlabel]))))
+ (if xbl
+ ^(ifq ,reg ,creg ,xbl.label)
+ insn)))
((@jlabel
(jmp @(and @jjlabel @(not @jlabel))) . @nil)
^(ifq ,reg ,creg ,jjlabel))