mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-28 13:51:09 +00:00
[ModuloSchedule] Make PeelingModuloScheduleExpander inheritable.
Basically a NFC, but allows subclasses access to the entire PeelingModuloScheduleExpander class. We are doing this to allow backends, particularly one that are not necessarily upstreamed, to inherit from PeelingModuloScheduleExpander and access its basic structures. Renames Info into LoopInfo for consistency in PeelingModuloScheduleExpander. Differential Revision: https://reviews.llvm.org/D82673
This commit is contained in:
parent
097a2b8949
commit
2be3dfa59d
@ -277,6 +277,19 @@ public:
|
||||
/// A reimplementation of ModuloScheduleExpander. It works by generating a
|
||||
/// standalone kernel loop and peeling out the prologs and epilogs.
|
||||
class PeelingModuloScheduleExpander {
|
||||
public:
|
||||
PeelingModuloScheduleExpander(MachineFunction &MF, ModuloSchedule &S,
|
||||
LiveIntervals *LIS)
|
||||
: Schedule(S), MF(MF), ST(MF.getSubtarget()), MRI(MF.getRegInfo()),
|
||||
TII(ST.getInstrInfo()), LIS(LIS) {}
|
||||
|
||||
virtual void expand();
|
||||
|
||||
/// Runs ModuloScheduleExpander and treats it as a golden input to validate
|
||||
/// aspects of the code generated by PeelingModuloScheduleExpander.
|
||||
void validateAgainstModuloScheduleExpander();
|
||||
|
||||
protected:
|
||||
ModuloSchedule &Schedule;
|
||||
MachineFunction &MF;
|
||||
const TargetSubtargetInfo &ST;
|
||||
@ -311,24 +324,10 @@ class PeelingModuloScheduleExpander {
|
||||
/// Illegal phis that need to be deleted once we re-link stages.
|
||||
SmallVector<MachineInstr *, 4> IllegalPhisToDelete;
|
||||
|
||||
public:
|
||||
PeelingModuloScheduleExpander(MachineFunction &MF, ModuloSchedule &S,
|
||||
LiveIntervals *LIS)
|
||||
: Schedule(S), MF(MF), ST(MF.getSubtarget()), MRI(MF.getRegInfo()),
|
||||
TII(ST.getInstrInfo()), LIS(LIS) {}
|
||||
|
||||
void expand();
|
||||
|
||||
/// Runs ModuloScheduleExpander and treats it as a golden input to validate
|
||||
/// aspects of the code generated by PeelingModuloScheduleExpander.
|
||||
void validateAgainstModuloScheduleExpander();
|
||||
|
||||
protected:
|
||||
/// Converts BB from the original loop body to the rewritten, pipelined
|
||||
/// steady-state.
|
||||
void rewriteKernel();
|
||||
|
||||
private:
|
||||
/// Peels one iteration of the rewritten kernel (BB) in the specified
|
||||
/// direction.
|
||||
MachineBasicBlock *peelKernel(LoopPeelDirection LPD);
|
||||
@ -364,7 +363,7 @@ private:
|
||||
/// coming from a peeled out prologue.
|
||||
Register getPhiCanonicalReg(MachineInstr* CanonicalPhi, MachineInstr* Phi);
|
||||
/// Target loop info before kernel peeling.
|
||||
std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo> Info;
|
||||
std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo> LoopInfo;
|
||||
};
|
||||
|
||||
/// Expander that simply annotates each scheduled instruction with a post-instr
|
||||
|
@ -1947,7 +1947,7 @@ void PeelingModuloScheduleExpander::fixupBranches() {
|
||||
SmallVector<MachineOperand, 4> Cond;
|
||||
TII->removeBranch(*Prolog);
|
||||
Optional<bool> StaticallyGreater =
|
||||
Info->createTripCountGreaterCondition(TC, *Prolog, Cond);
|
||||
LoopInfo->createTripCountGreaterCondition(TC, *Prolog, Cond);
|
||||
if (!StaticallyGreater.hasValue()) {
|
||||
LLVM_DEBUG(dbgs() << "Dynamic: TC > " << TC << "\n");
|
||||
// Dynamically branch based on Cond.
|
||||
@ -1975,10 +1975,10 @@ void PeelingModuloScheduleExpander::fixupBranches() {
|
||||
}
|
||||
|
||||
if (!KernelDisposed) {
|
||||
Info->adjustTripCount(-(Schedule.getNumStages() - 1));
|
||||
Info->setPreheader(Prologs.back());
|
||||
LoopInfo->adjustTripCount(-(Schedule.getNumStages() - 1));
|
||||
LoopInfo->setPreheader(Prologs.back());
|
||||
} else {
|
||||
Info->disposed();
|
||||
LoopInfo->disposed();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1991,8 +1991,8 @@ void PeelingModuloScheduleExpander::expand() {
|
||||
BB = Schedule.getLoop()->getTopBlock();
|
||||
Preheader = Schedule.getLoop()->getLoopPreheader();
|
||||
LLVM_DEBUG(Schedule.dump());
|
||||
Info = TII->analyzeLoopForPipelining(BB);
|
||||
assert(Info);
|
||||
LoopInfo = TII->analyzeLoopForPipelining(BB);
|
||||
assert(LoopInfo);
|
||||
|
||||
rewriteKernel();
|
||||
peelPrologAndEpilogs();
|
||||
|
Loading…
Reference in New Issue
Block a user