From: Juergen Christ Date: Mon, 20 Nov 2023 08:12:18 +0000 (+0100) Subject: s390: Fix ICE in testcase pr89233 X-Git-Tag: basepoints/gcc-15~4359 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2add85eeb01cb3d5db841a3d271bd7c37a77dba1;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md index 4f4c9d96b3da..626ec1182293 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 (mode))" - "@ - vlgv\t%0,%v1,%Y2 - vste\t%v1,%0,%2" + "TARGET_VX" + { + if (CONST_INT_P (operands[2])) + operands[2] = GEN_INT (UINTVAL (operands[2]) & (GET_MODE_NUNITS (mode) - 1)); + if (which_alternative == 0) + return "vlgv\t%0,%v1,%Y2"; + return "vste\t%v1,%0,%2"; + } [(set_attr "op_type" "VRS,VRX")]) ; vlgvb, vlgvh, vlgvf, vlgvg