From 68fbd00a08a9098a60d1e8e980a35f9ae11ae898 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Fri, 16 Nov 2007 21:50:20 +0000 Subject: [PATCH] re PR middle-end/34030 (ICE in in compare_values_warnv, at tree-vrp.c:701) 2007-11-16 Richard Guenther PR middle-end/34030 * fold-const.c (fold_binary): Use correct types for folding 1 << X & Y to Y >> X & 1. * gcc.c-torture/compile/pr34030.c: New testcase. From-SVN: r130242 --- gcc/ChangeLog | 6 ++++ gcc/fold-const.c | 36 +++++++++---------- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr34030.c | 8 +++++ 4 files changed, 37 insertions(+), 18 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr34030.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 88880289babc..8de09945cf25 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-11-16 Richard Guenther + + PR middle-end/34030 + * fold-const.c (fold_binary): Use correct types for folding + 1 << X & Y to Y >> X & 1. + 2007-11-07 Eric Botcazou PR rtl-optimization/33822 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ec9ab9486e0b..f031825f7bab 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9566,24 +9566,24 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) tree arg01 = TREE_OPERAND (arg0, 1); if (TREE_CODE (arg00) == LSHIFT_EXPR && integer_onep (TREE_OPERAND (arg00, 0))) - return - fold_build2 (code, type, - build2 (BIT_AND_EXPR, TREE_TYPE (arg0), - build2 (RSHIFT_EXPR, TREE_TYPE (arg00), - arg01, TREE_OPERAND (arg00, 1)), - fold_convert (TREE_TYPE (arg0), - integer_one_node)), - arg1); - else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR - && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0))) - return - fold_build2 (code, type, - build2 (BIT_AND_EXPR, TREE_TYPE (arg0), - build2 (RSHIFT_EXPR, TREE_TYPE (arg01), - arg00, TREE_OPERAND (arg01, 1)), - fold_convert (TREE_TYPE (arg0), - integer_one_node)), - arg1); + { + tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00), + arg01, TREE_OPERAND (arg00, 1)); + tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem, + build_int_cst (TREE_TYPE (arg0), 1)); + return fold_build2 (code, type, + fold_convert (TREE_TYPE (arg1), tem), arg1); + } + else if (TREE_CODE (arg01) == LSHIFT_EXPR + && integer_onep (TREE_OPERAND (arg01, 0))) + { + tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01), + arg00, TREE_OPERAND (arg01, 1)); + tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem, + build_int_cst (TREE_TYPE (arg0), 1)); + return fold_build2 (code, type, + fold_convert (TREE_TYPE (arg1), tem), arg1); + } } /* If this is an NE or EQ comparison of zero against the result of a diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4183bad7efd3..7efd5b698d96 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-16 Richard Guenther + + PR middle-end/34030 + * gcc.c-torture/compile/pr34030.c: New testcase. + 2007-11-07 Eric Botcazou * gcc.dg/out-of-bounds-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr34030.c b/gcc/testsuite/gcc.c-torture/compile/pr34030.c new file mode 100644 index 000000000000..f4f9e176d3f2 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr34030.c @@ -0,0 +1,8 @@ +int myvar; + +int foo(int mynum) +{ + if ((((void *)0) == (myvar & ((1U<<0) << mynum))) && (mynum > 0)) + return 1; + return 0; +} -- 2.47.2