Skip to content

Commit e605813

Browse files
dtcxzywmahesh-attarde
authored andcommitted
[InstCombine] Skip replaceExtractElements for ConstantData (llvm#160575)
Closes llvm#160507. Note: Replacing other users except for `ExtElt` is a bit strange to me. I tried to only replace `ExtElt` with a new extractelement, but it caused regressions on `widen_extract2/3`.
1 parent 61ddcb9 commit e605813

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,11 @@ static bool replaceExtractElements(InsertElementInst *InsElt,
723723
NumExtElts >= NumInsElts)
724724
return false;
725725

726+
Value *ExtVecOp = ExtElt->getVectorOperand();
727+
// Bail out on constant vectors.
728+
if (isa<ConstantData>(ExtVecOp))
729+
return false;
730+
726731
// Create a shuffle mask to widen the extended-from vector using poison
727732
// values. The mask selects all of the values of the original vector followed
728733
// by as many poison values as needed to create a vector of the same length
@@ -733,7 +738,6 @@ static bool replaceExtractElements(InsertElementInst *InsElt,
733738
for (unsigned i = NumExtElts; i < NumInsElts; ++i)
734739
ExtendMask.push_back(-1);
735740

736-
Value *ExtVecOp = ExtElt->getVectorOperand();
737741
auto *ExtVecOpInst = dyn_cast<Instruction>(ExtVecOp);
738742
BasicBlock *InsertionBlock = (ExtVecOpInst && !isa<PHINode>(ExtVecOpInst))
739743
? ExtVecOpInst->getParent()

llvm/test/Transforms/InstCombine/insert-extract-shuffle.ll

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,3 +804,49 @@ define <4 x i32> @infloop_D151807(<4 x float> %arg) {
804804
%i4 = insertelement <4 x i32> zeroinitializer, i32 %i3, i64 0
805805
ret <4 x i32> %i4
806806
}
807+
808+
; Make sure we don't crash in this case.
809+
810+
define i64 @pr160507(ptr %arg, i32 %arg1, i1 %arg2, i8 %arg3, i64 %arg4) {
811+
; CHECK-LABEL: @pr160507(
812+
; CHECK-NEXT: bb:
813+
; CHECK-NEXT: br label [[BB5:%.*]]
814+
; CHECK: bb5:
815+
; CHECK-NEXT: br i1 [[ARG2:%.*]], label [[BB6:%.*]], label [[BB8:%.*]]
816+
; CHECK: bb6:
817+
; CHECK-NEXT: br label [[BB5]]
818+
; CHECK: bb8:
819+
; CHECK-NEXT: br label [[BB10:%.*]]
820+
; CHECK: bb10:
821+
; CHECK-NEXT: br label [[BB12:%.*]]
822+
; CHECK: bb12:
823+
; CHECK-NEXT: store i64 0, ptr [[ARG:%.*]], align 8
824+
; CHECK-NEXT: br label [[BB5]]
825+
;
826+
bb:
827+
br label %bb5
828+
829+
bb5:
830+
%phi = phi i8 [ 0, %bb ], [ %extractelement, %bb6 ], [ 0, %bb12 ]
831+
br i1 %arg2, label %bb6, label %bb8
832+
833+
bb6:
834+
%extractelement = extractelement <2 x i8> zeroinitializer, i64 %arg4
835+
br label %bb5
836+
837+
bb8:
838+
%insertelement9 = insertelement <2 x i8> <i8 poison, i8 0>, i8 %phi, i64 0
839+
%zext = zext <2 x i8> %insertelement9 to <2 x i64>
840+
%shufflevector = shufflevector <2 x i64> %zext, <2 x i64> poison, <4 x i32> <i32 poison, i32 1, i32 1, i32 1>
841+
br label %bb10
842+
843+
bb10:
844+
br label %bb12
845+
846+
bb12:
847+
%extractelement11 = extractelement <2 x i64> %zext, i64 1
848+
%insertelement13 = insertelement <4 x i64> %shufflevector, i64 %extractelement11, i64 0
849+
%extractelement14 = extractelement <4 x i64> %insertelement13, i32 %arg1
850+
store i64 %extractelement14, ptr %arg, align 8
851+
br label %bb5
852+
}

0 commit comments

Comments
 (0)