summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-01-26 20:06:15 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-01-26 20:06:15 -0800
commit89e094a72f05cbd4d3c5c40f89de13593b7f8e05 (patch)
tree41171f24d6282dce42a5072cb48750c1493d8c2a
parentadf81861f9926512dce338b0d1140d73baf2da5a (diff)
downloadtxr-89e094a72f05cbd4d3c5c40f89de13593b7f8e05.tar.gz
txr-89e094a72f05cbd4d3c5c40f89de13593b7f8e05.tar.bz2
txr-89e094a72f05cbd4d3c5c40f89de13593b7f8e05.zip
optimizer: thread ifq instructions also.
* share/txr/stdlib/optimize.tl (basic-blocks thread-jumps): If an (ifq RX RY label-X) instruction branches to an (ifq RX RY label-Y) instruction, replace it with that instruction. Moreover, if (if RX RY label-X) jumps to a (jmp label-Y) instruction, also replace it with (if RX RY label-Y).
-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 5cd05095..9cb6ab85 100644
--- a/share/txr/stdlib/optimize.tl
+++ b/share/txr/stdlib/optimize.tl
@@ -60,6 +60,15 @@
((@(op eq jlabel) (jmp @(require @jjlabel (neq jjlabel jlabel))) . @nil)
^((if ,reg ,jjlabel) ,*rest))
(@jelse insns))))
+ (((ifq @reg @creg @jlabel) . @rest)
+ (let ((jinsns [bb.hash jlabel]))
+ (match-case jinsns
+ ((@(op eq jlabel) (ifq @(op eq reg) @(op eq creg)
+ @(require @jjlabel (neq jjlabel jlabel))) . @nil)
+ ^((ifq ,reg ,creg ,jjlabel) ,*rest))
+ ((@(op eq jlabel) (jmp @(require @jjlabel (neq jjlabel jlabel))) . @nil)
+ ^((ifq ,reg ,creg ,jjlabel) ,*rest))
+ (@jelse insns))))
(@else insns)))
code))))