diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-02-07 19:19:15 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-02-07 19:19:15 -0800 |
commit | f3da4f650dd867041b974cc2d9ecdde6d82ba1d2 (patch) | |
tree | cfa30b056ad962d7423c013d8484185cff07eab5 | |
parent | f0ac10cf207f5a9b62b19a2bca186bc56a565d65 (diff) | |
download | txr-f3da4f650dd867041b974cc2d9ecdde6d82ba1d2.tar.gz txr-f3da4f650dd867041b974cc2d9ecdde6d82ba1d2.tar.bz2 txr-f3da4f650dd867041b974cc2d9ecdde6d82ba1d2.zip |
compiler: jump skid optimization.
If an (if reg label0) target branches due to reg being nil,
and the target of the branch is another branch instrution
of the form (ifq reg nil label1), we know that that branch is
not taken: the code following that instruction is executed.
THus can jump right to that code.
(if reg label0) (if reg xlabel)
... ...
label0 label0
(ifq reg nil label1) --> (ifq reg nil label1)
... xlabel
...
* share/txr/stdlib/optimize.tl (basic-blocks peephole): New
sub-case under (jmp @reg @jlabel).
-rw-r--r-- | share/txr/stdlib/optimize.tl | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/share/txr/stdlib/optimize.tl b/share/txr/stdlib/optimize.tl index 011b7bf0..537d064c 100644 --- a/share/txr/stdlib/optimize.tl +++ b/share/txr/stdlib/optimize.tl @@ -97,6 +97,14 @@ ((@jlabel (jmp @(and @jjlabel @(not @jlabel))) . @nil) ^((if ,reg ,jjlabel) ,*rest)) + ((@jlabel + (ifq @reg nil @jjlabel) . @jrest) + (let ((xlabel (if jrest + bb.(cut-block jlabel jrest jinsns) + bb.(next-block jlabel)))) + (if xlabel + ^((if ,reg ,xlabel) ,*rest) + insns))) (@jelse insns)))) (((ifq @reg @creg @jlabel) . @rest) (let ((jinsns [bb.hash jlabel])) |