Commit efd26bbc by Jakub Jelinek

arm: Fix uaddvdi4 expander [PR93494]

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.

2020-01-30  Jakub Jelinek  <jakub@redhat.com>

	PR target/93494
	* config/arm/arm.md (uaddvdi4): Actually emit what gen_uaddvsi4
	returned.

	* gcc.c-torture/execute/pr93494.c: New test.
parent 5ab5d81b
2020-01-30 Jakub Jelinek <jakub@redhat.com> 2020-01-30 Jakub Jelinek <jakub@redhat.com>
PR target/93494
* config/arm/arm.md (uaddvdi4): Actually emit what gen_uaddvsi4
returned.
PR target/91824 PR target/91824
* config/i386/sse.md * config/i386/sse.md
(*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_zext): Renamed to ... (*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_zext): Renamed to ...
......
...@@ -721,7 +721,7 @@ ...@@ -721,7 +721,7 @@
if (!arm_add_operand (hi_op2, SImode)) if (!arm_add_operand (hi_op2, SImode))
hi_op2 = force_reg (SImode, hi_op2); 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 else
{ {
......
2020-01-30 Jakub Jelinek <jakub@redhat.com>
PR target/93494
* gcc.c-torture/execute/pr93494.c: New test.
2020-01-30 Paolo Carlini <paolo.carlini@oracle.com> 2020-01-30 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/90338 PR c++/90338
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment