summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-02-07 19:19:15 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-02-07 19:19:15 -0800
commitaede5c4bb805f668c03f068b708b285ca310f53e (patch)
treecfa30b056ad962d7423c013d8484185cff07eab5
parent27d990d4c7e280ffd140a66925bbb5f1e3af4a47 (diff)
downloadtxr-aede5c4bb805f668c03f068b708b285ca310f53e.tar.gz
txr-aede5c4bb805f668c03f068b708b285ca310f53e.tar.bz2
txr-aede5c4bb805f668c03f068b708b285ca310f53e.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.tl8
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]))