mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
Remove double-def checking from MachineVerifier, so a register does not have to
be killed before being redefined. These checks are usually disabled, and usually fail when enabled. We de facto allow live registers to be redefined without a kill, the corresponding assertions in RegScavenger were removed long ago. llvm-svn: 110362
This commit is contained in:
parent
4ba3c0a5e1
commit
21e64c3fae
@ -266,7 +266,7 @@ public:
|
||||
|
||||
/// verify - Run the current MachineFunction through the machine code
|
||||
/// verifier, useful for debugger use.
|
||||
void verify(Pass *p=NULL, bool allowDoubleDefs=false) const;
|
||||
void verify(Pass *p=NULL) const;
|
||||
|
||||
// Provide accessors for the MachineBasicBlock list...
|
||||
typedef BasicBlockListType::iterator iterator;
|
||||
|
@ -188,10 +188,7 @@ namespace llvm {
|
||||
|
||||
/// createMachineVerifierPass - This pass verifies cenerated machine code
|
||||
/// instructions for correctness.
|
||||
///
|
||||
/// @param allowDoubleDefs ignore double definitions of
|
||||
/// registers. Useful before LiveVariables has run.
|
||||
FunctionPass *createMachineVerifierPass(bool allowDoubleDefs);
|
||||
FunctionPass *createMachineVerifierPass();
|
||||
|
||||
/// createDwarfEHPass - This pass mulches exception handling code into a form
|
||||
/// adapted to code generation. Required if using dwarf exception handling.
|
||||
|
@ -236,13 +236,12 @@ static void printNoVerify(PassManagerBase &PM, const char *Banner) {
|
||||
}
|
||||
|
||||
static void printAndVerify(PassManagerBase &PM,
|
||||
const char *Banner,
|
||||
bool allowDoubleDefs = false) {
|
||||
const char *Banner) {
|
||||
if (PrintMachineCode)
|
||||
PM.add(createMachineFunctionPrinterPass(dbgs(), Banner));
|
||||
|
||||
if (VerifyMachineCode)
|
||||
PM.add(createMachineVerifierPass(allowDoubleDefs));
|
||||
PM.add(createMachineVerifierPass());
|
||||
}
|
||||
|
||||
/// addCommonCodeGenPasses - Add standard LLVM codegen passes used for both
|
||||
@ -339,8 +338,7 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
|
||||
return true;
|
||||
|
||||
// Print the instruction selected machine code...
|
||||
printAndVerify(PM, "After Instruction Selection",
|
||||
/* allowDoubleDefs= */ true);
|
||||
printAndVerify(PM, "After Instruction Selection");
|
||||
|
||||
// Optimize PHIs before DCE: removing dead PHI cycles may make more
|
||||
// instructions dead.
|
||||
@ -353,8 +351,7 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
|
||||
// used by tail calls, where the tail calls reuse the incoming stack
|
||||
// arguments directly (see t11 in test/CodeGen/X86/sibcall.ll).
|
||||
PM.add(createDeadMachineInstructionElimPass());
|
||||
printAndVerify(PM, "After codegen DCE pass",
|
||||
/* allowDoubleDefs= */ true);
|
||||
printAndVerify(PM, "After codegen DCE pass");
|
||||
|
||||
PM.add(createOptimizeExtsPass());
|
||||
if (!DisableMachineLICM)
|
||||
@ -362,21 +359,18 @@ bool LLVMTargetMachine::addCommonCodeGenPasses(PassManagerBase &PM,
|
||||
PM.add(createMachineCSEPass());
|
||||
if (!DisableMachineSink)
|
||||
PM.add(createMachineSinkingPass());
|
||||
printAndVerify(PM, "After Machine LICM, CSE and Sinking passes",
|
||||
/* allowDoubleDefs= */ true);
|
||||
printAndVerify(PM, "After Machine LICM, CSE and Sinking passes");
|
||||
}
|
||||
|
||||
// Pre-ra tail duplication.
|
||||
if (OptLevel != CodeGenOpt::None && !DisableEarlyTailDup) {
|
||||
PM.add(createTailDuplicatePass(true));
|
||||
printAndVerify(PM, "After Pre-RegAlloc TailDuplicate",
|
||||
/* allowDoubleDefs= */ true);
|
||||
printAndVerify(PM, "After Pre-RegAlloc TailDuplicate");
|
||||
}
|
||||
|
||||
// Run pre-ra passes.
|
||||
if (addPreRegAlloc(PM, OptLevel))
|
||||
printAndVerify(PM, "After PreRegAlloc passes",
|
||||
/* allowDoubleDefs= */ true);
|
||||
printAndVerify(PM, "After PreRegAlloc passes");
|
||||
|
||||
// Perform register allocation.
|
||||
PM.add(createRegisterAllocator(OptLevel));
|
||||
|
@ -44,19 +44,14 @@ using namespace llvm;
|
||||
namespace {
|
||||
struct MachineVerifier {
|
||||
|
||||
MachineVerifier(Pass *pass, bool allowDoubleDefs) :
|
||||
MachineVerifier(Pass *pass) :
|
||||
PASS(pass),
|
||||
allowVirtDoubleDefs(allowDoubleDefs),
|
||||
allowPhysDoubleDefs(true),
|
||||
OutFileName(getenv("LLVM_VERIFY_MACHINEINSTRS"))
|
||||
{}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF);
|
||||
|
||||
Pass *const PASS;
|
||||
const bool allowVirtDoubleDefs;
|
||||
const bool allowPhysDoubleDefs;
|
||||
|
||||
const char *const OutFileName;
|
||||
raw_ostream *OS;
|
||||
const MachineFunction *MF;
|
||||
@ -91,10 +86,6 @@ namespace {
|
||||
// defined. Map value is the user.
|
||||
RegMap vregsLiveIn;
|
||||
|
||||
// Vregs that must be dead in because they are defined without being
|
||||
// killed first. Map value is the defining instruction.
|
||||
RegMap vregsDeadIn;
|
||||
|
||||
// Regs killed in MBB. They may be defined again, and will then be in both
|
||||
// regsKilled and regsLiveOut.
|
||||
RegSet regsKilled;
|
||||
@ -199,11 +190,9 @@ namespace {
|
||||
|
||||
struct MachineVerifierPass : public MachineFunctionPass {
|
||||
static char ID; // Pass ID, replacement for typeid
|
||||
bool AllowDoubleDefs;
|
||||
|
||||
explicit MachineVerifierPass(bool allowDoubleDefs = false)
|
||||
: MachineFunctionPass(&ID),
|
||||
AllowDoubleDefs(allowDoubleDefs) {}
|
||||
MachineVerifierPass()
|
||||
: MachineFunctionPass(&ID) {}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const {
|
||||
AU.setPreservesAll();
|
||||
@ -211,7 +200,7 @@ namespace {
|
||||
}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &MF) {
|
||||
MF.verify(this, AllowDoubleDefs);
|
||||
MF.verify(this);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
@ -223,13 +212,12 @@ static RegisterPass<MachineVerifierPass>
|
||||
MachineVer("machineverifier", "Verify generated machine code");
|
||||
static const PassInfo *const MachineVerifyID = &MachineVer;
|
||||
|
||||
FunctionPass *llvm::createMachineVerifierPass(bool allowPhysDoubleDefs) {
|
||||
return new MachineVerifierPass(allowPhysDoubleDefs);
|
||||
FunctionPass *llvm::createMachineVerifierPass() {
|
||||
return new MachineVerifierPass();
|
||||
}
|
||||
|
||||
void MachineFunction::verify(Pass *p, bool allowDoubleDefs) const {
|
||||
MachineVerifier(p, allowDoubleDefs)
|
||||
.runOnMachineFunction(const_cast<MachineFunction&>(*this));
|
||||
void MachineFunction::verify(Pass *p) const {
|
||||
MachineVerifier(p).runOnMachineFunction(const_cast<MachineFunction&>(*this));
|
||||
}
|
||||
|
||||
bool MachineVerifier::runOnMachineFunction(MachineFunction &MF) {
|
||||
@ -670,40 +658,9 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
|
||||
void MachineVerifier::visitMachineInstrAfter(const MachineInstr *MI) {
|
||||
BBInfo &MInfo = MBBInfoMap[MI->getParent()];
|
||||
set_union(MInfo.regsKilled, regsKilled);
|
||||
set_subtract(regsLive, regsKilled);
|
||||
regsKilled.clear();
|
||||
|
||||
// Verify that both <def> and <def,dead> operands refer to dead registers.
|
||||
RegVector defs(regsDefined);
|
||||
defs.append(regsDead.begin(), regsDead.end());
|
||||
|
||||
for (RegVector::const_iterator I = defs.begin(), E = defs.end();
|
||||
I != E; ++I) {
|
||||
if (regsLive.count(*I)) {
|
||||
if (TargetRegisterInfo::isPhysicalRegister(*I)) {
|
||||
if (!allowPhysDoubleDefs && !isReserved(*I) &&
|
||||
!regsLiveInButUnused.count(*I)) {
|
||||
report("Redefining a live physical register", MI);
|
||||
*OS << "Register " << TRI->getName(*I)
|
||||
<< " was defined but already live.\n";
|
||||
}
|
||||
} else {
|
||||
if (!allowVirtDoubleDefs) {
|
||||
report("Redefining a live virtual register", MI);
|
||||
*OS << "Virtual register %reg" << *I
|
||||
<< " was defined but already live.\n";
|
||||
}
|
||||
}
|
||||
} else if (TargetRegisterInfo::isVirtualRegister(*I) &&
|
||||
!MInfo.regsKilled.count(*I)) {
|
||||
// Virtual register defined without being killed first must be dead on
|
||||
// entry.
|
||||
MInfo.vregsDeadIn.insert(std::make_pair(*I, MI));
|
||||
}
|
||||
}
|
||||
|
||||
set_subtract(regsLive, regsDead); regsDead.clear();
|
||||
set_union(regsLive, regsDefined); regsDefined.clear();
|
||||
set_subtract(regsLive, regsKilled); regsKilled.clear();
|
||||
set_subtract(regsLive, regsDead); regsDead.clear();
|
||||
set_union(regsLive, regsDefined); regsDefined.clear();
|
||||
}
|
||||
|
||||
void
|
||||
@ -828,28 +785,6 @@ void MachineVerifier::visitMachineFunctionAfter() {
|
||||
continue;
|
||||
|
||||
checkPHIOps(MFI);
|
||||
|
||||
// Verify dead-in virtual registers.
|
||||
if (!allowVirtDoubleDefs) {
|
||||
for (MachineBasicBlock::const_pred_iterator PrI = MFI->pred_begin(),
|
||||
PrE = MFI->pred_end(); PrI != PrE; ++PrI) {
|
||||
BBInfo &PrInfo = MBBInfoMap[*PrI];
|
||||
if (!PrInfo.reachable)
|
||||
continue;
|
||||
|
||||
for (RegMap::iterator I = MInfo.vregsDeadIn.begin(),
|
||||
E = MInfo.vregsDeadIn.end(); I != E; ++I) {
|
||||
// DeadIn register must be in neither regsLiveOut or vregsPassed of
|
||||
// any predecessor.
|
||||
if (PrInfo.isLiveOut(I->first)) {
|
||||
report("Live-in virtual register redefined", I->second);
|
||||
*OS << "Register %reg" << I->first
|
||||
<< " was live-out from predecessor MBB #"
|
||||
<< (*PrI)->getNumber() << ".\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Now check LiveVariables info if available
|
||||
|
Loading…
Reference in New Issue
Block a user