From: Richard Guenther Date: Sun, 17 Feb 2008 14:00:48 +0000 (+0000) Subject: re PR tree-optimization/35231 (VRP miscompiles libX11) X-Git-Tag: releases/gcc-4.3.0~120 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e09deb1401d411beebe1f56c8435bb9af8e1f4cc;p=thirdparty%2Fgcc.git re PR tree-optimization/35231 (VRP miscompiles libX11) 2008-02-17 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b75e608e9ef8..946eb6a70030 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-02-17 Richard Guenther + + 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 Revert: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8bfa223a170e..c167949098c6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-02-17 Richard Guenther + + PR tree-optimization/35231 + * gcc.c-torture/execute/pr35231.c: New testcase. + 2008-02-17 Uros Bizjak * 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 000000000000..e0327eb5f8a5 --- /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 5f9a3279aa3c..f9615d1f815e 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);