-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[VPlan] Replace RdxDesc with RecurKind in VPReductionPHIRecipe (NFC). #142322
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
bc7024c
5d0c744
dca0d4b
4c2e494
0ab71f6
cb4b75d
db65c6f
0bd4d2a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -301,6 +301,11 @@ class LoopVectorizationLegality { | |||||
/// Returns the reduction variables found in the loop. | ||||||
const ReductionList &getReductionVars() const { return Reductions; } | ||||||
|
||||||
RecurrenceDescriptor getRecurrenceDescriptor(PHINode *PN) const { | ||||||
assert(Reductions.contains(PN) && "no recurrence descriptor for phi"); | ||||||
|
assert(Reductions.contains(PN) && "no recurrence descriptor for phi"); | |
assert(isReductionVariable(PN) && "only reductions have recurrence descriptors"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done in split off c5fff13, thanks
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Independent: can search and replace several usages.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done in split off c5fff13, thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Independent: can update below
bool isReductionVariable(PHINode *PN) const { return Reductions.count(PN); }
to
bool isReductionVariable(PHINode *PN) const { return Reductions.contains(PN); }
Original file line number | Diff line number | Diff line change | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -7267,8 +7267,7 @@ static void fixReductionScalarResumeWhenVectorizingEpilog( | |||||||||||
|
||||||||||||
auto *EpiRedHeaderPhi = | ||||||||||||
cast<VPReductionPHIRecipe>(EpiRedResult->getOperand(0)); | ||||||||||||
const RecurrenceDescriptor &RdxDesc = | ||||||||||||
EpiRedHeaderPhi->getRecurrenceDescriptor(); | ||||||||||||
RecurKind Kind = EpiRedHeaderPhi->getRecurrenceKind(); | ||||||||||||
Value *MainResumeValue; | ||||||||||||
if (auto *VPI = dyn_cast<VPInstruction>(EpiRedHeaderPhi->getStartValue())) { | ||||||||||||
assert((VPI->getOpcode() == VPInstruction::Broadcast || | ||||||||||||
|
@@ -7277,8 +7276,7 @@ static void fixReductionScalarResumeWhenVectorizingEpilog( | |||||||||||
MainResumeValue = VPI->getOperand(0)->getUnderlyingValue(); | ||||||||||||
} else | ||||||||||||
MainResumeValue = EpiRedHeaderPhi->getStartValue()->getUnderlyingValue(); | ||||||||||||
if (RecurrenceDescriptor::isAnyOfRecurrenceKind( | ||||||||||||
RdxDesc.getRecurrenceKind())) { | ||||||||||||
if (RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind)) { | ||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Independent: can shorten to |
||||||||||||
[[maybe_unused]] Value *StartV = | ||||||||||||
EpiRedResult->getOperand(1)->getLiveInIRValue(); | ||||||||||||
auto *Cmp = cast<ICmpInst>(MainResumeValue); | ||||||||||||
|
@@ -7288,8 +7286,7 @@ static void fixReductionScalarResumeWhenVectorizingEpilog( | |||||||||||
"AnyOf expected to start by comparing main resume value to original " | ||||||||||||
"start value"); | ||||||||||||
MainResumeValue = Cmp->getOperand(0); | ||||||||||||
} else if (RecurrenceDescriptor::isFindIVRecurrenceKind( | ||||||||||||
RdxDesc.getRecurrenceKind())) { | ||||||||||||
} else if (RecurrenceDescriptor::isFindIVRecurrenceKind(Kind)) { | ||||||||||||
Value *StartV = getStartValueFromReductionResult(EpiRedResult); | ||||||||||||
Value *SentinelV = EpiRedResult->getOperand(2)->getLiveInIRValue(); | ||||||||||||
using namespace llvm::PatternMatch; | ||||||||||||
|
@@ -8310,7 +8307,7 @@ VPRecipeBase *VPRecipeBuilder::tryToCreateWidenRecipe(VPSingleDefRecipe *R, | |||||||||||
unsigned ScaleFactor = | ||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Above
can be replaced (independently) with
? Similar candidates in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated in c5fff13, thanks |
||||||||||||
getScalingForReduction(RdxDesc.getLoopExitInstr()).value_or(1); | ||||||||||||
PhiRecipe = new VPReductionPHIRecipe( | ||||||||||||
Phi, RdxDesc, *StartV, CM.isInLoopReduction(Phi), | ||||||||||||
Phi, RdxDesc.getRecurrenceKind(), *StartV, CM.isInLoopReduction(Phi), | ||||||||||||
CM.useOrderedReductions(RdxDesc), ScaleFactor); | ||||||||||||
} else { | ||||||||||||
// TODO: Currently fixed-order recurrences are modeled as chains of | ||||||||||||
|
@@ -9070,8 +9067,7 @@ void LoopVectorizationPlanner::adjustRecipesForReductions( | |||||||||||
if (!PhiR || !PhiR->isInLoop() || (MinVF.isScalar() && !PhiR->isOrdered())) | ||||||||||||
continue; | ||||||||||||
|
||||||||||||
const RecurrenceDescriptor &RdxDesc = PhiR->getRecurrenceDescriptor(); | ||||||||||||
RecurKind Kind = RdxDesc.getRecurrenceKind(); | ||||||||||||
RecurKind Kind = PhiR->getRecurrenceKind(); | ||||||||||||
assert( | ||||||||||||
!RecurrenceDescriptor::isAnyOfRecurrenceKind(Kind) && | ||||||||||||
!RecurrenceDescriptor::isFindIVRecurrenceKind(Kind) && | ||||||||||||
|
@@ -9177,6 +9173,8 @@ void LoopVectorizationPlanner::adjustRecipesForReductions( | |||||||||||
if (CM.blockNeedsPredicationForAnyReason(CurrentLinkI->getParent())) | ||||||||||||
CondOp = RecipeBuilder.getBlockInMask(CurrentLink->getParent()); | ||||||||||||
|
||||||||||||
RecurrenceDescriptor RdxDesc = Legal->getRecurrenceDescriptor( | ||||||||||||
cast<PHINode>(PhiR->getUnderlyingInstr())); | ||||||||||||
Comment on lines
+9175
to
+9176
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. TODO to also capture RdxDesc's FMF in PhiR, similar to capturing its Kind, to avoid retrieving RdxDesc here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added a TODO, thanks |
||||||||||||
// Non-FP RdxDescs will have all fast math flags set, so clear them. | ||||||||||||
FastMathFlags FMFs = isa<FPMathOperator>(CurrentLinkI) | ||||||||||||
? RdxDesc.getFastMathFlags() | ||||||||||||
|
@@ -9207,7 +9205,8 @@ void LoopVectorizationPlanner::adjustRecipesForReductions( | |||||||||||
if (!PhiR) | ||||||||||||
continue; | ||||||||||||
|
||||||||||||
const RecurrenceDescriptor &RdxDesc = PhiR->getRecurrenceDescriptor(); | ||||||||||||
const RecurrenceDescriptor &RdxDesc = Legal->getRecurrenceDescriptor( | ||||||||||||
cast<PHINode>(PhiR->getUnderlyingInstr())); | ||||||||||||
Comment on lines
+9207
to
+9208
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
and replace Getting rid of RdxDesc here is more difficult: in addition to capturing RdxDesc's FMF in PhiR, code below also uses RdxDesc to retrieve sentinel value, recurrence type, isSigned, Loop Exit Instr, ... ? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done to use Kind, thanks! |
||||||||||||
Type *PhiTy = PhiR->getUnderlyingValue()->getType(); | ||||||||||||
// If tail is folded by masking, introduce selects between the phi | ||||||||||||
// and the users outside the vector region of each reduction, at the | ||||||||||||
|
@@ -9853,14 +9852,9 @@ preparePlanForEpilogueVectorLoop(VPlan &Plan, Loop *L, | |||||||||||
})); | ||||||||||||
ResumeV = cast<PHINode>(ReductionPhi->getUnderlyingInstr()) | ||||||||||||
->getIncomingValueForBlock(L->getLoopPreheader()); | ||||||||||||
const RecurrenceDescriptor &RdxDesc = | ||||||||||||
ReductionPhi->getRecurrenceDescriptor(); | ||||||||||||
RecurKind RK = RdxDesc.getRecurrenceKind(); | ||||||||||||
RecurKind RK = ReductionPhi->getRecurrenceKind(); | ||||||||||||
if (RecurrenceDescriptor::isAnyOfRecurrenceKind(RK)) { | ||||||||||||
Value *StartV = RdxResult->getOperand(1)->getLiveInIRValue(); | ||||||||||||
assert(RdxDesc.getRecurrenceStartValue() == StartV && | ||||||||||||
"start value from ComputeAnyOfResult must match"); | ||||||||||||
|
||||||||||||
// VPReductionPHIRecipes for AnyOf reductions expect a boolean as | ||||||||||||
// start value; compare the final value from the main vector loop | ||||||||||||
// to the start value. | ||||||||||||
|
@@ -9869,9 +9863,6 @@ preparePlanForEpilogueVectorLoop(VPlan &Plan, Loop *L, | |||||||||||
ResumeV = Builder.CreateICmpNE(ResumeV, StartV); | ||||||||||||
} else if (RecurrenceDescriptor::isFindIVRecurrenceKind(RK)) { | ||||||||||||
Value *StartV = getStartValueFromReductionResult(RdxResult); | ||||||||||||
assert(RdxDesc.getRecurrenceStartValue() == StartV && | ||||||||||||
"start value from ComputeFinIVResult must match"); | ||||||||||||
|
||||||||||||
ToFrozen[StartV] = cast<PHINode>(ResumeV)->getIncomingValueForBlock( | ||||||||||||
EPI.MainLoopIterationCountCheck); | ||||||||||||
|
||||||||||||
|
Original file line number | Diff line number | Diff line change | ||||||
---|---|---|---|---|---|---|---|---|
|
@@ -2192,7 +2192,7 @@ struct VPFirstOrderRecurrencePHIRecipe : public VPHeaderPHIRecipe { | |||||||
class VPReductionPHIRecipe : public VPHeaderPHIRecipe, | ||||||||
public VPUnrollPartAccessor<2> { | ||||||||
/// Descriptor for the reduction. | ||||||||
|
/// Descriptor for the reduction. | |
/// The recurrence kind of the reduction. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed thanks
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/// Create a new VPReductionPHIRecipe for the reduction \p Phi according to
/// several parameters.
(Kind
alone does not fully "describe" the reduction, as RdxDesc
did or tried to).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Trimmed the description, thanks
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
stripped thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
RecurKind getRecurrenceKind() const { return Kind; } | |
/// Returns the recurrence kind of the reduction. | |
RecurKind getRecurrenceKind() const { return Kind; } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added thanks
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -740,8 +740,8 @@ Value *VPInstruction::generate(VPTransformState &State) { | |||||
Value *ReducedPartRdx = State.get(getOperand(2)); | ||||||
for (unsigned Idx = 3; Idx < getNumOperands(); ++Idx) | ||||||
ReducedPartRdx = Builder.CreateBinOp( | ||||||
(Instruction::BinaryOps)RecurrenceDescriptor::getOpcode( | ||||||
RecurKind::AnyOf), | ||||||
static_cast<Instruction::BinaryOps>( | ||||||
RecurrenceDescriptor::getOpcode(RecurKind::AnyOf)), | ||||||
|
||||||
State.get(getOperand(Idx)), ReducedPartRdx, "bin.rdx"); | ||||||
return createAnyOfReduction(Builder, ReducedPartRdx, | ||||||
State.get(getOperand(1), VPLane(0)), OrigPhi); | ||||||
|
@@ -751,8 +751,7 @@ Value *VPInstruction::generate(VPTransformState &State) { | |||||
// and will be removed by breaking up the recipe further. | ||||||
auto *PhiR = cast<VPReductionPHIRecipe>(getOperand(0)); | ||||||
// Get its reduction variable descriptor. | ||||||
const RecurrenceDescriptor &RdxDesc = PhiR->getRecurrenceDescriptor(); | ||||||
RecurKind RK = RdxDesc.getRecurrenceKind(); | ||||||
[[maybe_unused]] RecurKind RK = PhiR->getRecurrenceKind(); | ||||||
|
[[maybe_unused]] RecurKind RK = PhiR->getRecurrenceKind(); | |
RecurKind RK = PhiR->getRecurrenceKind(); |
current RK is set w/o [[maybe_unused]]
, surely used to set IsSigned below?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yep dropped, thanks
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Change this C-style cast to a static_cast?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1, can be done independently, keeping this patch focused on the RdxDesc.getOpcode()
--> getOpcode(RK)
transition.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Will do separately, thanks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done in split off c5fff13, thanks