diff --git a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp --- a/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -4089,7 +4089,16 @@ std::vector OpVecs; for (int j = 1, e = cast(VL0)->getNumOperands(); j < e; ++j) { - Value *OpVec = vectorizeTree(E->getOperand(j)); + ValueList &VL = E->getOperand(j); + // Need to cast all elements to the same type before vectorization to + // avoid crash. + Type *Ty = DL->getIntPtrType(F->getContext()); + for (Value *&V : VL) { + auto *CI = cast(V); + V = ConstantExpr::getIntegerCast(CI, Ty, + CI->getValue().isSignBitSet()); + } + Value *OpVec = vectorizeTree(VL); OpVecs.push_back(OpVec); } diff --git a/llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll b/llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll --- a/llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll +++ b/llvm/test/Transforms/SLPVectorizer/X86/crash_gep.ll @@ -29,3 +29,26 @@ store i64 %2, i64* %add.ptr, align 8 ret i32 undef } + +define void @PR43799() { +; CHECK-LABEL: @PR43799( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[BODY:%.*]] +; CHECK: body: +; CHECK-NEXT: br label [[BODY]] +; CHECK: epilog: +; CHECK-NEXT: ret void +; +entry: + br label %body + +body: + %p.1.i19 = phi i8* [ undef, %entry ], [ %incdec.ptr.i.7, %body ] + %lsr.iv17 = phi i8* [ undef, %entry ], [ %scevgep113.7, %body ] + %incdec.ptr.i.7 = getelementptr inbounds i8, i8* undef, i32 1 + %scevgep113.7 = getelementptr i8, i8* undef, i64 1 + br label %body + +epilog: + ret void +}