aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJuergen Christ <jchrist@linux.ibm.com>2023-11-20 09:12:18 +0100
committerAndreas Krebbel <krebbel@linux.ibm.com>2023-11-23 15:30:48 +0100
commit2add85eeb01cb3d5db841a3d271bd7c37a77dba1 (patch)
treebae343dd4e02518c936ad664e0ec947d18e351b3 /gcc
parent746344dd53807d840c29f52adba10d0ab093bd3d (diff)
downloadgcc-2add85eeb01cb3d5db841a3d271bd7c37a77dba1.zip
gcc-2add85eeb01cb3d5db841a3d271bd7c37a77dba1.tar.gz
gcc-2add85eeb01cb3d5db841a3d271bd7c37a77dba1.tar.bz2
s390: Fix ICE in testcase pr89233
When using GNU vector extensions, an access outside of the vector size caused an ICE on s390. Fix this by aligning with the vec_extract builtin, i.e., computing constant index modulo number of lanes. Fixes testcase gcc.target/s390/pr89233.c. gcc/ChangeLog: * config/s390/vector.md: (*vec_extract) Fix. Signed-off-by: Juergen Christ <jchrist@linux.ibm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/s390/vector.md14
1 files changed, 8 insertions, 6 deletions
diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index 4f4c9d9..626ec11 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -531,12 +531,14 @@
(match_operand:V 1 "nonmemory_operand" "v,v")
(parallel
[(match_operand:SI 2 "nonmemory_operand" "an,I")])))]
- "TARGET_VX
- && (!CONST_INT_P (operands[2])
- || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))"
- "@
- vlgv<bhfgq>\t%0,%v1,%Y2
- vste<bhfgq>\t%v1,%0,%2"
+ "TARGET_VX"
+ {
+ if (CONST_INT_P (operands[2]))
+ operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (<V:MODE>mode) - 1));
+ if (which_alternative == 0)
+ return "vlgv<bhfgq>\t%0,%v1,%Y2";
+ return "vste<bhfgq>\t%v1,%0,%2";
+ }
[(set_attr "op_type" "VRS,VRX")])
; vlgvb, vlgvh, vlgvf, vlgvg