diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp index 5fffcc8cf0f..33bd31f6b98 100644 --- a/lib/Transforms/Vectorize/LoopVectorize.cpp +++ b/lib/Transforms/Vectorize/LoopVectorize.cpp @@ -6463,7 +6463,7 @@ unsigned LoopVectorizationCostModel::getInstructionCost(Instruction *I, assert((isa(I) || isa(I)) && "Expected a load or a store!"); - if (VF == 1) + if (VF == 1 || !TheLoop->contains(I)) return TTI::CastContextHint::Normal; switch (getWideningDecision(I, VF)) { diff --git a/test/Transforms/LoopVectorize/AArch64/pr46950-load-cast-context-crash.ll b/test/Transforms/LoopVectorize/AArch64/pr46950-load-cast-context-crash.ll new file mode 100644 index 00000000000..e357acca3fb --- /dev/null +++ b/test/Transforms/LoopVectorize/AArch64/pr46950-load-cast-context-crash.ll @@ -0,0 +1,25 @@ +; RUN: opt -loop-vectorize %s -mtriple=arm64-apple-iphoneos -S | FileCheck %s + +; CHECK-LABEL: define void @test( +; CHECK: vector.body + +define void @test(i64* %dst, i32* %src) { +entry: + %l = load i32, i32* %src + br label %loop.ph + +loop.ph: + br label %loop + +loop: + %iv = phi i64 [ 0, %loop.ph ], [ %iv.next, %loop ] + %l.cast = sext i32 %l to i64 + %dst.idx = getelementptr i64, i64* %dst, i64 %iv + store i64 %l.cast, i64* %dst.idx + %iv.next = add nuw nsw i64 %iv, 1 + %cmp9.us = icmp ult i64 %iv.next, 20 + br i1 %cmp9.us, label %loop, label %exit + +exit: + ret void +}