diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-01-26 20:06:15 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-01-26 20:06:15 -0800 |
commit | 0441727291e0785ea43db24312fbacf330a24834 (patch) | |
tree | 41171f24d6282dce42a5072cb48750c1493d8c2a | |
parent | d3dccedf7d7ad9f7108bdc08df9901d607e5f25a (diff) | |
download | txr-0441727291e0785ea43db24312fbacf330a24834.tar.gz txr-0441727291e0785ea43db24312fbacf330a24834.tar.bz2 txr-0441727291e0785ea43db24312fbacf330a24834.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.tl | 9 |
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)))) |