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:
parent
e3f25eac67
commit
f3cf5174b1
@ -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")))]
|
||||
|
15
gcc/testsuite/gcc.dg/pr97502.c
Normal file
15
gcc/testsuite/gcc.dg/pr97502.c
Normal 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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user