diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index 23348d161d78..ea0df128a0ba 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -3004,8 +3004,10 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) { if (Gep->getNumOperands() != 2 || Gep->getPointerOperand() != Base || !Gep->hasOneUse()) return nullptr; - Type *ElementType = Gep->getResultElementType(); Value *Idx = Gep->getOperand(1); + if (isa(CondVal->getType()) && !isa(Idx->getType())) + return nullptr; + Type *ElementType = Gep->getResultElementType(); Value *NewT = Idx; Value *NewF = Constant::getNullValue(Idx->getType()); if (Swap) diff --git a/llvm/test/Transforms/InstCombine/select-gep.ll b/llvm/test/Transforms/InstCombine/select-gep.ll index 519f0a94a136..fd2beff5bfab 100644 --- a/llvm/test/Transforms/InstCombine/select-gep.ll +++ b/llvm/test/Transforms/InstCombine/select-gep.ll @@ -244,3 +244,16 @@ define i32* @test6(i32* %p, i64 %x, i64 %y) { ret i32* %sel } declare void @use_i32p(i32*) + +; We cannot create a select-with-idx with a vector condition but scalar idx. + +define <2 x i64*> @test7(<2 x i64*> %p1, i64 %idx, <2 x i1> %cc) { +; CHECK-LABEL: @test7( +; CHECK-NEXT: [[GEP:%.*]] = getelementptr i64, <2 x i64*> [[P1:%.*]], i64 [[IDX]] +; CHECK-NEXT: [[SELECT:%.*]] = select <2 x i1> [[CC:%.*]], <2 x i64*> [[P1:%.*]], <2 x i64*> [[GEP]] +; CHECK-NEXT: ret <2 x i64*> [[SELECT]] +; + %gep = getelementptr i64, <2 x i64*> %p1, i64 %idx + %select = select <2 x i1> %cc, <2 x i64*> %p1, <2 x i64*> %gep + ret <2 x i64*> %select +}