[llvm] [AMDGPU] Filter candidates of LiveRegOptimizer for profitable cases (PR #124624)
Jeffrey Byrnes via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 14 15:57:31 PST 2025
================
@@ -125,8 +131,210 @@ class LiveRegOptimizer {
return LK.first != TargetLoweringBase::TypeLegal;
}
- LiveRegOptimizer(Module &Mod, const GCNSubtarget &ST)
- : Mod(Mod), DL(Mod.getDataLayout()), ST(ST),
+ // Filtering based on operation or its cost.
+ // If an operation incurs high enough cost or natively work on
+ // vector of illegal type, ie. v2i8, then it makes sense to try
+ // to coerce them as packed VGPR across BB.
+ bool shouldReplaceByOp(Instruction *II) {
+ static const int SCALARIZE_INST_COST = 2;
+ static const int LRO_COST_THRES = 12;
+
+ // Ignore pseudos
+ if (II->isDebugOrPseudoInst())
+ return false;
+
+ // Instruction Cost
+ auto Cost = TTI.getInstructionCost(
+ II, TargetTransformInfo::TargetCostKind::TCK_SizeAndLatency);
+ if (const auto *Def = II->getOperand(0)) {
+ if (const auto *DefTy = dyn_cast<FixedVectorType>(Def->getType())) {
+ const auto *ElTy = dyn_cast<IntegerType>(DefTy->getElementType());
+ // Assume vNi8 and vNi16 will be scalarized.
+ if (ElTy && ElTy->getBitWidth() <= 16) {
+ const auto ElCount = DefTy->getElementCount().getFixedValue();
+ Cost += SCALARIZE_INST_COST * ElCount;
+ }
+ }
+ }
+ LLVM_DEBUG(dbgs() << "shouldReplaceByOp: " << *II << " Cost=" << Cost
+ << '\n';);
+ if (Cost >= LRO_COST_THRES)
+ return true;
+
+ if (isOpLegal(II))
+ return true;
+
+ return false;
+ }
+
+ /// Check if intrinsic natively operates on 8-bit or 16-bit
+ bool isNativeIntrinsic(Intrinsic::ID ID) {
----------------
jrbyrnes wrote:
We don't need all the dot / mfma / wmma variants -- just the 8 and 4 bit ones.
https://github.com/llvm/llvm-project/pull/124624
More information about the llvm-commits
mailing list