From: Jakub Jelinek Date: Thu, 30 Jan 2020 11:58:20 +0000 (+0100) Subject: arm: Fix uaddvdi4 expander [PR93494] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=efd26bbc81e94a324b3d3331a32eac089af8db1d;p=gcc.git 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 PR target/93494 * config/arm/arm.md (uaddvdi4): Actually emit what gen_uaddvsi4 returned. * gcc.c-torture/execute/pr93494.c: New test. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4beb63934bc..a141e0669f0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2020-01-30 Jakub Jelinek + PR target/93494 + * config/arm/arm.md (uaddvdi4): Actually emit what gen_uaddvsi4 + returned. + PR target/91824 * config/i386/sse.md (*_movmsk_zext): Renamed to ... diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 04549082567..dd73263409a 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -721,7 +721,7 @@ 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 { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 597788a80a3..ab61b48c7bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-01-30 Jakub Jelinek + + PR target/93494 + * gcc.c-torture/execute/pr93494.c: New test. + 2020-01-30 Paolo Carlini PR c++/90338 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr93494.c b/gcc/testsuite/gcc.c-torture/execute/pr93494.c new file mode 100644 index 00000000000..ef70403a088 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr93494.c @@ -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; +}