i386: Fix up *{add,sub}v<dwi>4_doubleword patterns (PR target/93412)
authorJakub Jelinek <jakub@redhat.com>
Sun, 26 Jan 2020 11:12:36 +0000 (12:12 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sun, 26 Jan 2020 11:12:36 +0000 (12:12 +0100)
In the *{add,sub}v<dwi>4_doubleword patterns, we don't really want to see a
VOIDmode last operand, because it then means invalid RTL
(sign_extend:{TI,POI} (const_int ...)) or so, and therefore something we
don't really handle in the splitter either.  We have
*{add,sub}v<dwi>4_doubleword_1 pattern for those and that is what combine
will match, the problem in this testcase is just that it was only RA that
propagated the constant into the instruction.

In the similar *{add,sub}v<mode>4 patterns, we make sure not to accept
VOIDmode operand and similarly to these have _1 suffixed variant that allows
constants.

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

PR target/93412
* config/i386/i386.md (*addv<dwi>4_doubleword, *subv<dwi>4_doubleword):
Use nonimmediate_operand instead of x86_64_hilo_general_operand and
drop <di> from constraint of last operand.

* gcc.dg/pr93412.c: New test.

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr93412.c [new file with mode: 0644]

index db62a7a12ff2dce62a5787d4307627f6e20fe40d..420a124b0561ca643dc580edfa841ca02d62ec5e 100644 (file)
@@ -1,5 +1,10 @@
 2020-01-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/93412
+       * config/i386/i386.md (*addv<dwi>4_doubleword, *subv<dwi>4_doubleword):
+       Use nonimmediate_operand instead of x86_64_hilo_general_operand and
+       drop <di> from constraint of last operand.
+
        PR target/93430
        * config/i386/sse.md (*avx_vperm_broadcast_<mode>): Disallow for
        TARGET_AVX2 and V4DFmode not in the split condition, but in the
index 98d452aecfe5c8ff3219d84c73e0a114a57eabd2..6e9c9bd2fb603e079806d9a30d9f2aee9917d6e6 100644 (file)
            (sign_extend:<QPWI>
              (match_operand:<DWI> 1 "nonimmediate_operand" "%0,0"))
            (sign_extend:<QPWI>
-             (match_operand:<DWI> 2 "x86_64_hilo_general_operand" "r<di>,o")))
+             (match_operand:<DWI> 2 "nonimmediate_operand" "r,o")))
          (sign_extend:<QPWI>
            (plus:<DWI> (match_dup 1) (match_dup 2)))))
    (set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r")
            (sign_extend:<QPWI>
              (match_operand:<DWI> 1 "nonimmediate_operand" "0,0"))
            (sign_extend:<QPWI>
-             (match_operand:<DWI> 2 "x86_64_hilo_general_operand" "r<di>,o")))
+             (match_operand:<DWI> 2 "nonimmediate_operand" "r,o")))
          (sign_extend:<QPWI>
            (minus:<DWI> (match_dup 1) (match_dup 2)))))
    (set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r")
index 860d56d3420d7c3c0d8e8088bbb6fb150d0202dd..0cbd0482a8cd07c9368d36a366bb301e397dc6dc 100644 (file)
@@ -1,5 +1,8 @@
 2020-01-26  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/93412
+       * gcc.dg/pr93412.c: New test.
+
        PR target/93430
        * gcc.dg/pr93430.c: New test.
        * gcc.target/i386/avx2-pr93430.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr93412.c b/gcc/testsuite/gcc.dg/pr93412.c
new file mode 100644 (file)
index 0000000..ba82ae1
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/93412 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-Og" } */
+
+unsigned char a;
+int b;
+unsigned c;
+
+int
+foo (int e, int f, int g, int h, int k, int i, short j)
+{
+  b = __builtin_add_overflow (a, 0, &c);
+  b = __builtin_add_overflow_p (b, a, (unsigned __int128) 0) ? b : 0;
+  return e + f + g + a + h + k + i + j + c;
+}