diff options
author | Hal Finkel <hfinkel@anl.gov> | 2013-05-20 16:08:17 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2013-05-20 16:08:17 +0000 |
commit | e50c8c1f81a38f0ecebafa5dc60a163814a9713a (patch) | |
tree | 72598230886735251f39b614515b975a95fd85b0 /lib/Target/PowerPC/PPCTargetMachine.cpp | |
parent | d54bf7ceefd2d6ba89fd800700a5ff201861861c (diff) | |
download | llvm-e50c8c1f81a38f0ecebafa5dc60a163814a9713a.tar.gz llvm-e50c8c1f81a38f0ecebafa5dc60a163814a9713a.tar.bz2 llvm-e50c8c1f81a38f0ecebafa5dc60a163814a9713a.tar.xz |
Add a PPCCTRLoops verification pass
When asserts are enabled, this adds a verification pass for PPC counter-loop
formation. Unfortunately, without sacrificing code quality, there is no better
way of forming counter-based loops except at the (late) IR level. This means
that we need to recognize, at the IR level, anything which might turn into a
function call (or indirect branch). Because this is currently a finite set of
things, and because SelectionDAG lowering is basic-block local, this can be
done. Nevertheless, it is fragile, and failure results in a miscompile. This
verification pass checks that all (reachable) counter-based branches are
dominated by a loop mtctr instruction, and that no instructions in between
clobber the counter register. If these conditions are not satisfied, then an
ICE will be triggered.
In short, this is to help us sleep better at night.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182295 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCTargetMachine.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPCTargetMachine.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPCTargetMachine.cpp b/lib/Target/PowerPC/PPCTargetMachine.cpp index ca012670f3..da03b4cef7 100644 --- a/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -122,6 +122,12 @@ bool PPCPassConfig::addILPOpts() { bool PPCPassConfig::addInstSelector() { // Install an instruction selector. addPass(createPPCISelDag(getPPCTargetMachine())); + +#ifndef NDEBUG + if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None) + addPass(createPPCCTRLoopsVerify()); +#endif + return false; } |