From 462589f69859354a9c623cad9015821e769beecb Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Fri, 21 Jul 2017 19:09:10 -0400 Subject: Fix a couple terrible optimizer bugs Just because an expression is always true or false, doesn't mean we can execute it more often than it otherwise would be, unless it's also pure. But that's equivalent to being identically -true/-false, so just check that. --- parse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'parse.c') diff --git a/parse.c b/parse.c index d4e945c..61c17a5 100644 --- a/parse.c +++ b/parse.c @@ -2568,7 +2568,7 @@ static struct expr *new_and_expr(const struct parser_state *state, struct expr * debug_opt(state, "-O1: short-circuit: (%s %e %e) <==> %e\n", argv[0], lhs, rhs, lhs); free_expr(rhs); return lhs; - } else if (optlevel >= 2 && rhs->always_false && lhs->pure) { + } else if (optlevel >= 2 && lhs->pure && rhs == &expr_false) { debug_opt(state, "-O2: purity: (%s %e %e) <==> %e\n", argv[0], lhs, rhs, rhs); free_expr(lhs); return rhs; @@ -2664,7 +2664,7 @@ static struct expr *new_or_expr(const struct parser_state *state, struct expr *l } else if (rhs == &expr_false) { debug_opt(state, "-O1: disjunctive syllogism: (%s %e %e) <==> %e\n", argv[0], lhs, rhs, lhs); return lhs; - } else if (optlevel >= 2 && rhs->always_true && lhs->pure) { + } else if (optlevel >= 2 && lhs->pure && rhs == &expr_true) { debug_opt(state, "-O2: purity: (%s %e %e) <==> %e\n", argv[0], lhs, rhs, rhs); free_expr(lhs); return rhs; -- cgit v1.2.3