diff --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp --- a/llvm/lib/Analysis/IVDescriptors.cpp +++ b/llvm/lib/Analysis/IVDescriptors.cpp @@ -199,16 +199,14 @@ if (Kind != RecurKind::FAdd) return false; - bool IsOrdered = - Exit->getOpcode() == Instruction::FAdd && Exit == ExactFPMathInst; + if (Exit->getOpcode() != Instruction::FAdd || Exit != ExactFPMathInst) + return false; // The only pattern accepted is the one in which the reduction PHI // is used as one of the operands of the exit instruction auto *LHS = Exit->getOperand(0); auto *RHS = Exit->getOperand(1); - IsOrdered &= ((LHS == Phi) || (RHS == Phi)); - - if (!IsOrdered) + if (LHS != Phi && RHS != Phi) return false; LLVM_DEBUG(dbgs() << "LV: Found an ordered reduction: Phi: " << *Phi diff --git a/llvm/test/Transforms/LoopVectorize/fp-reduction-crash.ll b/llvm/test/Transforms/LoopVectorize/fp-reduction-crash.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopVectorize/fp-reduction-crash.ll @@ -0,0 +1,21 @@ +; REQUIRES: asserts +; RUN: opt < %s -loop-vectorize -S | FileCheck %s + +; CHECK-LABEL: quux +define void @quux() { +bb: + br label %bb4 + +bb1: ; preds = %bb4 + %tmp = phi double [ %tmp6, %bb4 ] + br i1 undef, label %bb4, label %bb2 + +bb2: ; preds = %bb1 + %tmp3 = phi double [ %tmp, %bb1 ] + ret void + +bb4: ; preds = %bb1, %bb + %tmp5 = phi double [ 1.300000e+01, %bb ], [ %tmp, %bb1 ] + %tmp6 = fadd double %tmp5, 1.000000e+00 + br label %bb1 +}