diff options
author | Richard Guenther <rguenther@suse.de> | 2008-02-17 14:00:48 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-02-17 14:00:48 +0000 |
commit | e09deb1401d411beebe1f56c8435bb9af8e1f4cc (patch) | |
tree | b460ac23b8786521d83cd102316a7ba02bde87cf /gcc | |
parent | e6528d32a44a94c5df64cd283428f7121dc66fd7 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr35231.c | 16 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 6 |
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); |