diff options
author | Tavian Barnes <tavianator@tavianator.com> | 2019-03-21 21:24:24 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@tavianator.com> | 2019-03-21 21:24:24 -0400 |
commit | 4216dbac10887476feef287854e9e4037f2d1a59 (patch) | |
tree | 2f447b8cd4490f814b3a580e673aa88bdd5d9b4e | |
parent | 1fbc0fab56f1a1f620d9697e8592f8f1cd023389 (diff) | |
download | bfs-4216dbac10887476feef287854e9e4037f2d1a59.tar.xz |
opt: Optimize redundant comma expressions
-rw-r--r-- | opt.c | 8 | ||||
-rwxr-xr-x | tests.sh | 16 | ||||
-rw-r--r-- | tests/test_comma_redundant_false.out | 1 | ||||
-rw-r--r-- | tests/test_comma_redundant_true.out | 1 |
4 files changed, 21 insertions, 5 deletions
@@ -595,9 +595,11 @@ static struct expr *optimize_comma_expr(const struct opt_state *state, struct ex if (expr_never_returns(lhs)) { debug_opt(state, "-O1: reachability: %e <==> %e\n", expr, lhs); return extract_child_expr(expr, &expr->lhs); - } - - if (optlevel >= 2 && lhs->pure) { + } else if ((lhs->always_true && rhs == &expr_true) + || (lhs->always_false && rhs == &expr_false)) { + debug_opt(state, "-O1: redundancy elimination: %e <==> %e\n", expr, lhs); + return extract_child_expr(expr, &expr->lhs); + } else if (optlevel >= 2 && lhs->pure) { debug_opt(state, "-O2: purity: %e <==> %e\n", expr, rhs); return extract_child_expr(expr, &expr->rhs); } @@ -610,6 +610,8 @@ gnu_tests=( test_not_reachability test_comma_reachability test_and_false_or_true + test_comma_redundant_true + test_comma_redundant_false ) bfs_tests=( @@ -2005,11 +2007,21 @@ function test_de_morgan_or() { } function test_and_false_or_true() { - # Test (-a lhs(always_true) false) <==> (! lhs), - # (-a lhs(always_false) true) <==> (! lhs) + # Test (-a lhs(always_true) -false) <==> (! lhs), + # (-a lhs(always_false) -true) <==> (! lhs) bfs_diff basic -prune -false -o -true } +function test_comma_redundant_true() { + # Test (, lhs(always_true) -true) <==> lhs, + bfs_diff basic -prune , -true +} + +function test_comma_redundant_false() { + # Test (, lhs(always_false) -false) <==> lhs, + bfs_diff basic -print -not -prune , -false +} + function test_data_flow_depth() { bfs_diff basic -depth +1 -depth -4 } diff --git a/tests/test_comma_redundant_false.out b/tests/test_comma_redundant_false.out new file mode 100644 index 0000000..15a13db --- /dev/null +++ b/tests/test_comma_redundant_false.out @@ -0,0 +1 @@ +basic diff --git a/tests/test_comma_redundant_true.out b/tests/test_comma_redundant_true.out new file mode 100644 index 0000000..15a13db --- /dev/null +++ b/tests/test_comma_redundant_true.out @@ -0,0 +1 @@ +basic |