Fix PR97502
authorAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 22 Oct 2020 10:24:22 +0000 (12:24 +0200)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 22 Oct 2020 10:38:48 +0000 (12:38 +0200)
The S/390 backend does not define vec_cmp expanders so far. We relied
solely on expanding vcond.  With commit 502d63b6d various testcases
started to ICE now.

This patch just adds the missing expanders to prevent the ICE.
However, there are still a couple of performance-related testcase
regressions with the vcond lowering which have to be fixed
independently.

gcc/ChangeLog:

PR target/97502
* config/s390/vector.md ("vec_cmp<VI_HW:mode><VI_HW:mode>")
("vec_cmpu<VI_HW:mode><VI_HW:mode>"): New expanders.

gcc/testsuite/ChangeLog:

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

gcc/config/s390/vector.md
gcc/testsuite/gcc.dg/pr97502.c [new file with mode: 0644]

index e9332bad0fd26956601acb99c4ca786a557dec77..3c01cd1b1e103c31bd55923ef9e9c5d62a229513 100644 (file)
 ;; Integer compares
 ;;
 
-(define_insn "*vec_cmp<VICMP_HW_OP:code><VI:mode>_nocc"
+(define_expand "vec_cmp<VI_HW:mode><VI_HW:mode>"
+  [(set (match_operand:VI_HW    0 "register_operand" "")
+       (match_operator:VI_HW   1 ""
+         [(match_operand:VI_HW 2 "register_operand" "")
+          (match_operand:VI_HW 3 "register_operand" "")]))]
+  "TARGET_VX"
+{
+  s390_expand_vec_compare (operands[0], GET_CODE(operands[1]), operands[2], operands[3]);
+  DONE;
+})
+
+(define_expand "vec_cmpu<VI_HW:mode><VI_HW:mode>"
+  [(set (match_operand:VI_HW    0 "register_operand" "")
+       (match_operator:VI_HW   1 ""
+         [(match_operand:VI_HW 2 "register_operand" "")
+          (match_operand:VI_HW 3 "register_operand" "")]))]
+  "TARGET_VX"
+{
+  s390_expand_vec_compare (operands[0], GET_CODE(operands[1]), operands[2], operands[3]);
+  DONE;
+})
+
+(define_insn "*vec_cmp<VICMP_HW_OP:code><VI:mode><VI:mode>_nocc"
   [(set (match_operand:VI                 2 "register_operand" "=v")
        (VICMP_HW_OP:VI (match_operand:VI 0 "register_operand"  "v")
                        (match_operand:VI 1 "register_operand"  "v")))]
diff --git a/gcc/testsuite/gcc.dg/pr97502.c b/gcc/testsuite/gcc.dg/pr97502.c
new file mode 100644 (file)
index 0000000..d87af9c
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+extern char v[54];
+void bar (char *);
+void
+foo (void)
+{
+  int i;
+  char c[32];
+  bar (c);
+  for (i = 0; i < 32; i++)
+    c[i] = c[i] && !v[i];
+  bar (c);
+}