summaryrefslogtreecommitdiff
path: root/lib/IR
diff options
context:
space:
mode:
authorPaul Robinson <paul_robinson@playstation.sony.com>2014-02-06 00:07:05 +0000
committerPaul Robinson <paul_robinson@playstation.sony.com>2014-02-06 00:07:05 +0000
commit2684ddd72e6274be60129d5510d9d5073463d0a4 (patch)
tree8a1cc576fcd316c88e1fee0e28357f23c0a1d5c0 /lib/IR
parentb725815069b6682f2371dc5da00d1dd85365aa7a (diff)
downloadllvm-2684ddd72e6274be60129d5510d9d5073463d0a4.tar.gz
llvm-2684ddd72e6274be60129d5510d9d5073463d0a4.tar.bz2
llvm-2684ddd72e6274be60129d5510d9d5073463d0a4.tar.xz
Disable most IR-level transform passes on functions marked 'optnone'.
Ideally only those transform passes that run at -O0 remain enabled, in reality we get as close as we reasonably can. Passes are responsible for disabling themselves, it's not the job of the pass manager to do it for them. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200892 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/IR')
-rw-r--r--lib/IR/Pass.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/IR/Pass.cpp b/lib/IR/Pass.cpp
index 3782e2d7be..84b0b04d69 100644
--- a/lib/IR/Pass.cpp
+++ b/lib/IR/Pass.cpp
@@ -14,6 +14,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/Pass.h"
+#include "llvm/IR/Function.h"
#include "llvm/IR/IRPrintingPasses.h"
#include "llvm/PassRegistry.h"
#include "llvm/Support/Debug.h"
@@ -137,6 +138,15 @@ PassManagerType FunctionPass::getPotentialPassManagerType() const {
return PMT_FunctionPassManager;
}
+bool FunctionPass::skipOptnoneFunction(Function &F) const {
+ if (F.hasFnAttribute(Attribute::OptimizeNone)) {
+ DEBUG(dbgs() << "Skipping pass '" << getPassName()
+ << "' on function " << F.getName() << "\n");
+ return true;
+ }
+ return false;
+}
+
//===----------------------------------------------------------------------===//
// BasicBlockPass Implementation
//
@@ -156,6 +166,18 @@ bool BasicBlockPass::doFinalization(Function &) {
return false;
}
+bool BasicBlockPass::skipOptnoneFunction(BasicBlock &BB) const {
+ Function *F = BB.getParent();
+ if (F && F->hasFnAttribute(Attribute::OptimizeNone)) {
+ // Report this only once per function.
+ if (&BB == &F->getEntryBlock())
+ DEBUG(dbgs() << "Skipping pass '" << getPassName()
+ << "' on function " << F->getName() << "\n");
+ return true;
+ }
+ return false;
+}
+
PassManagerType BasicBlockPass::getPotentialPassManagerType() const {
return PMT_BasicBlockPassManager;
}