[llvm] [InstCombine] Skip replaceExtractElements for ConstantData (PR #160575)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 25 09:10:01 PDT 2025
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/160575
>From 3f5862709479842ebb959d7944ea41a9da5ebeb1 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Thu, 25 Sep 2025 01:56:23 +0800
Subject: [PATCH 1/2] [InstCombine] Skip replaceExtractElements for
ConstantData
---
.../InstCombine/InstCombineVectorOps.cpp | 6 ++-
.../InstCombine/insert-extract-shuffle.ll | 46 +++++++++++++++++++
2 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
index b17cf17db1580..6ef30663bf3ce 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
@@ -723,6 +723,11 @@ static bool replaceExtractElements(InsertElementInst *InsElt,
NumExtElts >= NumInsElts)
return false;
+ Value *ExtVecOp = ExtElt->getVectorOperand();
+ // Bail out on constant vectors.
+ if (isa<ConstantData>(ExtVecOp))
+ return false;
+
// Create a shuffle mask to widen the extended-from vector using poison
// values. The mask selects all of the values of the original vector followed
// by as many poison values as needed to create a vector of the same length
@@ -733,7 +738,6 @@ static bool replaceExtractElements(InsertElementInst *InsElt,
for (unsigned i = NumExtElts; i < NumInsElts; ++i)
ExtendMask.push_back(-1);
- Value *ExtVecOp = ExtElt->getVectorOperand();
auto *ExtVecOpInst = dyn_cast<Instruction>(ExtVecOp);
BasicBlock *InsertionBlock = (ExtVecOpInst && !isa<PHINode>(ExtVecOpInst))
? ExtVecOpInst->getParent()
diff --git a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll
index f51e444a815c8..61779d05eb744 100644
--- a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll
+++ b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll
@@ -804,3 +804,49 @@ define <4 x i32> @infloop_D151807(<4 x float> %arg) {
%i4 = insertelement <4 x i32> zeroinitializer, i32 %i3, i64 0
ret <4 x i32> %i4
}
+
+; Make sure we don't crash in this case.
+
+define i64 @pr160507(ptr %arg, i32 %arg1, i1 %arg2, i8 %arg3, i64 %arg4) {
+; CHECK-LABEL: @pr160507(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: br label [[BB5:%.*]]
+; CHECK: bb5:
+; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB6:%.*]], label [[BB8:%.*]]
+; CHECK: bb6:
+; CHECK-NEXT: br label [[BB5]]
+; CHECK: bb8:
+; CHECK-NEXT: br label [[BB10:%.*]]
+; CHECK: bb10:
+; CHECK-NEXT: br label [[BB12:%.*]]
+; CHECK: bb12:
+; CHECK-NEXT: store i64 0, ptr [[ARG:%.*]], align 8
+; CHECK-NEXT: br label [[BB5]]
+;
+bb:
+ br label %bb5
+
+bb5:
+ %phi = phi i8 [ 0, %bb ], [ %extractelement, %bb6 ], [ 0, %bb12 ]
+ br i1 %arg2, label %bb6, label %bb8
+
+bb6:
+ %extractelement = extractelement <1 x i8> zeroinitializer, i64 %arg4
+ br label %bb5
+
+bb8:
+ %insertelement9 = insertelement <2 x i8> <i8 poison, i8 0>, i8 %phi, i64 0
+ %zext = zext <2 x i8> %insertelement9 to <2 x i64>
+ %shufflevector = shufflevector <2 x i64> %zext, <2 x i64> poison, <4 x i32> <i32 poison, i32 1, i32 1, i32 1>
+ br label %bb10
+
+bb10:
+ br label %bb12
+
+bb12:
+ %extractelement11 = extractelement <2 x i64> %zext, i64 1
+ %insertelement13 = insertelement <4 x i64> %shufflevector, i64 %extractelement11, i64 0
+ %extractelement14 = extractelement <4 x i64> %insertelement13, i32 %arg1
+ store i64 %extractelement14, ptr %arg, align 8
+ br label %bb5
+}
>From dad8efdb038ec08defa6192c430f33e763c95583 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Fri, 26 Sep 2025 00:09:45 +0800
Subject: [PATCH 2/2] [InstCombine] Update test. NFC.
---
llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll
index 61779d05eb744..470d6be88672b 100644
--- a/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll
+++ b/llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll
@@ -831,7 +831,7 @@ bb5:
br i1 %arg2, label %bb6, label %bb8
bb6:
- %extractelement = extractelement <1 x i8> zeroinitializer, i64 %arg4
+ %extractelement = extractelement <2 x i8> zeroinitializer, i64 %arg4
br label %bb5
bb8:
More information about the llvm-commits
mailing list