Fix PR97502

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.
This commit is contained in:
Andreas Krebbel 2020-10-22 12:24:22 +02:00
parent e3f25eac67
commit f3cf5174b1
2 changed files with 38 additions and 1 deletions

View File

@ -1441,7 +1441,29 @@
;; 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")))]

View File

@ -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);
}