diff options
author | Jan Voung <jvoung@chromium.org> | 2013-06-12 17:52:27 -0700 |
---|---|---|
committer | Jan Voung <jvoung@chromium.org> | 2013-06-12 17:52:27 -0700 |
commit | 73d81b129dc97eebe2403573e0ebbb4960d1feed (patch) | |
tree | 46065433a4e4506692472b79225c23b6b156dcd8 /lib | |
parent | 7f93d354387d7fc2fbdc59bc065d6c7d6ab6c9a0 (diff) |
Move llvm.expect from dev to blacklist. Convert with -lower-expect.
The backend currently treats llvm.expect as a nop
pass-through. Until it becomes more useful, we don't need
it in stable bitcode. It sounds like the backend may
prefer to use the !prof metadata instead.
The -lower-expect pass will convert it into branch
weights, which can be consumed by the middle end optimizer's
block placement pass.
It is already converted to !prof metadata when clang
is run with -O2, but not when clang is run at -O0.
Also move the llvm.frameaddress from the dev part of
the intrinsics test to the disallowed part of the test.
BUG=https://code.google.com/p/nativeclient/issues/detail?id=3378
R=mseaborn@chromium.org
Review URL: https://codereview.chromium.org/16882002
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/NaCl/PNaClABIVerifyModule.cpp | 6 | ||||
-rw-r--r-- | lib/Transforms/NaCl/PNaClABISimplify.cpp | 3 |
2 files changed, 6 insertions, 3 deletions
diff --git a/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp b/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp index 16d51ed609..b68ac29a9e 100644 --- a/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp +++ b/lib/Analysis/NaCl/PNaClABIVerifyModule.cpp @@ -228,6 +228,9 @@ bool PNaClABIVerifyModule::isWhitelistedIntrinsic(const Function *F, case Intrinsic::log2: // Rounding not defined: support with fast-math? case Intrinsic::log10: // Rounding not defined: support with fast-math? case Intrinsic::sin: // Rounding not defined: support with fast-math? + // We run -lower-expect to convert Intrinsic::expect into branch weights + // and consume in the middle-end. The backend just ignores llvm.expect. + case Intrinsic::expect: return false; // (3) Dev intrinsics. @@ -237,9 +240,6 @@ bool PNaClABIVerifyModule::isWhitelistedIntrinsic(const Function *F, case Intrinsic::ctlz: // Support via compiler_rt if arch doesn't have it? case Intrinsic::ctpop: // Support via compiler_rt if arch doesn't have it? case Intrinsic::cttz: // Support via compiler_rt if arch doesn't have it? - // Can run -lower-expect, and consume in the middle-end. - // Selection-DAG just treats it as a pass-through. - case Intrinsic::expect: // From __builtin_expect. case Intrinsic::flt_rounds: // For FLT_ROUNDS macro from float.h. // We do not have fesetround() in newlib, can we return a // consistent rounding mode though? diff --git a/lib/Transforms/NaCl/PNaClABISimplify.cpp b/lib/Transforms/NaCl/PNaClABISimplify.cpp index e50112c741..0fd7176ed9 100644 --- a/lib/Transforms/NaCl/PNaClABISimplify.cpp +++ b/lib/Transforms/NaCl/PNaClABISimplify.cpp @@ -22,6 +22,9 @@ using namespace llvm; void llvm::PNaClABISimplifyAddPreOptPasses(PassManager &PM) { + // LowerExpect converts Intrinsic::expect into branch weights, + // which can then be removed after BlockPlacement. + PM.add(createLowerExpectIntrinsicPass()); // LowerInvoke prevents use of C++ exception handling, which is not // yet supported in the PNaCl ABI. PM.add(createLowerInvokePass()); |