diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp --- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -2583,7 +2583,7 @@ // compare. The only way that we get a backedge taken count is that the // induction variable was signed and as such will not overflow. In such a case // truncation is legal. - if (BackedgeTakenCount->getType()->getPrimitiveSizeInBits() > + if (SE->getTypeSizeInBits(BackedgeTakenCount->getType()) > IdxTy->getPrimitiveSizeInBits()) BackedgeTakenCount = SE->getTruncateOrNoop(BackedgeTakenCount, IdxTy); BackedgeTakenCount = SE->getNoopOrZeroExtend(BackedgeTakenCount, IdxTy); diff --git a/llvm/test/Transforms/LoopVectorize/pr45259.ll b/llvm/test/Transforms/LoopVectorize/pr45259.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/pr45259.ll @@ -0,0 +1,36 @@ +; RUN: opt < %s -S -loop-vectorize -force-vector-width=4 -force-vector-interleave=1 | FileCheck %s + +; Check that we can vectorize this loop without crashing. + +; CHECK-LABEL: define {{.*}} @widget( +; CHECK: [[vecInd:%.*]] = phi <4 x i8> [ +; CHECK-NEXT: add <4 x i8> [[vecInd]], + +define i8 @widget(i8* %arr, i8 %t9) { +bb: + br label %bb6 + +bb6: + %t1.0 = phi i8* [ %arr, %bb ], [ null, %bb6 ] + %c = call i1 @cond() + br i1 %c, label %for.preheader, label %bb6 + +for.preheader: + br label %for.body + +for.body: + %iv = phi i8 [ %iv.next, %for.body ], [ 0, %for.preheader ] + %iv.next = add i8 %iv, 1 + %ptr = getelementptr inbounds i8, i8* %arr, i8 %iv.next + %t3.i = icmp slt i8 %iv.next, %t9 + %t3.i8 = zext i1 %t3.i to i8 + store i8 %t3.i8, i8* %ptr + %ec = icmp eq i8* %t1.0, %ptr + br i1 %ec, label %for.exit, label %for.body + +for.exit: + %iv.next.lcssa = phi i8 [ %iv.next, %for.body ] + ret i8 %iv.next.lcssa +} + +declare i1 @cond()