[llvm] 68ffed1 - [IVDescriptors] Fix bug in checkOrderedReduction

Anna Thomas via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 27 06:31:49 PDT 2021


Author: Anna Thomas
Date: 2021-07-27T09:31:44-04:00
New Revision: 68ffed12b7e29c498e5b6d563a218f8710c46e61

URL: https://github.com/llvm/llvm-project/commit/68ffed12b7e29c498e5b6d563a218f8710c46e61
DIFF: https://github.com/llvm/llvm-project/commit/68ffed12b7e29c498e5b6d563a218f8710c46e61.diff

LOG: [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

Added: 
    llvm/test/Transforms/LoopVectorize/fp-reduction-crash.ll

Modified: 
    llvm/lib/Analysis/IVDescriptors.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/IVDescriptors.cpp b/llvm/lib/Analysis/IVDescriptors.cpp
index 5edf9b85e4605..fc6051b35efcd 100644
--- a/llvm/lib/Analysis/IVDescriptors.cpp
+++ b/llvm/lib/Analysis/IVDescriptors.cpp
@@ -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

diff  --git a/llvm/test/Transforms/LoopVectorize/fp-reduction-crash.ll b/llvm/test/Transforms/LoopVectorize/fp-reduction-crash.ll
new file mode 100644
index 0000000000000..20d9655d3d9ae
--- /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
+}


        


More information about the llvm-commits mailing list