1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02: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:
Anna Thomas 2021-07-26 21:39:18 -04:00
parent fe743a5b25
commit b8af1d6561
2 changed files with 24 additions and 5 deletions

View File

@ -199,16 +199,14 @@ static bool checkOrderedReduction(RecurKind Kind, Instruction *ExactFPMathInst,
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

View 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
}