[llvm] [VPlan] Support multiple F(Max|Min)Num reductions. (PR #161735)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 8 03:51:51 PDT 2025
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp -- llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
``````````
:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp b/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
index 75a608cab..c702931ce 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
@@ -876,38 +876,39 @@ bool VPlanTransforms::handleMaxMinNumReductions(VPlan &Plan) {
VPValue *AnyNaN = nullptr;
SmallPtrSet<VPValue *, 2> RdxResults;
for (VPReductionPHIRecipe *RedPhiR : ReductionsToConvert) {
- assert(RecurrenceDescriptor::isFPMinMaxNumRecurrenceKind(
- RedPhiR->getRecurrenceKind()) &&
- "unsupported reduction");
+ assert(RecurrenceDescriptor::isFPMinMaxNumRecurrenceKind(
+ RedPhiR->getRecurrenceKind()) &&
+ "unsupported reduction");
- VPValue *MinMaxOp = GetMinMaxCompareValue(RedPhiR);
- if (!MinMaxOp)
- return false;
+ VPValue *MinMaxOp = GetMinMaxCompareValue(RedPhiR);
+ if (!MinMaxOp)
+ return false;
- VPValue *IsNaN = Builder.createFCmp(CmpInst::FCMP_UNO, MinMaxOp, MinMaxOp);
- VPValue *HasNaN = Builder.createNaryOp(VPInstruction::AnyOf, {IsNaN});
- if (AnyNaN)
- AnyNaN = Builder.createOr(AnyNaN, HasNaN);
- else
- AnyNaN = HasNaN;
-
- // If we exit early due to NaNs, compute the final reduction result based
- // on the reduction phi at the beginning of the last vector iteration.
- auto *RdxResult = find_singleton<VPSingleDefRecipe>(
- RedPhiR->getBackedgeValue()->users(),
- [RedPhiR](VPUser *U, bool) -> VPSingleDefRecipe * {
- auto *VPI = dyn_cast<VPInstruction>(U);
- if (VPI && VPI->getOpcode() == VPInstruction::ComputeReductionResult)
- return VPI;
- assert(U == RedPhiR && "Backedge value must only be used by "
- "ComputeReductionResult and the reduction phi");
- return nullptr;
- });
-
- auto *NewSel =
- MiddleBuilder.createSelect(HasNaN, RedPhiR, RdxResult->getOperand(1));
- RdxResult->setOperand(1, NewSel);
- RdxResults.insert(RdxResult);
+ VPValue *IsNaN = Builder.createFCmp(CmpInst::FCMP_UNO, MinMaxOp, MinMaxOp);
+ VPValue *HasNaN = Builder.createNaryOp(VPInstruction::AnyOf, {IsNaN});
+ if (AnyNaN)
+ AnyNaN = Builder.createOr(AnyNaN, HasNaN);
+ else
+ AnyNaN = HasNaN;
+
+ // If we exit early due to NaNs, compute the final reduction result based
+ // on the reduction phi at the beginning of the last vector iteration.
+ auto *RdxResult = find_singleton<VPSingleDefRecipe>(
+ RedPhiR->getBackedgeValue()->users(),
+ [RedPhiR](VPUser *U, bool) -> VPSingleDefRecipe * {
+ auto *VPI = dyn_cast<VPInstruction>(U);
+ if (VPI && VPI->getOpcode() == VPInstruction::ComputeReductionResult)
+ return VPI;
+ assert(U == RedPhiR &&
+ "Backedge value must only be used by "
+ "ComputeReductionResult and the reduction phi");
+ return nullptr;
+ });
+
+ auto *NewSel =
+ MiddleBuilder.createSelect(HasNaN, RedPhiR, RdxResult->getOperand(1));
+ RdxResult->setOperand(1, NewSel);
+ RdxResults.insert(RdxResult);
}
auto *LatchExitingBranch = LatchVPBB->getTerminator();
``````````
</details>
https://github.com/llvm/llvm-project/pull/161735
More information about the llvm-commits
mailing list