Skip to content

Commit d0746f2

Browse files
committed
Don't fold (select C, (gep Ptr, Idx), Ptr) if C is vector but Idx is scalar
The folding rule (select C, (gep Ptr, Idx), Ptr) -> (gep Ptr, (select C, Idx, 0)) creates a malformed SELECT IR if C is a vector while Idx is scalar. SELECT VecC, ScalarIdx, 0 We could splat Idx to a vector but it defeats the purpose of optimisation. Don't apply the folding rule in this case. This fixes a regression from commit d561b6f.
1 parent 36daf07 commit d0746f2

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3004,8 +3004,10 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
30043004
if (Gep->getNumOperands() != 2 || Gep->getPointerOperand() != Base ||
30053005
!Gep->hasOneUse())
30063006
return nullptr;
3007-
Type *ElementType = Gep->getResultElementType();
30083007
Value *Idx = Gep->getOperand(1);
3008+
if (isa<VectorType>(CondVal->getType()) && !isa<VectorType>(Idx->getType()))
3009+
return nullptr;
3010+
Type *ElementType = Gep->getResultElementType();
30093011
Value *NewT = Idx;
30103012
Value *NewF = Constant::getNullValue(Idx->getType());
30113013
if (Swap)

llvm/test/Transforms/InstCombine/select-gep.ll

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,3 +244,16 @@ define i32* @test6(i32* %p, i64 %x, i64 %y) {
244244
ret i32* %sel
245245
}
246246
declare void @use_i32p(i32*)
247+
248+
; We cannot create a select-with-idx with a vector condition but scalar idx.
249+
250+
define <2 x i64*> @test7(<2 x i64*> %p1, i64 %idx, <2 x i1> %cc) {
251+
; CHECK-LABEL: @test7(
252+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, <2 x i64*> [[P1:%.*]], i64 [[IDX]]
253+
; CHECK-NEXT: [[SELECT:%.*]] = select <2 x i1> [[CC:%.*]], <2 x i64*> [[P1:%.*]], <2 x i64*> [[GEP]]
254+
; CHECK-NEXT: ret <2 x i64*> [[SELECT]]
255+
;
256+
%gep = getelementptr i64, <2 x i64*> %p1, i64 %idx
257+
%select = select <2 x i1> %cc, <2 x i64*> %p1, <2 x i64*> %gep
258+
ret <2 x i64*> %select
259+
}

0 commit comments

Comments
 (0)