diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-03-25 07:26:09 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-03-25 07:26:09 -0700 |
commit | cf1ecfc1cb104ce29174c748e7a8567cd93ac8bb (patch) | |
tree | e3ec7d67d4c584e250192bd4093b39db7505507d | |
parent | 7fe16da96f86fe39f3524c91226916975d112c9f (diff) | |
download | txr-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.tl | 9 |
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)) |