1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 05:01:59 +01:00

[MachineCombiner][NFC] Add MustReduceRegisterPressure goal

add a new goal MustReduceRegisterPressure for machine combiner pass.

PowerPC will use this new goal to do some register pressure related optimization.

Reviewed By: spatel

Differential Revision: https://reviews.llvm.org/D92068
This commit is contained in:
Chen Zheng 2020-11-24 21:33:13 -05:00
parent f57215c328
commit 28d16f3586
7 changed files with 98 additions and 23 deletions

View File

@ -25,6 +25,7 @@
#include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineOutliner.h" #include "llvm/CodeGen/MachineOutliner.h"
#include "llvm/CodeGen/RegisterClassInfo.h"
#include "llvm/CodeGen/VirtRegMap.h" #include "llvm/CodeGen/VirtRegMap.h"
#include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCInstrInfo.h"
#include "llvm/Support/BranchProbability.h" #include "llvm/Support/BranchProbability.h"
@ -1076,9 +1077,23 @@ public:
/// faster sequence. /// faster sequence.
/// \param Root - Instruction that could be combined with one of its operands /// \param Root - Instruction that could be combined with one of its operands
/// \param Patterns - Vector of possible combination patterns /// \param Patterns - Vector of possible combination patterns
virtual bool getMachineCombinerPatterns( virtual bool
MachineInstr &Root, getMachineCombinerPatterns(MachineInstr &Root,
SmallVectorImpl<MachineCombinerPattern> &Patterns) const; SmallVectorImpl<MachineCombinerPattern> &Patterns,
bool DoRegPressureReduce) const;
/// Return true if target supports reassociation of instructions in machine
/// combiner pass to reduce register pressure for a given BB.
virtual bool
shouldReduceRegisterPressure(MachineBasicBlock *MBB,
RegisterClassInfo *RegClassInfo) const {
return false;
}
/// Fix up the placeholder we may add in genAlternativeCodeSequence().
virtual void
finalizeInsInstrs(MachineInstr &Root, MachineCombinerPattern &P,
SmallVectorImpl<MachineInstr *> &InsInstrs) const {}
/// Return true when a code sequence can improve throughput. It /// Return true when a code sequence can improve throughput. It
/// should be called only for instructions in loops. /// should be called only for instructions in loops.

View File

