aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2016-02-29 17:04:48 -0700
committerJeff Law <law@gcc.gnu.org>2016-02-29 17:04:48 -0700
commite66f219b038771c074bfd460c067db842a36e4c4 (patch)
tree3e903d32f313b9c23e0efdd6335d9714de7b21c5
parent0c6072a3fc25e656c606247df51a448ab21326c0 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr70005.c25
-rw-r--r--gcc/tree-ssa-uncprop.c3
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,