From: Serge Belyshev Date: Thu, 9 Nov 2006 19:24:32 +0000 (+0000) Subject: re PR middle-end/29726 (invalid folding of ((X >> C1) & C2) != 0 or "M-x is undefined... X-Git-Tag: releases/gcc-4.3.0~8565 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ad12cd3b586778ac750bfd9172a68fe0d6a4140;p=thirdparty%2Fgcc.git re PR middle-end/29726 (invalid folding of ((X >> C1) & C2) != 0 or "M-x is undefined" in emacs) 2006-11-09 Serge Belyshev PR middle-end/29726 * fold-const.c (fold_binary) : Fix typo in variable name. * gcc.dg/fold-eqandshift-1.c (test5): Uncomment function. (test6): Ditto. (dg-final): Add scan-tree-dump-times patterns for test5 and test6. * gcc.dg/fold-eqandshift-3.c: New test case. From-SVN: r118625 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ea975cdbbf69..7f4e39ca2150 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-11-09 Serge Belyshev + + PR middle-end/29726 + * fold-const.c (fold_binary) : Fix typo in variable name. + 2006-11-09 Andreas Krebbel * simplify-rtx.c (avoid_constant_pool_reference): Avoid calling diff --git a/gcc/fold-const.c b/gcc/fold-const.c index c74ffa37bdec..6016a702d69c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10587,7 +10587,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) unsigned HOST_WIDE_INT log2 = tree_log2 (arg01); /* If (C2 << C1) doesn't overflow, then ((X >> C1) & C2) != 0 can be rewritten as (X & (C2 << C1)) != 0. */ - if ((log2 + TREE_INT_CST_LOW (arg01)) < prec) + if ((log2 + TREE_INT_CST_LOW (arg001)) < prec) { tem = fold_build2 (LSHIFT_EXPR, itype, arg01, arg001); tem = fold_build2 (BIT_AND_EXPR, itype, arg000, tem); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d2dd8722a5ce..cf60056a6384 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2006-11-09 Serge Belyshev + + PR middle-end/29726 + * gcc.dg/fold-eqandshift-1.c (test5): Uncomment function. + (test6): Ditto. + (dg-final): Add scan-tree-dump-times patterns for test5 and test6. + * gcc.dg/fold-eqandshift-3.c: New test case. + 2006-11-09 Paul Thomas PR fortran/29699 diff --git a/gcc/testsuite/gcc.dg/fold-eqandshift-1.c b/gcc/testsuite/gcc.dg/fold-eqandshift-1.c index 6de71165e9d6..34906bad0205 100644 --- a/gcc/testsuite/gcc.dg/fold-eqandshift-1.c +++ b/gcc/testsuite/gcc.dg/fold-eqandshift-1.c @@ -25,7 +25,6 @@ int test4(int d) return (d >> 3) & 4; } -#if 0 void test5(int e) { if ((e >> 31) & 64) @@ -37,10 +36,11 @@ void test6(unsigned int f) if ((f >> 31) & 64) foo(); } -#endif /* { dg-final { scan-tree-dump-times "\\(a \& 8\\) != 0" 1 "original" } } */ /* { dg-final { scan-tree-dump-times "\\(b \& 32\\) != 0" 1 "original" } } */ /* { dg-final { scan-tree-dump-times "c >> 3 \& 1" 1 "original" } } */ /* { dg-final { scan-tree-dump-times "d >> 3 \& 4" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "e < 0" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "if \\(0\\)" 1 "original" } } */ /* { dg-final { cleanup-tree-dump "original" } } */ diff --git a/gcc/testsuite/gcc.dg/fold-eqandshift-3.c b/gcc/testsuite/gcc.dg/fold-eqandshift-3.c new file mode 100644 index 000000000000..d3b4adcf76c6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fold-eqandshift-3.c @@ -0,0 +1,21 @@ +/* PR middle-end/29726 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-original" } */ + +void foo (void); + +int test1 (int a) +{ + if ((a >> 3) & 134217728) + foo (); +} + +int test2 (unsigned int b) +{ + if ((b >> 3) & 134217728) + foo (); +} + +/* { dg-final { scan-tree-dump-times "\\(a \& 1073741824\\) != 0" 1 "original" } } */ +/* { dg-final { scan-tree-dump-times "\\(b \& 1073741824\\) != 0" 1 "original" } } */ +/* { dg-final { cleanup-tree-dump "original" } } */