diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-01-30 06:36:39 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-01-30 06:36:39 -0800 |
commit | 3330b1593c5d591aecbacfdae5a06ade661d9fd6 (patch) | |
tree | fa066df08b1b5f4736236c9cf4ea8796f6946146 | |
parent | 79fef71c0f043aa7eba5251fe2a76d33bd4c4359 (diff) | |
download | txr-3330b1593c5d591aecbacfdae5a06ade661d9fd6.tar.gz txr-3330b1593c5d591aecbacfdae5a06ade661d9fd6.tar.bz2 txr-3330b1593c5d591aecbacfdae5a06ade661d9fd6.zip |
caseql: generate better code.
* eval.c (me_case): Replace a code generation pattern of the
(if (and x y) z) with the equivalent (and x y z). The
motivation behind this is that it effectively coaxes a
jump-threading optimization out of our simplistic compiler.
The failure cases out of a single *and* all jump past the
entire code block, whereas with the cascaded if + and we get
a double test of the same failed value threading through two
branches.
-rw-r--r-- | eval.c | 16 |
1 files changed, 7 insertions, 9 deletions
@@ -4027,15 +4027,13 @@ static val me_case(val form, val menv) return list(let_s, list(list(tformsym, testform, nao), list(swres, uniq, nao), nao), - list(if_s, - list(and_s, - list(intern(if3(all_keys_integer, - lit("integerp"), lit("chrp")), - user_package), - tformsym, nao), - list(intern(lit("<="), user_package), - minkey, tformsym, maxkey, nao), - nao), + list(and_s, + list(intern(if3(all_keys_integer, + lit("integerp"), lit("chrp")), + user_package), + tformsym, nao), + list(intern(lit("<="), user_package), + minkey, tformsym, maxkey, nao), list(set_s, swres, list(switch_s, |