On Mon, 2 Jan 2012, Richard Guenther wrote:

> 
> I am testing the following patch to fix PR51730.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

> Richard.
> 
> 2012-01-02  Richard Guenther  <rguent...@suse.de>
> 
>       PR middle-end/51730
>       * fold-const.c (fold_comparison): Properly canonicalize
>       tree offset and HOST_WIDE_INT bit position.
> 
>       * gcc.dg/fold-compare-6.c: New testcase.
> 
> Index: gcc/fold-const.c
> ===================================================================
> --- gcc/fold-const.c  (revision 182784)
> +++ gcc/fold-const.c  (working copy)
> @@ -8886,6 +8886,14 @@ fold_comparison (location_t loc, enum tr
>             indirect_base0 = true;
>           }
>         offset0 = TREE_OPERAND (arg0, 1);
> +       if (host_integerp (offset0, 0)
> +           && ((HOST_WIDE_INT) (TREE_INT_CST_LOW (offset0) * BITS_PER_UNIT)
> +               / BITS_PER_UNIT
> +               == (HOST_WIDE_INT) TREE_INT_CST_LOW (offset0)))
> +         {
> +           bitpos0 = TREE_INT_CST_LOW (offset0) * BITS_PER_UNIT;
> +           offset0 = NULL_TREE;
> +         }
>       }
>  
>        base1 = arg1;
> @@ -8909,6 +8917,14 @@ fold_comparison (location_t loc, enum tr
>             indirect_base1 = true;
>           }
>         offset1 = TREE_OPERAND (arg1, 1);
> +       if (host_integerp (offset1, 0)
> +           && ((HOST_WIDE_INT) (TREE_INT_CST_LOW (offset1) * BITS_PER_UNIT)
> +               / BITS_PER_UNIT
> +               == (HOST_WIDE_INT) TREE_INT_CST_LOW (offset1)))
> +         {
> +           bitpos1 = TREE_INT_CST_LOW (offset1) * BITS_PER_UNIT;
> +           offset1 = NULL_TREE;
> +         }
>       }
>  
>        /* A local variable can never be pointed to by
> Index: gcc/testsuite/gcc.dg/fold-compare-6.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/fold-compare-6.c     (revision 0)
> +++ gcc/testsuite/gcc.dg/fold-compare-6.c     (revision 0)
> @@ -0,0 +1,12 @@
> +/* { dg-do compile } */
> +/* { dg-options "-fdump-tree-original" } */
> +
> +char digs[] = "0123456789";
> +int foo (void)
> +{
> +  int xlcbug = 1 / (&(digs + 5)[-2 + (_Bool) 1] == &digs[4] ? 1 : -1);
> +  return xlcbug;
> +}
> +
> +/* { dg-final { scan-tree-dump "xlcbug = 1;" "original" } } */
> +/* { dg-final { cleanup-tree-dump "original" } } */
> 

-- 
Richard Guenther <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer

Reply via email to