From aede5c4bb805f668c03f068b708b285ca310f53e Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 7 Feb 2021 19:19:15 -0800 Subject: 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). --- share/txr/stdlib/optimize.tl | 8 ++++++++ 1 file changed, 8 insertions(+) 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])) -- cgit v1.2.3