mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-02 22:23:10 +00:00
misched: Fix RegisterPressureTracker handling of DebugVals.
Assertion failed: (TopRPTracker.getPos() == RegionBegin && "bad initial Top tracker"). rdar://12790302. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169072 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -150,7 +150,8 @@ class RegPressureTracker {
|
|||||||
bool RequireIntervals;
|
bool RequireIntervals;
|
||||||
|
|
||||||
/// Register pressure corresponds to liveness before this instruction
|
/// Register pressure corresponds to liveness before this instruction
|
||||||
/// iterator. It may point to the end of the block rather than an instruction.
|
/// iterator. It may point to the end of the block or a DebugValue rather than
|
||||||
|
/// an instruction.
|
||||||
MachineBasicBlock::const_iterator CurrPos;
|
MachineBasicBlock::const_iterator CurrPos;
|
||||||
|
|
||||||
/// Pressure map indexed by pressure set ID, not class ID.
|
/// Pressure map indexed by pressure set ID, not class ID.
|
||||||
@@ -184,6 +185,10 @@ public:
|
|||||||
// position changes while pressure does not.
|
// position changes while pressure does not.
|
||||||
void setPos(MachineBasicBlock::const_iterator Pos) { CurrPos = Pos; }
|
void setPos(MachineBasicBlock::const_iterator Pos) { CurrPos = Pos; }
|
||||||
|
|
||||||
|
/// \brief Get the SlotIndex for the first nondebug instruction including or
|
||||||
|
/// after the current position.
|
||||||
|
SlotIndex getCurrSlot() const;
|
||||||
|
|
||||||
/// Recede across the previous instruction.
|
/// Recede across the previous instruction.
|
||||||
bool recede();
|
bool recede();
|
||||||
|
|
||||||
|
|||||||
@@ -603,7 +603,11 @@ void ScheduleDAGMI::initQueues() {
|
|||||||
|
|
||||||
SchedImpl->registerRoots();
|
SchedImpl->registerRoots();
|
||||||
|
|
||||||
|
// Advance past initial DebugValues.
|
||||||
|
assert(TopRPTracker.getPos() == RegionBegin && "bad initial Top tracker");
|
||||||
CurrentTop = nextIfDebug(RegionBegin, RegionEnd);
|
CurrentTop = nextIfDebug(RegionBegin, RegionEnd);
|
||||||
|
TopRPTracker.setPos(CurrentTop);
|
||||||
|
|
||||||
CurrentBottom = RegionEnd;
|
CurrentBottom = RegionEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,9 +181,6 @@ void RegPressureTracker::init(const MachineFunction *mf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
CurrPos = pos;
|
CurrPos = pos;
|
||||||
while (CurrPos != MBB->end() && CurrPos->isDebugValue())
|
|
||||||
++CurrPos;
|
|
||||||
|
|
||||||
CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0);
|
CurrSetPressure.assign(TRI->getNumRegPressureSets(), 0);
|
||||||
|
|
||||||
if (RequireIntervals)
|
if (RequireIntervals)
|
||||||
@@ -214,11 +211,20 @@ bool RegPressureTracker::isBottomClosed() const {
|
|||||||
MachineBasicBlock::const_iterator());
|
MachineBasicBlock::const_iterator());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SlotIndex RegPressureTracker::getCurrSlot() const {
|
||||||
|
MachineBasicBlock::const_iterator IdxPos = CurrPos;
|
||||||
|
while (IdxPos != MBB->end() && IdxPos->isDebugValue())
|
||||||
|
++IdxPos;
|
||||||
|
if (IdxPos == MBB->end())
|
||||||
|
return LIS->getMBBEndIdx(MBB);
|
||||||
|
return LIS->getInstructionIndex(IdxPos).getRegSlot();
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the boundary for the top of the region and summarize live ins.
|
/// Set the boundary for the top of the region and summarize live ins.
|
||||||
void RegPressureTracker::closeTop() {
|
void RegPressureTracker::closeTop() {
|
||||||
if (RequireIntervals)
|
if (RequireIntervals)
|
||||||
static_cast<IntervalPressure&>(P).TopIdx =
|
static_cast<IntervalPressure&>(P).TopIdx = getCurrSlot();
|
||||||
LIS->getInstructionIndex(CurrPos).getRegSlot();
|
|
||||||
else
|
else
|
||||||
static_cast<RegionPressure&>(P).TopPos = CurrPos;
|
static_cast<RegionPressure&>(P).TopPos = CurrPos;
|
||||||
|
|
||||||
@@ -236,11 +242,7 @@ void RegPressureTracker::closeTop() {
|
|||||||
/// Set the boundary for the bottom of the region and summarize live outs.
|
/// Set the boundary for the bottom of the region and summarize live outs.
|
||||||
void RegPressureTracker::closeBottom() {
|
void RegPressureTracker::closeBottom() {
|
||||||
if (RequireIntervals)
|
if (RequireIntervals)
|
||||||
if (CurrPos == MBB->end())
|
static_cast<IntervalPressure&>(P).BottomIdx = getCurrSlot();
|
||||||
static_cast<IntervalPressure&>(P).BottomIdx = LIS->getMBBEndIdx(MBB);
|
|
||||||
else
|
|
||||||
static_cast<IntervalPressure&>(P).BottomIdx =
|
|
||||||
LIS->getInstructionIndex(CurrPos).getRegSlot();
|
|
||||||
else
|
else
|
||||||
static_cast<RegionPressure&>(P).BottomPos = CurrPos;
|
static_cast<RegionPressure&>(P).BottomPos = CurrPos;
|
||||||
|
|
||||||
@@ -510,7 +512,7 @@ bool RegPressureTracker::advance() {
|
|||||||
|
|
||||||
SlotIndex SlotIdx;
|
SlotIndex SlotIdx;
|
||||||
if (RequireIntervals)
|
if (RequireIntervals)
|
||||||
SlotIdx = LIS->getInstructionIndex(CurrPos).getRegSlot();
|
SlotIdx = getCurrSlot();
|
||||||
|
|
||||||
// Open the bottom of the region using slot indexes.
|
// Open the bottom of the region using slot indexes.
|
||||||
if (isBottomClosed()) {
|
if (isBottomClosed()) {
|
||||||
@@ -769,7 +771,7 @@ void RegPressureTracker::bumpDownwardPressure(const MachineInstr *MI) {
|
|||||||
const LiveInterval *LI = &LIS->getInterval(Reg);
|
const LiveInterval *LI = &LIS->getInterval(Reg);
|
||||||
// FIXME: allow the caller to pass in the list of vreg uses that remain to
|
// FIXME: allow the caller to pass in the list of vreg uses that remain to
|
||||||
// be bottom-scheduled to avoid searching uses at each query.
|
// be bottom-scheduled to avoid searching uses at each query.
|
||||||
SlotIndex CurrIdx = LIS->getInstructionIndex(CurrPos).getRegSlot();
|
SlotIndex CurrIdx = getCurrSlot();
|
||||||
if (LI->killedAt(SlotIdx)
|
if (LI->killedAt(SlotIdx)
|
||||||
&& !findUseBetween(Reg, CurrIdx, SlotIdx, MRI, LIS)) {
|
&& !findUseBetween(Reg, CurrIdx, SlotIdx, MRI, LIS)) {
|
||||||
decreaseVirtRegPressure(Reg);
|
decreaseVirtRegPressure(Reg);
|
||||||
|
|||||||
@@ -713,17 +713,17 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
|||||||
addSchedBarrierDeps();
|
addSchedBarrierDeps();
|
||||||
|
|
||||||
// Walk the list of instructions, from bottom moving up.
|
// Walk the list of instructions, from bottom moving up.
|
||||||
MachineInstr *PrevMI = NULL;
|
MachineInstr *DbgMI = NULL;
|
||||||
for (MachineBasicBlock::iterator MII = RegionEnd, MIE = RegionBegin;
|
for (MachineBasicBlock::iterator MII = RegionEnd, MIE = RegionBegin;
|
||||||
MII != MIE; --MII) {
|
MII != MIE; --MII) {
|
||||||
MachineInstr *MI = prior(MII);
|
MachineInstr *MI = prior(MII);
|
||||||
if (MI && PrevMI) {
|
if (MI && DbgMI) {
|
||||||
DbgValues.push_back(std::make_pair(PrevMI, MI));
|
DbgValues.push_back(std::make_pair(DbgMI, MI));
|
||||||
PrevMI = NULL;
|
DbgMI = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MI->isDebugValue()) {
|
if (MI->isDebugValue()) {
|
||||||
PrevMI = MI;
|
DbgMI = MI;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (RPTracker) {
|
if (RPTracker) {
|
||||||
@@ -917,8 +917,8 @@ void ScheduleDAGInstrs::buildSchedGraph(AliasAnalysis *AA,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (PrevMI)
|
if (DbgMI)
|
||||||
FirstDbgValue = PrevMI;
|
FirstDbgValue = DbgMI;
|
||||||
|
|
||||||
Defs.clear();
|
Defs.clear();
|
||||||
Uses.clear();
|
Uses.clear();
|
||||||
|
|||||||
43
test/CodeGen/X86/2012-11-30-regpres-dbg.ll
Normal file
43
test/CodeGen/X86/2012-11-30-regpres-dbg.ll
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
; RUN: llc < %s -mtriple=x86_64-apple-macosx -enable-misched \
|
||||||
|
; RUN: -verify-machineinstrs | FileCheck %s
|
||||||
|
;
|
||||||
|
; Test RegisterPressure handling of DBG_VALUE.
|
||||||
|
;
|
||||||
|
; CHECK: %entry
|
||||||
|
; CHECK: DEBUG_VALUE: callback
|
||||||
|
; CHECK: ret
|
||||||
|
|
||||||
|
%struct.btCompoundLeafCallback = type { i32, i32 }
|
||||||
|
|
||||||
|
declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
|
||||||
|
|
||||||
|
define void @test() unnamed_addr uwtable ssp align 2 {
|
||||||
|
entry:
|
||||||
|
%callback = alloca %struct.btCompoundLeafCallback, align 8
|
||||||
|
br i1 undef, label %if.end, label %if.then
|
||||||
|
|
||||||
|
if.then: ; preds = %entry
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
if.end: ; preds = %entry
|
||||||
|
call void @llvm.dbg.declare(metadata !{%struct.btCompoundLeafCallback* %callback}, metadata !3)
|
||||||
|
%m = getelementptr inbounds %struct.btCompoundLeafCallback* %callback, i64 0, i32 1
|
||||||
|
store i32 0, i32* undef, align 8
|
||||||
|
%cmp12447 = icmp sgt i32 undef, 0
|
||||||
|
br i1 %cmp12447, label %for.body.lr.ph, label %invoke.cont44
|
||||||
|
|
||||||
|
for.body.lr.ph: ; preds = %if.end
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
invoke.cont44: ; preds = %if.end
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
!llvm.dbg.cu = !{!0}
|
||||||
|
|
||||||
|
!0 = metadata !{i32 786449, i32 0, i32 4, metadata !"MultiSource/Benchmarks/Bullet/btCompoundCollisionAlgorithm.cpp", metadata !"MultiSource/Benchmarks/Bullet", metadata !"clang version 3.3 (trunk 168984) (llvm/trunk 168983)", i1 true, i1 true, metadata !"", i32 0, metadata !1, null, null, null} ; [ DW_TAG_compile_unit ] [MultiSource/Benchmarks/Bullet/MultiSource/Benchmarks/Bullet/btCompoundCollisionAlgorithm.cpp] [DW_LANG_C_plus_plus]
|
||||||
|
!1 = metadata !{metadata !2}
|
||||||
|
!2 = metadata !{null, null}
|
||||||
|
!3 = metadata !{i32 786688, null, metadata !"callback", null, i32 214, metadata !4, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [callback] [line 214]
|
||||||
|
!4 = metadata !{i32 786451, null, metadata !"btCompoundLeafCallback", metadata !5, i32 90, i64 512, i64 64, i32 0, i32 0, null, null, i32 0, null, null} ; [ DW_TAG_structure_type ] [btCompoundLeafCallback] [line 90, size 512, align 64, offset 0] [from ]
|
||||||
|
!5 = metadata !{i32 786473, metadata !"MultiSource/Benchmarks/Bullet/btCompoundCollisionAlgorithm.cpp", metadata !"MultiSource/Benchmarks/Bullet", null} ; [ DW_TAG_file_type ]
|
||||||
Reference in New Issue
Block a user