diff options
author | Jeff Law <law@redhat.com> | 2016-02-29 17:04:48 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2016-02-29 17:04:48 -0700 |
commit | e66f219b038771c074bfd460c067db842a36e4c4 (patch) | |
tree | 3e903d32f313b9c23e0efdd6335d9714de7b21c5 | |
parent | 0c6072a3fc25e656c606247df51a448ab21326c0 (diff) | |
download | gcc-e66f219b038771c074bfd460c067db842a36e4c4.zip gcc-e66f219b038771c074bfd460c067db842a36e4c4.tar.gz gcc-e66f219b038771c074bfd460c067db842a36e4c4.tar.bz2 |
re PR tree-optimization/70005 (wrong code at -O2 and -O3 on x86_64-linux-gnu)
PR tree-optimization/70005
* tree-ssa-uncprop.c (associate_equivalences_with_edges): Handle case
where an object with a boolean range is compared against a value
outside [0..1].
PR tree-optimization/70005
* gcc.c-torture/execute/pr70005.c New test.
From-SVN: r233829
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr70005.c | 25 | ||||
-rw-r--r-- | gcc/tree-ssa-uncprop.c | 3 |
4 files changed, 35 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 653b51e..ccbcfe8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2016-02-28 Jeff Law <law@redhat.com> + PR tree-optimization/70005 + * tree-ssa-uncprop.c (associate_equivalences_with_edges): Handle case + where an object with a boolean range is compared against a value + outside [0..1]. + PR tree-optimization/69999 * gimple-ssa-split-paths.c (split_paths): When duplicating a block with an outgoing edge marked with EDGE_IRREDUCIBLE_LOOP, schedule diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 49577ee..3743d34 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2016-02-29 Jeff Law <law@redhat.com> + PR tree-optimization/70005 + * gcc.c-torture/execute/pr70005.c New test. + PR tree-optimization/69999 * gcc.c-torture/compile/pr69999.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr70005.c b/gcc/testsuite/gcc.c-torture/execute/pr70005.c new file mode 100644 index 0000000..bc37efe --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr70005.c @@ -0,0 +1,25 @@ + +unsigned char a = 6; +int b, c; + +static void +fn1 () +{ + int i = a > 1 ? 1 : a, j = 6 & (c = a && (b = a)); + int d = 0, e = a, f = ~c, g = b || a; + unsigned char h = ~a; + if (a) + f = j; + if (h && g) + d = a; + i = -~(f * d * h) + c && (e || i) ^ f; + if (i != 1) + __builtin_abort (); +} + +int +main () +{ + fn1 (); + return 0; +} diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c index 307bb1f..e2e8212 100644 --- a/gcc/tree-ssa-uncprop.c +++ b/gcc/tree-ssa-uncprop.c @@ -95,7 +95,8 @@ associate_equivalences_with_edges (void) if (TREE_CODE (op0) == SSA_NAME && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0) && ssa_name_has_boolean_range (op0) - && is_gimple_min_invariant (op1)) + && is_gimple_min_invariant (op1) + && (integer_zerop (op1) || integer_onep (op1))) { tree true_val = constant_boolean_node (true, TREE_TYPE (op0)); tree false_val = constant_boolean_node (false, |