[PATCH] Fix simplify_comparison in the combiner (PR rtl-optimization/61673)
Jakub Jelinek
jakub@redhat.com
Tue Jul 8 13:41:00 GMT 2014
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:
> 2014-07-03 Jakub Jelinek <jakub@redhat.com>
>
> 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
More information about the Gcc-patches
mailing list