[llvm] e1a16cd - [ExpandVectorPredication] Be more precise reporting changes (#102313)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 8 23:01:46 PDT 2024
Author: Roger Ferrer Ibáñez
Date: 2024-08-09T08:01:42+02:00
New Revision: e1a16cd88d761569025068ca94195acd77b2df7f
URL: https://github.com/llvm/llvm-project/commit/e1a16cd88d761569025068ca94195acd77b2df7f
DIFF: https://github.com/llvm/llvm-project/commit/e1a16cd88d761569025068ca94195acd77b2df7f.diff
LOG: [ExpandVectorPredication] Be more precise reporting changes (#102313)
This is used by PreISelIntrinsicLowering. With this change,
PreISelIntrinsicLowering does not have to assume that there were changes
just because we encountered a VP intrinsic.
Added:
Modified:
llvm/include/llvm/CodeGen/ExpandVectorPredication.h
llvm/lib/CodeGen/ExpandVectorPredication.cpp
llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/ExpandVectorPredication.h b/llvm/include/llvm/CodeGen/ExpandVectorPredication.h
index c42c644c99e91e..3aafb22eab6bea 100644
--- a/llvm/include/llvm/CodeGen/ExpandVectorPredication.h
+++ b/llvm/include/llvm/CodeGen/ExpandVectorPredication.h
@@ -16,10 +16,21 @@ namespace llvm {
class TargetTransformInfo;
class VPIntrinsic;
-/// Expand a vector predication intrinsic. Returns true if the intrinsic was
-/// removed/replaced.
-bool expandVectorPredicationIntrinsic(VPIntrinsic &VPI,
- const TargetTransformInfo &TTI);
+/// Represents the details the expansion of a VP intrinsic.
+enum class VPExpansionDetails {
+ /// No change happened during expansion.
+ IntrinsicUnchanged,
+ /// At least one operand was updated.
+ IntrinsicUpdated,
+ /// The whole intrinsic was replaced.
+ IntrinsicReplaced,
+};
+
+/// Expand a vector predication intrinsic. Returns the kind of expansion
+/// that was applied to the intrinsic.
+VPExpansionDetails
+expandVectorPredicationIntrinsic(VPIntrinsic &VPI,
+ const TargetTransformInfo &TTI);
} // end namespace llvm
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
index 5ffdbcda93e753..675d88d6d38cd9 100644
--- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp
+++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
@@ -160,11 +160,15 @@ struct CachingVPExpander {
Value *convertEVLToMask(IRBuilder<> &Builder, Value *EVLParam,
ElementCount ElemCount);
- Value *foldEVLIntoMask(VPIntrinsic &VPI);
+ /// If needed, folds the EVL in the mask operand and discards the EVL
+ /// parameter. Returns a pair of the value of the intrinsic after the change
+ /// (if any) and whether the mask was actually folded.
+ std::pair<Value *, bool> foldEVLIntoMask(VPIntrinsic &VPI);
/// "Remove" the %evl parameter of \p PI by setting it to the static vector
- /// length of the operation.
- void discardEVLParameter(VPIntrinsic &PI);
+ /// length of the operation. Returns true if the %evl (if any) was effectively
+ /// changed.
+ bool discardEVLParameter(VPIntrinsic &PI);
/// Lower this VP binary operator to a unpredicated binary operator.
Value *expandPredicationInBinaryOperator(IRBuilder<> &Builder,
@@ -206,7 +210,9 @@ struct CachingVPExpander {
CachingVPExpander(const TargetTransformInfo &TTI)
: TTI(TTI), UsingTTIOverrides(anyExpandVPOverridesSet()) {}
- bool expandVectorPredication(VPIntrinsic &VPI);
+ /// Expand llvm.vp.* intrinsics as requested by \p TTI.
+ /// Returns the details of the expansion.
+ VPExpansionDetails expandVectorPredication(VPIntrinsic &VPI);
};
//// CachingVPExpander {
@@ -645,15 +651,15 @@ Value *CachingVPExpander::expandPredicationInComparison(IRBuilder<> &Builder,
return NewCmp;
}
-void CachingVPExpander::discardEVLParameter(VPIntrinsic &VPI) {
+bool CachingVPExpander::discardEVLParameter(VPIntrinsic &VPI) {
LLVM_DEBUG(dbgs() << "Discard EVL parameter in " << VPI << "\n");
if (VPI.canIgnoreVectorLengthParam())
- return;
+ return false;
Value *EVLParam = VPI.getVectorLengthParam();
if (!EVLParam)
- return;
+ return false;
ElementCount StaticElemCount = VPI.getStaticVectorLength();
Value *MaxEVL = nullptr;
@@ -672,16 +678,17 @@ void CachingVPExpander::discardEVLParameter(VPIntrinsic &VPI) {
MaxEVL = ConstantInt::get(Int32Ty, StaticElemCount.getFixedValue(), false);
}
VPI.setVectorLengthParam(MaxEVL);
+ return true;
}
-Value *CachingVPExpander::foldEVLIntoMask(VPIntrinsic &VPI) {
+std::pair<Value *, bool> CachingVPExpander::foldEVLIntoMask(VPIntrinsic &VPI) {
LLVM_DEBUG(dbgs() << "Folding vlen for " << VPI << '\n');
IRBuilder<> Builder(&VPI);
// Ineffective %evl parameter and so nothing to do here.
if (VPI.canIgnoreVectorLengthParam())
- return &VPI;
+ return {&VPI, false};
// Only VP intrinsics can have an %evl parameter.
Value *OldMaskParam = VPI.getMaskParam();
@@ -704,7 +711,7 @@ Value *CachingVPExpander::foldEVLIntoMask(VPIntrinsic &VPI) {
"transformation did not render the evl param ineffective!");
// Reassess the modified instruction.
- return &VPI;
+ return {&VPI, true};
}
Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) {
@@ -807,21 +814,27 @@ CachingVPExpander::getVPLegalizationStrategy(const VPIntrinsic &VPI) const {
return VPStrat;
}
-/// Expand llvm.vp.* intrinsics as requested by \p TTI.
-bool CachingVPExpander::expandVectorPredication(VPIntrinsic &VPI) {
+VPExpansionDetails
+CachingVPExpander::expandVectorPredication(VPIntrinsic &VPI) {
auto Strategy = getVPLegalizationStrategy(VPI);
sanitizeStrategy(VPI, Strategy);
+ VPExpansionDetails Changed = VPExpansionDetails::IntrinsicUnchanged;
+
// Transform the EVL parameter.
switch (Strategy.EVLParamStrategy) {
case VPLegalization::Legal:
break;
case VPLegalization::Discard:
- discardEVLParameter(VPI);
+ if (discardEVLParameter(VPI))
+ Changed = VPExpansionDetails::IntrinsicUpdated;
break;
case VPLegalization::Convert:
- if (foldEVLIntoMask(VPI))
+ if (auto [NewVPI, Folded] = foldEVLIntoMask(VPI); Folded) {
+ (void)NewVPI;
+ Changed = VPExpansionDetails::IntrinsicUpdated;
++NumFoldedVL;
+ }
break;
}
@@ -834,17 +847,17 @@ bool CachingVPExpander::expandVectorPredication(VPIntrinsic &VPI) {
case VPLegalization::Convert:
if (Value *V = expandPredication(VPI); V != &VPI) {
++NumLoweredVPOps;
- // Return true if and only if the intrinsic was actually removed.
- return true;
+ Changed = VPExpansionDetails::IntrinsicReplaced;
}
break;
}
- return false;
+ return Changed;
}
} // namespace
-bool llvm::expandVectorPredicationIntrinsic(VPIntrinsic &VPI,
- const TargetTransformInfo &TTI) {
+VPExpansionDetails
+llvm::expandVectorPredicationIntrinsic(VPIntrinsic &VPI,
+ const TargetTransformInfo &TTI) {
return CachingVPExpander(TTI).expandVectorPredication(VPI);
}
diff --git a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
index 0df90f402aaf48..3373b76edb268f 100644
--- a/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
+++ b/llvm/lib/CodeGen/PreISelIntrinsicLowering.cpp
@@ -361,10 +361,14 @@ bool PreISelIntrinsicLowering::lowerIntrinsics(Module &M) const {
Function *Parent = CI->getParent()->getParent();
const TargetTransformInfo &TTI = LookupTTI(*Parent);
auto *VPI = cast<VPIntrinsic>(CI);
- return expandVectorPredicationIntrinsic(*VPI, TTI);
+ VPExpansionDetails ED = expandVectorPredicationIntrinsic(*VPI, TTI);
+ // Expansion of VP intrinsics may change the IR but not actually
+ // replace the intrinsic, so update Changed for the pass
+ // and compute Removed for forEachCall.
+ Changed |= ED != VPExpansionDetails::IntrinsicUnchanged;
+ bool Removed = ED == VPExpansionDetails::IntrinsicReplaced;
+ return Removed;
});
- // Not all intrinsics are removed, but the code is changed in any case.
- Changed = true;
break;
case Intrinsic::objc_autorelease:
Changed |= lowerObjCCall(F, "objc_autorelease");
More information about the llvm-commits
mailing list