mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 02:33:06 +01:00
[IVDescriptors] Fix bug in checkOrderedReduction
The Exit instruction passed in for checking if it's an ordered reduction need not be an FPAdd operation. We need to bail out at that point instead of assuming it is an FPAdd (and hence has two operands). See added testcase. It crashes without the patch because the Exit instruction is a phi with exactly one operand. This latent bug was exposed by 95346ba which added support for multi-exit loops for vectorization. Reviewed-By: kmclaughlin Differential Revision: https://reviews.llvm.org/D106843
This commit is contained in:
parent
fe743a5b25
commit
b8af1d6561
@ -199,16 +199,14 @@ static bool checkOrderedReduction(RecurKind Kind, Instruction *ExactFPMathInst,
|
|||||||
if (Kind != RecurKind::FAdd)
|
if (Kind != RecurKind::FAdd)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool IsOrdered =
|
if (Exit->getOpcode() != Instruction::FAdd || Exit != ExactFPMathInst)
|
||||||
Exit->getOpcode() == Instruction::FAdd && Exit == ExactFPMathInst;
|
return false;
|
||||||
|
|
||||||
// The only pattern accepted is the one in which the reduction PHI
|
// The only pattern accepted is the one in which the reduction PHI
|
||||||
// is used as one of the operands of the exit instruction
|
// is used as one of the operands of the exit instruction
|
||||||
auto *LHS = Exit->getOperand(0);
|
auto *LHS = Exit->getOperand(0);
|
||||||
auto *RHS = Exit->getOperand(1);
|
auto *RHS = Exit->getOperand(1);
|
||||||
IsOrdered &= ((LHS == Phi) || (RHS == Phi));
|
if (LHS != Phi && RHS != Phi)
|
||||||
|
|
||||||
if (!IsOrdered)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
LLVM_DEBUG(dbgs() << "LV: Found an ordered reduction: Phi: " << *Phi
|
LLVM_DEBUG(dbgs() << "LV: Found an ordered reduction: Phi: " << *Phi
|
||||||
|
21
test/Transforms/LoopVectorize/fp-reduction-crash.ll
Normal file
21
test/Transforms/LoopVectorize/fp-reduction-crash.ll
Normal file
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user