S/390: Fix PR94666
The vector popcount expanders use a hardcoded subreg. This might lead to double subregs being generated which then fail to match. With this patch simplify_gen_subreg is used instead to fold the subregs. gcc/ChangeLog: 2020-04-20 Andreas Krebbel <krebbel@linux.ibm.com> * config/s390/vector.md ("popcountv8hi2_vx", "popcountv4si2_vx") ("popcountv2di2_vx"): Use simplify_gen_subreg. gcc/testsuite/ChangeLog: 2020-04-20 Andreas Krebbel <krebbel@linux.ibm.com> * g++.dg/pr94666.C: New test.
This commit is contained in:
parent
2930bb3217
commit
582fe481f4
@ -1,3 +1,8 @@
|
||||
2020-04-20 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
* config/s390/vector.md ("popcountv8hi2_vx", "popcountv4si2_vx")
|
||||
("popcountv2di2_vx"): Use simplify_gen_subreg.
|
||||
|
||||
2020-04-20 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
PR target/94613
|
||||
|
@ -871,7 +871,7 @@
|
||||
|
||||
(define_expand "popcountv8hi2_vx"
|
||||
[(set (match_dup 2)
|
||||
(unspec:V16QI [(subreg:V16QI (match_operand:V8HI 1 "register_operand" "v") 0)]
|
||||
(unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")]
|
||||
UNSPEC_POPCNT))
|
||||
; Make a copy of the result
|
||||
(set (match_dup 3) (match_dup 2))
|
||||
@ -903,6 +903,8 @@
|
||||
]
|
||||
"TARGET_VX && !TARGET_VXE"
|
||||
{
|
||||
operands[1] = simplify_gen_subreg (V16QImode, operands[1],
|
||||
V8HImode, 0);
|
||||
operands[2] = gen_reg_rtx (V16QImode);
|
||||
operands[3] = gen_reg_rtx (V16QImode);
|
||||
operands[4] = gen_reg_rtx (V16QImode);
|
||||
@ -911,20 +913,21 @@
|
||||
|
||||
(define_expand "popcountv4si2_vx"
|
||||
[(set (match_dup 2)
|
||||
(unspec:V16QI [(subreg:V16QI (match_operand:V4SI 1 "register_operand" "v") 0)]
|
||||
(unspec:V16QI [(match_operand:V4SI 1 "register_operand" "v")]
|
||||
UNSPEC_POPCNT))
|
||||
(set (match_operand:V4SI 0 "register_operand" "=v")
|
||||
(unspec:V4SI [(match_dup 2) (match_dup 3)]
|
||||
UNSPEC_VEC_VSUM))]
|
||||
"TARGET_VX && !TARGET_VXE"
|
||||
{
|
||||
operands[1] = simplify_gen_subreg (V16QImode, operands[1], V4SImode, 0);
|
||||
operands[2] = gen_reg_rtx (V16QImode);
|
||||
operands[3] = force_reg (V16QImode, CONST0_RTX (V16QImode));
|
||||
})
|
||||
|
||||
(define_expand "popcountv2di2_vx"
|
||||
[(set (match_dup 2)
|
||||
(unspec:V16QI [(subreg:V16QI (match_operand:V2DI 1 "register_operand" "v") 0)]
|
||||
(unspec:V16QI [(match_operand:V2DI 1 "register_operand" "v")]
|
||||
UNSPEC_POPCNT))
|
||||
(set (match_dup 3)
|
||||
(unspec:V4SI [(match_dup 2) (match_dup 4)]
|
||||
@ -934,6 +937,7 @@
|
||||
UNSPEC_VEC_VSUMG))]
|
||||
"TARGET_VX && !TARGET_VXE"
|
||||
{
|
||||
operands[1] = simplify_gen_subreg (V16QImode, operands[1], V2DImode, 0);
|
||||
operands[2] = gen_reg_rtx (V16QImode);
|
||||
operands[3] = gen_reg_rtx (V4SImode);
|
||||
operands[4] = force_reg (V16QImode, CONST0_RTX (V16QImode));
|
||||
|
@ -1,3 +1,7 @@
|
||||
2020-04-20 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
* g++.dg/pr94666.C: New test.
|
||||
|
||||
2020-04-20 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
PR target/94613
|
||||
|
20
gcc/testsuite/g++.dg/pr94666.C
Normal file
20
gcc/testsuite/g++.dg/pr94666.C
Normal file
@ -0,0 +1,20 @@
|
||||
// { dg-do compile }
|
||||
// { dg-options "-O3" }
|
||||
// { dg-additional-options "-march=z13" { target s390*-*-* } }
|
||||
|
||||
int a, c;
|
||||
struct A {
|
||||
int e() {
|
||||
int f;
|
||||
for (int b = 0; b < 4; b++) {
|
||||
a = __builtin_popcountl(d[b]);
|
||||
f += a;
|
||||
}
|
||||
return f;
|
||||
}
|
||||
long d[4];
|
||||
} * g;
|
||||
void h() {
|
||||
for (int b; b; b++)
|
||||
c += g[b].e();
|
||||
}
|
Loading…
Reference in New Issue
Block a user