From 2d60e929a169691cc5b5ac520364a9002af0c7cd Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 25 May 2006 12:39:52 +0000 Subject: [PATCH] re PR middle-end/27743 (Wrong code for ((unsigned) ((a) >> 2)) >> 15) 2006-05-25 Richard Guenther PR middle-end/27743 * fold-const.c (fold_binary): Do not look at the stripped op0 for (a OP c1) OP c2 to a OP (c1+c2) shift optimization. * gcc.dg/torture/pr27743.c: New testcase. From-SVN: r114112 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 2 +- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr27743.c | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr27743.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 64117ca1d5c..368b3de9571 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-05-25 Richard Guenther + + PR middle-end/27743 + * fold-const.c (fold_binary): Do not look at the stripped + op0 for (a OP c1) OP c2 to a OP (c1+c2) shift optimization. + 2006-05-25 Eric Botcazou * tree-vrp.c (extract_range_from_assert): Set the range to VARYING diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 8672e48f756..a5e57b18dfe 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9786,7 +9786,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) return NULL_TREE; /* Turn (a OP c1) OP c2 into a OP (c1+c2). */ - if (TREE_CODE (arg0) == code && host_integerp (arg1, false) + if (TREE_CODE (op0) == code && host_integerp (arg1, false) && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type) && host_integerp (TREE_OPERAND (arg0, 1), false) && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 02de3f5f5d7..4e3a9b897ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-25 Richard Guenther + + PR middle-end/27743 + * gcc.dg/torture/pr27743.c: New testcase. + 2006-05-25 Eric Botcazou * gfortran.dg/large_real_kind_form_io_2.f90: UnXFAIL on SPARC/Solaris. diff --git a/gcc/testsuite/gcc.dg/torture/pr27743.c b/gcc/testsuite/gcc.dg/torture/pr27743.c new file mode 100644 index 00000000000..ee9144af258 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr27743.c @@ -0,0 +1,15 @@ +/* { dg-do run } */ + +extern void abort(void); + +int bar(int a) +{ + return ((unsigned) ((a) >> 2)) >> 15; +} + +int main() +{ + if (bar (0xffff3000) != 0x1ffff) + abort (); + return 0; +} -- 2.30.2