mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Properly verify liveness with bundled machine instructions.
Bundles should be treated as one atomic transaction when checking liveness. That is how the register allocator (and VLIW targets) treats bundles. llvm-svn: 158116
This commit is contained in:
parent
0a2c816e75
commit
5dbcc6898b
@ -191,9 +191,11 @@ namespace {
|
||||
|
||||
void visitMachineFunctionBefore();
|
||||
void visitMachineBasicBlockBefore(const MachineBasicBlock *MBB);
|
||||
void visitMachineBundleBefore(const MachineInstr *MI);
|
||||
void visitMachineInstrBefore(const MachineInstr *MI);
|
||||
void visitMachineOperand(const MachineOperand *MO, unsigned MONum);
|
||||
void visitMachineInstrAfter(const MachineInstr *MI);
|
||||
void visitMachineBundleAfter(const MachineInstr *MI);
|
||||
void visitMachineBasicBlockAfter(const MachineBasicBlock *MBB);
|
||||
void visitMachineFunctionAfter();
|
||||
|
||||
@ -288,6 +290,8 @@ bool MachineVerifier::runOnMachineFunction(MachineFunction &MF) {
|
||||
for (MachineFunction::const_iterator MFI = MF.begin(), MFE = MF.end();
|
||||
MFI!=MFE; ++MFI) {
|
||||
visitMachineBasicBlockBefore(MFI);
|
||||
// Keep track of the current bundle header.
|
||||
const MachineInstr *CurBundle = 0;
|
||||
for (MachineBasicBlock::const_instr_iterator MBBI = MFI->instr_begin(),
|
||||
MBBE = MFI->instr_end(); MBBI != MBBE; ++MBBI) {
|
||||
if (MBBI->getParent() != MFI) {
|
||||
@ -295,15 +299,21 @@ bool MachineVerifier::runOnMachineFunction(MachineFunction &MF) {
|
||||
*OS << "Instruction: " << *MBBI;
|
||||
continue;
|
||||
}
|
||||
// Skip BUNDLE instruction for now. FIXME: We should add code to verify
|
||||
// the BUNDLE's specifically.
|
||||
if (MBBI->isBundle())
|
||||
continue;
|
||||
// Is this a bundle header?
|
||||
if (!MBBI->isInsideBundle()) {
|
||||
if (CurBundle)
|
||||
visitMachineBundleAfter(CurBundle);
|
||||
CurBundle = MBBI;
|
||||
visitMachineBundleBefore(CurBundle);
|
||||
} else if (!CurBundle)
|
||||
report("No bundle header", MBBI);
|
||||
visitMachineInstrBefore(MBBI);
|
||||
for (unsigned I = 0, E = MBBI->getNumOperands(); I != E; ++I)
|
||||
visitMachineOperand(&MBBI->getOperand(I), I);
|
||||
visitMachineInstrAfter(MBBI);
|
||||
}
|
||||
if (CurBundle)
|
||||
visitMachineBundleAfter(CurBundle);
|
||||
visitMachineBasicBlockAfter(MFI);
|
||||
}
|
||||
visitMachineFunctionAfter();
|
||||
@ -575,6 +585,19 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
|
||||
lastIndex = Indexes->getMBBStartIdx(MBB);
|
||||
}
|
||||
|
||||
// This function gets called for all bundle headers, including normal
|
||||
// stand-alone unbundled instructions.
|
||||
void MachineVerifier::visitMachineBundleBefore(const MachineInstr *MI) {
|
||||
if (Indexes && Indexes->hasIndex(MI)) {
|
||||
SlotIndex idx = Indexes->getInstructionIndex(MI);
|
||||
if (!(idx > lastIndex)) {
|
||||
report("Instruction index out of order", MI);
|
||||
*OS << "Last instruction was at " << lastIndex << '\n';
|
||||
}
|
||||
lastIndex = idx;
|
||||
}
|
||||
}
|
||||
|
||||
void MachineVerifier::visitMachineInstrBefore(const MachineInstr *MI) {
|
||||
const MCInstrDesc &MCID = MI->getDesc();
|
||||
if (MI->getNumOperands() < MCID.getNumOperands()) {
|
||||
@ -865,6 +888,13 @@ void MachineVerifier::checkLiveness(const MachineOperand *MO, unsigned MONum) {
|
||||
}
|
||||
|
||||
void MachineVerifier::visitMachineInstrAfter(const MachineInstr *MI) {
|
||||
}
|
||||
|
||||
// This function gets called after visiting all instructions in a bundle. The
|
||||
// argument points to the bundle header.
|
||||
// Normal stand-alone instructions are also considered 'bundles', and this
|
||||
// function is called for all of them.
|
||||
void MachineVerifier::visitMachineBundleAfter(const MachineInstr *MI) {
|
||||
BBInfo &MInfo = MBBInfoMap[MI->getParent()];
|
||||
set_union(MInfo.regsKilled, regsKilled);
|
||||
set_subtract(regsLive, regsKilled); regsKilled.clear();
|
||||
@ -878,15 +908,6 @@ void MachineVerifier::visitMachineInstrAfter(const MachineInstr *MI) {
|
||||
}
|
||||
set_subtract(regsLive, regsDead); regsDead.clear();
|
||||
set_union(regsLive, regsDefined); regsDefined.clear();
|
||||
|
||||
if (Indexes && Indexes->hasIndex(MI)) {
|
||||
SlotIndex idx = Indexes->getInstructionIndex(MI);
|
||||
if (!(idx > lastIndex)) {
|
||||
report("Instruction index out of order", MI);
|
||||
*OS << "Last instruction was at " << lastIndex << '\n';
|
||||
}
|
||||
lastIndex = idx;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user