On Tue, 8 Jul 2014, Jakub Jelinek wrote:
> On Thu, Jul 03, 2014 at 08:35:14AM +0200, Jakub Jelinek wrote:
> > Bootstrapped/regtested on x86_64-linux, i686-linux and s390{,x}-linux. Ok
> > for trunk/4.9?
>
> I'd like to see this in 4.9.1, it is a wrong-code regression from 4.8.x,
> so I'm pinging this now:
Ok.
Thanks,
Richard.
> > 2014-07-03 Jakub Jelinek <[email protected]>
> >
> > PR rtl-optimization/61673
> > * combine.c (simplify_comparison): Test just mode's sign bit
> > in tmode rather than the sign bit and any bits above it.
> >
> > * gcc.c-torture/execute/pr61673.c: New test.
> >
> > --- gcc/combine.c.jj 2014-03-28 20:49:52.892077022 +0100
> > +++ gcc/combine.c 2014-07-02 16:56:02.260456040 +0200
> > @@ -11987,7 +11987,7 @@ simplify_comparison (enum rtx_code code,
> > = (unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (mode) - 1);
> > op0 = simplify_gen_binary (AND, tmode,
> > gen_lowpart (tmode, op0),
> > - gen_int_mode (sign, mode));
> > + gen_int_mode (sign, tmode));
> > code = (code == LT) ? NE : EQ;
> > break;
> > }
> > --- gcc/testsuite/gcc.c-torture/execute/pr61673.c.jj 2014-07-02
> > 17:17:01.398908630 +0200
> > +++ gcc/testsuite/gcc.c-torture/execute/pr61673.c 2014-07-02
> > 17:12:36.000000000 +0200
> > @@ -0,0 +1,50 @@
> > +/* PR rtl-optimization/61673 */
> > +
> > +char e;
> > +
> > +__attribute__((noinline, noclone)) void
> > +bar (char x)
> > +{
> > + if (x != 0x54 && x != (char) 0x87)
> > + __builtin_abort ();
> > +}
> > +
> > +__attribute__((noinline, noclone)) void
> > +foo (const char *x)
> > +{
> > + char d = x[0];
> > + int c = d;
> > + if ((c >= 0 && c <= 0x7f) == 0)
> > + e = d;
> > + bar (d);
> > +}
> > +
> > +__attribute__((noinline, noclone)) void
> > +baz (const char *x)
> > +{
> > + char d = x[0];
> > + int c = d;
> > + if ((c >= 0 && c <= 0x7f) == 0)
> > + e = d;
> > +}
> > +
> > +int
> > +main ()
> > +{
> > + const char c[] = { 0x54, 0x87 };
> > + e = 0x21;
> > + foo (c);
> > + if (e != 0x21)
> > + __builtin_abort ();
> > + foo (c + 1);
> > + if (e != (char) 0x87)
> > + __builtin_abort ();
> > + e = 0x21;
> > + baz (c);
> > + if (e != 0x21)
> > + __builtin_abort ();
> > + baz (c + 1);
> > + if (e != (char) 0x87)
> > + __builtin_abort ();
> > + return 0;
> > +}
>
> Jakub
>
>
--
Richard Biener <[email protected]>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer