Jakub Jelinek <[email protected]> writes:
> Hi!
>
> uaddvdi4 expander has an optimization for the low 32-bits of the 2nd input
> operand known to be 0. Unfortunately, in that case it only emits copying of
> the low 32 bits to the low 32 bits of the destination, but doesn't emit the
> addition with overflow detection for the high 64 bits.
> Well, to be precise, it emits it, but into an RTL sequence returned by
> gen_uaddvsi4, but that sequence isn't emitted anywhere.
>
> Fixed thusly, bootstrapped/regtested on armv7hl-linux-gnueabi, ok for trunk?
>
> 2020-01-30 Jakub Jelinek <[email protected]>
>
> PR target/93494
> * config/arm/arm.md (uaddvdi4): Actually emit what gen_uaddvsi4
> returned.
>
> * gcc.c-torture/execute/pr93494.c: New test.
OK, thanks.
Richard
>
> --- gcc/config/arm/arm.md.jj 2020-01-18 09:39:51.614204056 +0100
> +++ gcc/config/arm/arm.md 2020-01-29 19:56:15.700835823 +0100
> @@ -721,7 +721,7 @@ (define_expand "uaddvdi4"
> if (!arm_add_operand (hi_op2, SImode))
> hi_op2 = force_reg (SImode, hi_op2);
>
> - gen_uaddvsi4 (hi_result, hi_op1, hi_op2, operands[3]);
> + emit_insn (gen_uaddvsi4 (hi_result, hi_op1, hi_op2, operands[3]));
> }
> else
> {
> --- gcc/testsuite/gcc.c-torture/execute/pr93494.c.jj 2020-01-29
> 20:01:26.849233488 +0100
> +++ gcc/testsuite/gcc.c-torture/execute/pr93494.c 2020-01-29
> 20:00:59.391639624 +0100
> @@ -0,0 +1,13 @@
> +/* PR target/93494 */
> +
> +unsigned short a;
> +
> +int
> +main ()
> +{
> + register unsigned long long y = 0;
> + int x = __builtin_add_overflow (y, 0ULL, &a);
> + if (x || a)
> + __builtin_abort ();
> + return 0;
> +}
>
> Jakub