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 @@ -6561,10 +6561,9 @@ return None; RetI = RetI->user_back(); } - if (match(RetI, m_Mul(m_Value(), m_Value())) && + + if (match(RetI, m_OneUse(m_Mul(m_Value(), m_Value()))) && RetI->user_back()->getOpcode() == Instruction::Add) { - if (!RetI->hasOneUser()) - return None; RetI = RetI->user_back(); } diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/pr56627.ll b/llvm/test/Transforms/LoopVectorize/AArch64/pr56627.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/AArch64/pr56627.ll @@ -0,0 +1,23 @@ +; RUN: opt < %s -S -passes=loop-vectorize | FileCheck %s + +; Check that we can vectorize this loop without crashing. + +target triple = "aarch64-none-linux-gnu" +define float @quux() { +; CHECK: @quux +bb: + br label %bb1 + +bb1: + %tmp = phi i64 [ %tmp3, %bb1 ], [ 0, %bb ] + %tmp2 = phi float [ %tmp5, %bb1 ], [ 0.000000e+00, %bb ] + %tmp3 = add nsw i64 %tmp, 1 + %tmp5 = fadd float %tmp2, 3.000000e+00 + %tmp6 = mul i32 0, 0 + %tmp7 = icmp sgt i64 %tmp, 0 + br i1 %tmp7, label %bb8, label %bb1 + +bb8: + %tmp9 = phi float [ %tmp5, %bb1 ] + ret float %tmp9 +} \ No newline at end of file