aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-02-17 14:00:48 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-02-17 14:00:48 +0000
commite09deb1401d411beebe1f56c8435bb9af8e1f4cc (patch)
treeb460ac23b8786521d83cd102316a7ba02bde87cf
parente6528d32a44a94c5df64cd283428f7121dc66fd7 (diff)
downloadgcc-e09deb1401d411beebe1f56c8435bb9af8e1f4cc.zip
gcc-e09deb1401d411beebe1f56c8435bb9af8e1f4cc.tar.gz
gcc-e09deb1401d411beebe1f56c8435bb9af8e1f4cc.tar.bz2
re PR tree-optimization/35231 (VRP miscompiles libX11)
2008-02-17 Richard Guenther <rguenther@suse.de> PR tree-optimization/35231 * tree-vrp.c (register_edge_assert_for): Do not assume A == 0 if A | B != 1. * gcc.c-torture/execute/pr35231.c: New testcase. From-SVN: r132378
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr35231.c16
-rw-r--r--gcc/tree-vrp.c6
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b75e608..946eb6a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-17 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/35231
+ * tree-vrp.c (register_edge_assert_for): Do not assume A == 0
+ if A | B != 1.
+
2008-02-17 Uros Bizjak <ubizjak@gmail.com>
Revert:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8bfa223..c167949 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-17 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/35231
+ * gcc.c-torture/execute/pr35231.c: New testcase.
+
2008-02-17 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/pr32268.c (test_lt): Add noinline attribute.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr35231.c b/gcc/testsuite/gcc.c-torture/execute/pr35231.c
new file mode 100644
index 0000000..e0327eb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr35231.c
@@ -0,0 +1,16 @@
+extern void abort(void);
+
+int __attribute__((noinline))
+foo(int bits_per_pixel, int depth)
+{
+ if ((bits_per_pixel | depth) == 1)
+ abort ();
+ return bits_per_pixel;
+}
+
+int main()
+{
+ if (foo(2, 0) != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 5f9a327..f9615d1 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3753,7 +3753,11 @@ register_edge_assert_for (tree name, edge e, block_stmt_iterator si, tree cond)
if (TREE_CODE (def_stmt) == GIMPLE_MODIFY_STMT
&& (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == TRUTH_OR_EXPR
- || TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1)) == BIT_IOR_EXPR))
+ /* For BIT_IOR_EXPR only if NAME == 0 both operands have
+ necessarily zero value. */
+ || (comp_code == EQ_EXPR
+ && (TREE_CODE (GIMPLE_STMT_OPERAND (def_stmt, 1))
+ == BIT_IOR_EXPR))))
{
tree op0 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 0);
tree op1 = TREE_OPERAND (GIMPLE_STMT_OPERAND (def_stmt, 1), 1);