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
commitf3da4f650dd867041b974cc2d9ecdde6d82ba1d2 (patch)
treecfa30b056ad962d7423c013d8484185cff07eab5
parentf0ac10cf207f5a9b62b19a2bca186bc56a565d65 (diff)
downloadtxr-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.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]))