[PATCH] D114002: [LoopVectorize] Check the number of uses of an FAdd before classifying as ordered
Kerry McLaughlin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 16 07:20:51 PST 2021
kmclaughlin created this revision.
kmclaughlin added reviewers: david-arm, dmgreen, fhahn, skatkov, RosieSumpter.
Herald added a subscriber: hiraditya.
kmclaughlin requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
checkOrderedReductions looks for Phi nodes which can be classified as in-order,
meaning they can be vectorised without unsafe math. In order to vectorise the
reduction it should also be classified as in-loop by getReductionOpChain, which
checks that the reduction has two uses.
In this patch, a similar check is added to checkOrderedReductions so that we
now return false if there are more than two uses of the FAdd instruction.
This fixes PR52515.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D114002
Files:
llvm/lib/Analysis/IVDescriptors.cpp
llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
Index: llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
===================================================================
--- llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
+++ llvm/test/Transforms/LoopVectorize/AArch64/strict-fadd.ll
@@ -931,6 +931,42 @@
ret double %res
}
+; We should not mark the fadd as an ordered reduction here as there are
+; more than 2 uses of the instruction
+define float @fadd_multiple_use(i64 %n) {
+; CHECK-ORDERED-LABEL: @fadd_multiple_use
+; CHECK-ORDERED-LABEL-NOT: vector.body
+
+; CHECK-UNORDERED-LABEL: @fadd_multiple_use
+; CHECK-UNORDERED-LABEL-NOT: vector.body
+
+; CHECK-NOT-VECTORIZED-LABEL: @fadd_multiple_use
+; CHECK-NOT-VECTORIZED-NOT: vector.body
+entry:
+ br label %for.body
+
+for.body:
+ %iv = phi i64 [ 0, %entry ], [ %iv.next2, %bb2 ]
+ %red = phi float [ 0.0, %entry ], [ %fadd, %bb2 ]
+ %phi1 = phi i64 [ 0, %entry ], [ %iv.next, %bb2 ]
+ %fadd = fadd float %red, 1.000000e+00
+ %iv.next = add nsw i64 %phi1, 1
+ %cmp = icmp ult i64 %iv, %n
+ br i1 %cmp, label %bb2, label %bb1
+
+bb1:
+ %phi2 = phi float [ %fadd, %for.body ]
+ ret float %phi2
+
+bb2:
+ %iv.next2 = add nuw nsw i64 %iv, 1
+ br i1 false, label %for.end, label %for.body
+
+for.end:
+ %phi3 = phi float [ %fadd, %bb2 ]
+ ret float %phi3
+}
+
!0 = distinct !{!0, !5, !9, !11}
!1 = distinct !{!1, !5, !10, !11}
!2 = distinct !{!2, !6, !9, !11}
Index: llvm/lib/Analysis/IVDescriptors.cpp
===================================================================
--- llvm/lib/Analysis/IVDescriptors.cpp
+++ llvm/lib/Analysis/IVDescriptors.cpp
@@ -201,7 +201,10 @@
if (Kind != RecurKind::FAdd)
return false;
- if (Exit->getOpcode() != Instruction::FAdd || Exit != ExactFPMathInst)
+ // Ensure the exit instruction is an FAdd, and that it only has one user
+ // other than the reduction PHI
+ if (Exit->getOpcode() != Instruction::FAdd || Exit->getNumUses() > 2 ||
+ Exit != ExactFPMathInst)
return false;
// The only pattern accepted is the one in which the reduction PHI
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D114002.387632.patch
Type: text/x-patch
Size: 2055 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211116/8144ca9f/attachment.bin>
More information about the llvm-commits
mailing list