[llvm] 0ef24aa - Fix for logic in combineExtract() (#108208)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 25 03:12:31 PDT 2024
Author: Jonas Paulsson
Date: 2024-09-25T12:12:27+02:00
New Revision: 0ef24aa549536e65fc3b23c4d21b6b76190d416e
URL: https://github.com/llvm/llvm-project/commit/0ef24aa549536e65fc3b23c4d21b6b76190d416e
DIFF: https://github.com/llvm/llvm-project/commit/0ef24aa549536e65fc3b23c4d21b6b76190d416e.diff
LOG: Fix for logic in combineExtract() (#108208)
A (csmith) test case appeared where combineExtract() crashed when the
input vector was a bitcast into a vector of i1:s. Fix this by adding a check
with canTreatAsByteVector() before the call.
Added:
llvm/test/CodeGen/SystemZ/DAGCombine_extract_vector_elt.ll
Modified:
llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
index 3dabc5ef540cfb..ba105c12bc4e97 100644
--- a/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
+++ b/llvm/lib/Target/SystemZ/SystemZISelLowering.cpp
@@ -7361,8 +7361,9 @@ SDValue SystemZTargetLowering::combineEXTRACT_VECTOR_ELT(
if (auto *IndexN = dyn_cast<ConstantSDNode>(N->getOperand(1))) {
SDValue Op0 = N->getOperand(0);
EVT VecVT = Op0.getValueType();
- return combineExtract(SDLoc(N), N->getValueType(0), VecVT, Op0,
- IndexN->getZExtValue(), DCI, false);
+ if (canTreatAsByteVector(VecVT))
+ return combineExtract(SDLoc(N), N->getValueType(0), VecVT, Op0,
+ IndexN->getZExtValue(), DCI, false);
}
return SDValue();
}
diff --git a/llvm/test/CodeGen/SystemZ/DAGCombine_extract_vector_elt.ll b/llvm/test/CodeGen/SystemZ/DAGCombine_extract_vector_elt.ll
new file mode 100644
index 00000000000000..d568af47dbafd0
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/DAGCombine_extract_vector_elt.ll
@@ -0,0 +1,20 @@
+; RUN: llc -mtriple=s390x-linux-gnu -mcpu=z16 < %s | FileCheck %s
+;
+; Check that DAGCombiner doesn't crash in SystemZ combineExtract()
+; when handling EXTRACT_VECTOR_ELT with a vector of i1:s.
+
+define i32 @fun(i32 %arg) {
+; CHECK-LABEL: fun:
+entry:
+ %cc = icmp eq i32 %arg, 0
+ br label %loop
+
+loop:
+ %P = phi <128 x i1> [ zeroinitializer, %entry ], [ bitcast (<2 x i64> <i64 3, i64 3> to <128 x i1>), %loop ]
+ br i1 %cc, label %exit, label %loop
+
+exit:
+ %E = extractelement <128 x i1> %P, i64 0
+ %Res = zext i1 %E to i32
+ ret i32 %Res
+}
More information about the llvm-commits
mailing list