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:
parent
f57215c328
commit
28d16f3586
@ -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.
|
||||||
|
@ -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()) {
|
||||||
|
@ -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
|
||||||
|
@ -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 };
|
||||||
|
@ -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;
|
||||||
|
@ -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(
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user