mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
MI Sched: eliminate local vreg copies.
For now, we just reschedule instructions that use the copied vregs and let regalloc elliminate it. I would really like to eliminate the copies on-the-fly during scheduling, but we need a complete implementation of repairIntervalsInRange() first. The general strategy is for the register coalescer to eliminate as many global copies as possible and shrink live ranges to be extended-basic-block local. The coalescer should not have to worry about resolving local copies (e.g. it shouldn't attemp to reorder instructions). The scheduler is a much better place to deal with local interference. The coalescer side of this equation needs work. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180193 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -399,6 +399,15 @@ namespace llvm {
|
||||
return r != end() && r->containsRange(Start, End);
|
||||
}
|
||||
|
||||
/// True iff this live range is a single segment that lies between the
|
||||
/// specified boundaries, exclusively. Vregs live across a backedge are not
|
||||
/// considered local. The boundaries are expected to lie within an extended
|
||||
/// basic block, so vregs that are not live out should contain no holes.
|
||||
bool isLocal(SlotIndex Start, SlotIndex End) const {
|
||||
return beginIndex() > Start.getBaseIndex() &&
|
||||
endIndex() < End.getBoundaryIndex();
|
||||
}
|
||||
|
||||
/// removeRange - Remove the specified range from this interval. Note that
|
||||
/// the range must be a single LiveRange in its entirety.
|
||||
void removeRange(SlotIndex Start, SlotIndex End,
|
||||
|
@@ -274,6 +274,10 @@ public:
|
||||
Mutations.push_back(Mutation);
|
||||
}
|
||||
|
||||
/// \brief True if an edge can be added from PredSU to SuccSU without creating
|
||||
/// a cycle.
|
||||
bool canAddEdge(SUnit *SuccSU, SUnit *PredSU);
|
||||
|
||||
/// \brief Add a DAG edge to the given SU with the given predecessor
|
||||
/// dependence data.
|
||||
///
|
||||
|
@@ -727,9 +727,8 @@ namespace llvm {
|
||||
/// IsReachable - Checks if SU is reachable from TargetSU.
|
||||
bool IsReachable(const SUnit *SU, const SUnit *TargetSU);
|
||||
|
||||
/// WillCreateCycle - Returns true if adding an edge from SU to TargetSU
|
||||
/// will create a cycle.
|
||||
bool WillCreateCycle(SUnit *SU, SUnit *TargetSU);
|
||||
/// WillCreateCycle - Return true if addPred(TargetSU, SU) creates a cycle.
|
||||
bool WillCreateCycle(SUnit *TargetSU, SUnit *SU);
|
||||
|
||||
/// AddPred - Updates the topological ordering to accommodate an edge
|
||||
/// to be added from SUnit X to SUnit Y.
|
||||
|
@@ -150,6 +150,9 @@ namespace llvm {
|
||||
|
||||
virtual ~ScheduleDAGInstrs() {}
|
||||
|
||||
/// \brief Expose LiveIntervals for use in DAG mutators and such.
|
||||
LiveIntervals *getLIS() const { return LIS; }
|
||||
|
||||
/// \brief Get the machine model for instruction scheduling.
|
||||
const TargetSchedModel *getSchedModel() const { return &SchedModel; }
|
||||
|
||||
|
Reference in New Issue
Block a user