@ -22,6 +22,7 @@
#include "llvm/CodeGen/MachineSizeOpts.h" #include "llvm/CodeGen/MachineSizeOpts.h"
#include "llvm/CodeGen/MachineTraceMetrics.h" #include "llvm/CodeGen/MachineTraceMetrics.h"
#include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/RegisterClassInfo.h"
#include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSchedule.h" #include "llvm/CodeGen/TargetSchedule.h"
@ -72,6 +73,7 @@ class MachineCombiner : public MachineFunctionPass {
MachineTraceMetrics::Ensemble *MinInstr; MachineTraceMetrics::Ensemble *MinInstr;
MachineBlockFrequencyInfo *MBFI; MachineBlockFrequencyInfo *MBFI;
ProfileSummaryInfo *PSI; ProfileSummaryInfo *PSI;
RegisterClassInfo RegClassInfo;
TargetSchedModel TSchedModel; TargetSchedModel TSchedModel;
@ -103,6 +105,10 @@ private:
SmallVectorImpl<MachineInstr *> &DelInstrs, SmallVectorImpl<MachineInstr *> &DelInstrs,
DenseMap<unsigned, unsigned> &InstrIdxForVirtReg, DenseMap<unsigned, unsigned> &InstrIdxForVirtReg,
MachineCombinerPattern Pattern, bool SlackIsAccurate); MachineCombinerPattern Pattern, bool SlackIsAccurate);
bool reduceRegisterPressure(MachineInstr &Root, MachineBasicBlock *MBB,
SmallVectorImpl<MachineInstr *> &InsInstrs,
SmallVectorImpl<MachineInstr *> &DelInstrs,
MachineCombinerPattern Pattern);
bool preservesResourceLen(MachineBasicBlock *MBB, bool preservesResourceLen(MachineBasicBlock *MBB,
MachineTraceMetrics::Trace BlockTrace, MachineTraceMetrics::Trace BlockTrace,
SmallVectorImpl<MachineInstr *> &InsInstrs, SmallVectorImpl<MachineInstr *> &InsInstrs,
@ -257,8 +263,9 @@ unsigned MachineCombiner::getLatency(MachineInstr *Root, MachineInstr *NewRoot,
/// The combiner's goal may differ based on which pattern it is attempting /// The combiner's goal may differ based on which pattern it is attempting
/// to optimize. /// to optimize.
enum class CombinerObjective { enum class CombinerObjective {
MustReduceDepth, // The data dependency chain must be improved. MustReduceDepth, // The data dependency chain must be improved.
Default // The critical path must not be lengthened. MustReduceRegisterPressure, // The register pressure must be reduced.
Default // The critical path must not be lengthened.
}; };
static CombinerObjective getCombinerObjective(MachineCombinerPattern P) { static CombinerObjective getCombinerObjective(MachineCombinerPattern P) {
@ -300,6 +307,18 @@ std::pair<unsigned, unsigned> MachineCombiner::getLatenciesForInstrSequences(
return {NewRootLatency, RootLatency}; return {NewRootLatency, RootLatency};
} }
bool MachineCombiner::reduceRegisterPressure(
MachineInstr &Root, MachineBasicBlock *MBB,
SmallVectorImpl<MachineInstr *> &InsInstrs,
SmallVectorImpl<MachineInstr *> &DelInstrs,
MachineCombinerPattern Pattern) {
// FIXME: for now, we don't do any check for the register pressure patterns.
// We treat them as always profitable. But we can do better if we make
// RegPressureTracker class be aware of TIE attribute. Then we can get an
// accurate compare of register pressure with DelInstrs or InsInstrs.
return true;
}
/// The DAGCombine code sequence ends in MI (Machine Instruction) Root. /// The DAGCombine code sequence ends in MI (Machine Instruction) Root.
/// The new code sequence ends in MI NewRoot. A necessary condition for the new /// The new code sequence ends in MI NewRoot. A necessary condition for the new
/// sequence to replace the old sequence is that it cannot lengthen the critical /// sequence to replace the old sequence is that it cannot lengthen the critical
@ -438,6 +457,8 @@ bool MachineCombiner::doSubstitute(unsigned NewSize, unsigned OldSize,
/// \param DelInstrs instruction to delete from \p MBB /// \param DelInstrs instruction to delete from \p MBB
/// \param MinInstr is a pointer to the machine trace information /// \param MinInstr is a pointer to the machine trace information
/// \param RegUnits set of live registers, needed to compute instruction depths /// \param RegUnits set of live registers, needed to compute instruction depths
/// \param TII is target instruction info, used to call target hook
/// \param Pattern is used to call target hook finalizeInsInstrs
/// \param IncrementalUpdate if true, compute instruction depths incrementally, /// \param IncrementalUpdate if true, compute instruction depths incrementally,
/// otherwise invalidate the trace /// otherwise invalidate the trace
static void insertDeleteInstructions(MachineBasicBlock *MBB, MachineInstr &MI, static void insertDeleteInstructions(MachineBasicBlock *MBB, MachineInstr &MI,
@ -445,7 +466,18 @@ static void insertDeleteInstructions(MachineBasicBlock *MBB, MachineInstr &MI,
SmallVector<MachineInstr *, 16> DelInstrs, SmallVector<MachineInstr *, 16> DelInstrs,
MachineTraceMetrics::Ensemble *MinInstr, MachineTraceMetrics::Ensemble *MinInstr,
SparseSet<LiveRegUnit> &RegUnits, SparseSet<LiveRegUnit> &RegUnits,
const TargetInstrInfo *TII,
MachineCombinerPattern Pattern,
bool IncrementalUpdate) { bool IncrementalUpdate) {
// If we want to fix up some placeholder for some target, do it now.
// We need this because in genAlternativeCodeSequence, we have not decided the
// better pattern InsInstrs or DelInstrs, so we don't want generate some
// sideeffect to the function. For example we need to delay the constant pool
// entry creation here after InsInstrs is selected as better pattern.
// Otherwise the constant pool entry created for InsInstrs will not be deleted
// even if InsInstrs is not the better pattern.
TII->finalizeInsInstrs(MI, Pattern, InsInstrs);
for (auto *InstrPtr : InsInstrs) for (auto *InstrPtr : InsInstrs)
MBB->insert((MachineBasicBlock::iterator)&MI, InstrPtr); MBB->insert((MachineBasicBlock::iterator)&MI, InstrPtr);
@ -522,6 +554,9 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
bool OptForSize = OptSize || llvm::shouldOptimizeForSize(MBB, PSI, MBFI); bool OptForSize = OptSize || llvm::shouldOptimizeForSize(MBB, PSI, MBFI);
bool DoRegPressureReduce =
TII->shouldReduceRegisterPressure(MBB, &RegClassInfo);
while (BlockIter != MBB->end()) { while (BlockIter != MBB->end()) {
auto &MI = *BlockIter++; auto &MI = *BlockIter++;
SmallVector<MachineCombinerPattern, 16> Patterns; SmallVector<MachineCombinerPattern, 16> Patterns;
@ -552,7 +587,7 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
// machine-combiner-verify-pattern-order is enabled, all patterns are // machine-combiner-verify-pattern-order is enabled, all patterns are
// checked to ensure later patterns do not provide better latency savings. // checked to ensure later patterns do not provide better latency savings.
if (!TII->getMachineCombinerPatterns(MI, Patterns)) if (!TII->getMachineCombinerPatterns(MI, Patterns, DoRegPressureReduce))
continue; continue;
if (VerifyPatternOrder) if (VerifyPatternOrder)
@ -588,12 +623,33 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
if (ML && TII->isThroughputPattern(P)) if (ML && TII->isThroughputPattern(P))
SubstituteAlways = true; SubstituteAlways = true;
if (IncrementalUpdate) { if (IncrementalUpdate && LastUpdate != BlockIter) {
// Update depths since the last incremental update. // Update depths since the last incremental update.
MinInstr->updateDepths(LastUpdate, BlockIter, RegUnits); MinInstr->updateDepths(LastUpdate, BlockIter, RegUnits);
LastUpdate = BlockIter; LastUpdate = BlockIter;
} }
if (DoRegPressureReduce &&
getCombinerObjective(P) ==
CombinerObjective::MustReduceRegisterPressure) {
if (MBB->size() > inc_threshold) {
// Use incremental depth updates for basic blocks above threshold
IncrementalUpdate = true;
LastUpdate = BlockIter;
}
if (reduceRegisterPressure(MI, MBB, InsInstrs, DelInstrs, P)) {
// Replace DelInstrs with InsInstrs.
insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, MinInstr,
RegUnits, TII, P, IncrementalUpdate);
Changed |= true;
// Go back to previous instruction as it may have ILP reassociation
// opportunity.
BlockIter--;
break;
}
}
// Substitute when we optimize for codesize and the new sequence has // Substitute when we optimize for codesize and the new sequence has
// fewer instructions OR // fewer instructions OR
// the new sequence neither lengthens the critical path nor increases // the new sequence neither lengthens the critical path nor increases
@ -601,7 +657,7 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
if (SubstituteAlways || if (SubstituteAlways ||
doSubstitute(NewInstCount, OldInstCount, OptForSize)) { doSubstitute(NewInstCount, OldInstCount, OptForSize)) {
insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, MinInstr, insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, MinInstr,
RegUnits, IncrementalUpdate); RegUnits, TII, P, IncrementalUpdate);
// Eagerly stop after the first pattern fires. // Eagerly stop after the first pattern fires.
Changed = true; Changed = true;
break; break;
@ -624,7 +680,7 @@ bool MachineCombiner::combineInstructions(MachineBasicBlock *MBB) {
} }
insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, MinInstr, insertDeleteInstructions(MBB, MI, InsInstrs, DelInstrs, MinInstr,
RegUnits, IncrementalUpdate); RegUnits, TII, P, IncrementalUpdate);
// Eagerly stop after the first pattern fires. // Eagerly stop after the first pattern fires.
Changed = true; Changed = true;
@ -660,6 +716,7 @@ bool MachineCombiner::runOnMachineFunction(MachineFunction &MF) {
nullptr; nullptr;
MinInstr = nullptr; MinInstr = nullptr;
OptSize = MF.getFunction().hasOptSize(); OptSize = MF.getFunction().hasOptSize();
RegClassInfo.runOnMachineFunction(MF);
LLVM_DEBUG(dbgs() << getPassName() << ": " << MF.getName() << '\n'); LLVM_DEBUG(dbgs() << getPassName() << ": " << MF.getName() << '\n');
if (!TII->useMachineCombiner()) { if (!TII->useMachineCombiner()) {

View File

@ -778,8 +778,8 @@ bool TargetInstrInfo::isReassociationCandidate(const MachineInstr &Inst,
// instruction is known to not increase the critical path, then don't match // instruction is known to not increase the critical path, then don't match
// that pattern. // that pattern.
bool TargetInstrInfo::getMachineCombinerPatterns( bool TargetInstrInfo::getMachineCombinerPatterns(
MachineInstr &Root, MachineInstr &Root, SmallVectorImpl<MachineCombinerPattern> &Patterns,
SmallVectorImpl<MachineCombinerPattern> &Patterns) const { bool DoRegPressureReduce) const {
bool Commute; bool Commute;
if (isReassociationCandidate(Root, Commute)) { if (isReassociationCandidate(Root, Commute)) {
// We found a sequence of instructions that may be suitable for a // We found a sequence of instructions that may be suitable for a

View File

@ -4508,8 +4508,8 @@ bool AArch64InstrInfo::isThroughputPattern(
/// pattern evaluator stops checking as soon as it finds a faster sequence. /// pattern evaluator stops checking as soon as it finds a faster sequence.
bool AArch64InstrInfo::getMachineCombinerPatterns( bool AArch64InstrInfo::getMachineCombinerPatterns(
MachineInstr &Root, MachineInstr &Root, SmallVectorImpl<MachineCombinerPattern> &Patterns,
SmallVectorImpl<MachineCombinerPattern> &Patterns) const { bool DoRegPressureReduce) const {
// Integer patterns // Integer patterns
if (getMaddPatterns(Root, Patterns)) if (getMaddPatterns(Root, Patterns))
return true; return true;
@ -4517,7 +4517,8 @@ bool AArch64InstrInfo::getMachineCombinerPatterns(
if (getFMAPatterns(Root, Patterns)) if (getFMAPatterns(Root, Patterns))
return true; return true;
return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns); return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns,
DoRegPressureReduce);
} }
enum class FMAInstKind { Default, Indexed, Accumulator }; enum class FMAInstKind { Default, Indexed, Accumulator };

View File

@ -235,9 +235,10 @@ public:
/// Return true when there is potentially a faster code sequence /// Return true when there is potentially a faster code sequence
/// for an instruction chain ending in ``Root``. All potential patterns are /// for an instruction chain ending in ``Root``. All potential patterns are
/// listed in the ``Patterns`` array. /// listed in the ``Patterns`` array.
bool getMachineCombinerPatterns( bool
MachineInstr &Root, getMachineCombinerPatterns(MachineInstr &Root,
SmallVectorImpl<MachineCombinerPattern> &Patterns) const override; SmallVectorImpl<MachineCombinerPattern> &Patterns,
bool DoRegPressureReduce) const override;
/// Return true when Inst is associative and commutative so that it can be /// Return true when Inst is associative and commutative so that it can be
/// reassociated. /// reassociated.
bool isAssociativeAndCommutative(const MachineInstr &Inst) const override; bool isAssociativeAndCommutative(const MachineInstr &Inst) const override;

View File

@ -421,8 +421,8 @@ bool PPCInstrInfo::getFMAPatterns(
} }
bool PPCInstrInfo::getMachineCombinerPatterns( bool PPCInstrInfo::getMachineCombinerPatterns(
MachineInstr &Root, MachineInstr &Root, SmallVectorImpl<MachineCombinerPattern> &Patterns,
SmallVectorImpl<MachineCombinerPattern> &Patterns) const { bool DoRegPressureReduce) const {
// Using the machine combiner in this way is potentially expensive, so // Using the machine combiner in this way is potentially expensive, so
// restrict to when aggressive optimizations are desired. // restrict to when aggressive optimizations are desired.
if (Subtarget.getTargetMachine().getOptLevel() != CodeGenOpt::Aggressive) if (Subtarget.getTargetMachine().getOptLevel() != CodeGenOpt::Aggressive)
@ -431,7 +431,8 @@ bool PPCInstrInfo::getMachineCombinerPatterns(
if (getFMAPatterns(Root, Patterns)) if (getFMAPatterns(Root, Patterns))
return true; return true;
return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns); return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns,
DoRegPressureReduce);
} }
void PPCInstrInfo::genAlternativeCodeSequence( void PPCInstrInfo::genAlternativeCodeSequence(

View File

@ -348,9 +348,9 @@ public:
/// Return true when there is potentially a faster code sequence /// Return true when there is potentially a faster code sequence
/// for an instruction chain ending in <Root>. All potential patterns are /// for an instruction chain ending in <Root>. All potential patterns are
/// output in the <Pattern> array. /// output in the <Pattern> array.
bool getMachineCombinerPatterns( bool getMachineCombinerPatterns(MachineInstr &Root,
MachineInstr &Root, SmallVectorImpl<MachineCombinerPattern> &P,
SmallVectorImpl<MachineCombinerPattern> &P) const override; bool DoRegPressureReduce) const override;
bool isAssociativeAndCommutative(const MachineInstr &Inst) const override; bool isAssociativeAndCommutative(const MachineInstr &Inst) const override;