[llvm] [VPlan] Create casts before ComputeReductionResult (NFC). (PR #199372)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat May 23 13:08:30 PDT 2026
https://github.com/fhahn created https://github.com/llvm/llvm-project/pull/199372
This ensures ComputeReductionResult is created with operands that have their correct types set at construction.
>From 4051be95522267082a33464ce0801a97a28dfebf Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Sat, 23 May 2026 10:43:07 +0100
Subject: [PATCH] [VPlan] Create casts before ComputeReductionResult (NFC).
This ensures ComputeReductionResult is created with operands that have
their correct types set at construction.
---
.../Transforms/Vectorize/LoopVectorize.cpp | 64 +++++++++----------
1 file changed, 30 insertions(+), 34 deletions(-)
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index 14677427bfdda..40e3eaf319bde 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -7118,42 +7118,38 @@ void LoopVectorizationPlanner::addReductionResultComputation(
FinalReductionResult =
Builder.createAnyOfReduction(NewExiting, NewVal, Start, ExitDL);
} else {
- VPIRFlags Flags(RecurrenceKind, PhiR->isOrdered(), PhiR->isInLoop(),
- PhiR->getFastMathFlags());
- FinalReductionResult =
- Builder.createNaryOp(VPInstruction::ComputeReductionResult,
- {NewExitingVPV}, Flags, ExitDL);
- }
- // If the vector reduction can be performed in a smaller type, we truncate
- // then extend the loop exit value to enable InstCombine to evaluate the
- // entire expression in the smaller type.
- if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType() &&
- !RecurrenceDescriptor::isAnyOfRecurrenceKind(RecurrenceKind)) {
- assert(!PhiR->isInLoop() && "Unexpected truncated inloop reduction!");
- assert(!RecurrenceDescriptor::isMinMaxRecurrenceKind(RecurrenceKind) &&
- "Unexpected truncated min-max recurrence!");
- Type *RdxTy = RdxDesc.getRecurrenceType();
- VPWidenCastRecipe *Trunc;
- Instruction::CastOps ExtendOpc =
- RdxDesc.isSigned() ? Instruction::SExt : Instruction::ZExt;
- VPWidenCastRecipe *Extnd;
- {
- VPBuilder::InsertPointGuard Guard(Builder);
- Builder.setInsertPoint(
- NewExitingVPV->getDefiningRecipe()->getParent(),
- std::next(NewExitingVPV->getDefiningRecipe()->getIterator()));
- Trunc =
- Builder.createWidenCast(Instruction::Trunc, NewExitingVPV, RdxTy);
- Extnd = Builder.createWidenCast(ExtendOpc, Trunc, PhiTy);
+ // If the vector reduction can be performed in a smaller type, we
+ // truncate then extend the loop exit value to enable InstCombine to
+ // evaluate the entire expression in the smaller type.
+ VPValue *ReductionOp = NewExitingVPV;
+ Instruction::CastOps ExtendOpc = Instruction::CastOpsEnd;
+ if (MinVF.isVector() && PhiTy != RdxDesc.getRecurrenceType()) {
+ assert(!PhiR->isInLoop() && "Unexpected truncated inloop reduction!");
+ assert(!RecurrenceDescriptor::isMinMaxRecurrenceKind(RecurrenceKind) &&
+ "Unexpected truncated min-max recurrence!");
+ Type *RdxTy = RdxDesc.getRecurrenceType();
+ ExtendOpc = RdxDesc.isSigned() ? Instruction::SExt : Instruction::ZExt;
+ {
+ VPBuilder::InsertPointGuard Guard(Builder);
+ Builder.setInsertPoint(
+ NewExitingVPV->getDefiningRecipe()->getParent(),
+ std::next(NewExitingVPV->getDefiningRecipe()->getIterator()));
+ ReductionOp =
+ Builder.createWidenCast(Instruction::Trunc, NewExitingVPV, RdxTy);
+ VPWidenCastRecipe *Extnd =
+ Builder.createWidenCast(ExtendOpc, ReductionOp, PhiTy);
+ if (PhiR->getOperand(1) == NewExitingVPV)
+ PhiR->setOperand(1, Extnd);
+ }
}
- if (PhiR->getOperand(1) == NewExitingVPV)
- PhiR->setOperand(1, Extnd->getVPSingleValue());
- // Update ComputeReductionResult with the truncated exiting value and
- // extend its result. Operand 0 provides the values to be reduced.
- FinalReductionResult->setOperand(0, Trunc);
- FinalReductionResult =
- Builder.createScalarCast(ExtendOpc, FinalReductionResult, PhiTy, {});
+ VPIRFlags Flags(RecurrenceKind, PhiR->isOrdered(), PhiR->isInLoop(),
+ PhiR->getFastMathFlags());
+ FinalReductionResult = Builder.createNaryOp(
+ VPInstruction::ComputeReductionResult, {ReductionOp}, Flags, ExitDL);
+ if (ExtendOpc != Instruction::CastOpsEnd)
+ FinalReductionResult = Builder.createScalarCast(
+ ExtendOpc, FinalReductionResult, PhiTy, {});
}
// Update all users outside the vector region. Also replace redundant
More information about the llvm-commits
mailing list