Skip to content

Commit

Permalink
[CodeGen] Add print and verify pass after each MachineFunctionPass by…
Browse files Browse the repository at this point in the history
… default

Previously print+verify passes were added in a very unsystematic way, which is
annoying when debugging as you miss intermediate steps and allows bugs to stay
unnotice when no verification is performed.

To make this change practical I added the possibility to explicitely disable
verification. I used this option on all places where no verification was
performed previously (because alot of places actually don't pass the
MachineVerifier).
In the long term these problems should be fixed properly and verification
enabled after each pass. I'll enable some more verification in subsequent
commits.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224042 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
MatzeB committed Dec 11, 2014
1 parent 9173c77 commit 71f56c4
Show file tree
Hide file tree
Showing 14 changed files with 204 additions and 261 deletions.
61 changes: 32 additions & 29 deletions include/llvm/CodeGen/Passes.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ class TargetPassConfig : public ImmutablePass {
AnalysisID StopAfter;
bool Started;
bool Stopped;
bool AddingMachinePasses;

protected:
TargetMachine *TM;
Expand Down Expand Up @@ -259,12 +260,9 @@ class TargetPassConfig : public ImmutablePass {
return false;
}

/// addPreRegAlloc - This method may be implemented by targets that want to
/// run passes immediately before register allocation. This should return
/// true if -print-machineinstrs should print after these passes.
virtual bool addPreRegAlloc() {
return false;
}
/// This method may be implemented by targets that want to run passes
/// immediately before register allocation.
virtual void addPreRegAlloc() { }

/// createTargetRegisterAllocator - Create the register allocator pass for
/// this target at the current optimization level.
Expand All @@ -290,24 +288,16 @@ class TargetPassConfig : public ImmutablePass {
return false;
}

/// addPostRegAlloc - This method may be implemented by targets that want to
/// run passes after register allocation pass pipeline but before
/// prolog-epilog insertion. This should return true if -print-machineinstrs
/// should print after these passes.
virtual bool addPostRegAlloc() {
return false;
}
/// This method may be implemented by targets that want to run passes after
/// register allocation pass pipeline but before prolog-epilog insertion.
virtual void addPostRegAlloc() { }

/// Add passes that optimize machine instructions after register allocation.
virtual void addMachineLateOptimization();

/// addPreSched2 - This method may be implemented by targets that want to
/// run passes after prolog-epilog insertion and before the second instruction
/// scheduling pass. This should return true if -print-machineinstrs should
/// print after these passes.
virtual bool addPreSched2() {
return false;
}
/// This method may be implemented by targets that want to run passes after
/// prolog-epilog insertion and before the second instruction scheduling pass.
virtual void addPreSched2() { }

/// addGCPasses - Add late codegen passes that analyze code for garbage
/// collection. This should return true if GC info should be printed after
Expand All @@ -317,24 +307,30 @@ class TargetPassConfig : public ImmutablePass {
/// Add standard basic block placement passes.
virtual void addBlockPlacement();

/// addPreEmitPass - This pass may be implemented by targets that want to run
/// passes immediately before machine code is emitted. This should return
/// true if -print-machineinstrs should print out the code after the passes.
virtual bool addPreEmitPass() {
return false;
}
/// This pass may be implemented by targets that want to run passes
/// immediately before machine code is emitted.
virtual void addPreEmitPass() { }

/// Utilities for targets to add passes to the pass manager.
///

/// Add a CodeGen pass at this point in the pipeline after checking overrides.
/// Return the pass that was added, or zero if no pass was added.
AnalysisID addPass(AnalysisID PassID);
/// @p printAfter if true and adding a machine function pass add an extra
/// machine printer pass afterwards
/// @p verifyAfter if true and adding a machine function pass add an extra
/// machine verification pass afterwards.
AnalysisID addPass(AnalysisID PassID, bool verifyAfter = true,
bool printAfter = true);

/// Add a pass to the PassManager if that pass is supposed to be run, as
/// determined by the StartAfter and StopAfter options. Takes ownership of the
/// pass.
void addPass(Pass *P);
/// @p printAfter if true and adding a machine function pass add an extra
/// machine printer pass afterwards
/// @p verifyAfter if true and adding a machine function pass add an extra
/// machine verification pass afterwards.
void addPass(Pass *P, bool verifyAfter = true, bool printAfter = true);

/// addMachinePasses helper to create the target-selected or overriden
/// regalloc pass.
Expand All @@ -343,7 +339,14 @@ class TargetPassConfig : public ImmutablePass {
/// printAndVerify - Add a pass to dump then verify the machine function, if
/// those steps are enabled.
///
void printAndVerify(const char *Banner);
void printAndVerify(const std::string &Banner);

/// Add a pass to print the machine function if printing is enabled.
void addPrintPass(const std::string &Banner);

/// Add a pass to perform basic verification of the machine function if
/// verification is enabled.
void addVerifyPass(const std::string &Banner);
};
} // namespace llvm

Expand Down
Loading

0 comments on commit 71f56c4

Please sign in to comment.