From 6528f13b22941bb46bff3644f15a596187046b91 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 7 Jun 2016 19:16:31 -0400 Subject: Remove redundant pure expressions from the top level. --- parse.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'parse.c') diff --git a/parse.c b/parse.c index 2c02c83..c65d61f 100644 --- a/parse.c +++ b/parse.c @@ -1619,6 +1619,33 @@ static struct expr *parse_expr(struct parser_state *state) { return expr; } +/** + * Apply top-level optimizations. + */ +static struct expr *optimize_whole_expr(const struct parser_state *state, struct expr *expr) { + int optlevel = state->cmdline->optlevel; + + if (optlevel >= 2) { + while ((expr->eval == eval_and || expr->eval == eval_or || expr->eval == eval_comma) + && expr->rhs->pure) { + debug_opt(state, "-O2: top-level purity: %e <==> %e\n", expr, expr->lhs); + + struct expr *old = expr; + expr = old->lhs; + old->lhs = NULL; + free_expr(old); + } + } + + if (optlevel >= 3 && expr->pure && expr != &expr_false) { + debug_opt(state, "-O3: top-level purity: %e <==> %e\n", expr, &expr_false); + free_expr(expr); + expr = &expr_false; + } + + return expr; +} + /** * Dump the parsed form of the command line, for debugging. */ @@ -1738,11 +1765,7 @@ struct cmdline *parse_cmdline(int argc, char *argv[]) { } } - if (cmdline->optlevel >= 3 && cmdline->expr->pure && cmdline->expr != &expr_false) { - debug_opt(&state, "-O3: top-level purity: %e <==> %e\n", cmdline->expr, &expr_false); - free_expr(cmdline->expr); - cmdline->expr = &expr_false; - } + cmdline->expr = optimize_whole_expr(&state, cmdline->expr); if (cmdline->nroots == 0) { if (!cmdline_add_root(cmdline, ".")) { -- cgit v1.2.3