diff options
author | Sanjay Patel <spatel@rotateright.com> | 2015-09-02 20:01:30 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2015-09-02 20:01:30 +0000 |
commit | a24296b459660924f4c9f50321c0c0bf6ca1ee89 (patch) | |
tree | f976b50ecdfe9b8bc14b2ce8a6c30905277146f8 /clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp | |
parent | d428e203a01aa22a2f7d5c5f2954caed7f4888a6 (diff) | |
download | llvm-a24296b459660924f4c9f50321c0c0bf6ca1ee89.zip llvm-a24296b459660924f4c9f50321c0c0bf6ca1ee89.tar.gz llvm-a24296b459660924f4c9f50321c0c0bf6ca1ee89.tar.bz2 |
add __builtin_unpredictable and convert to metadata
This patch depends on r246688 (D12341).
The goal is to make LLVM generate different code for these functions for a target that
has cheap branches (see PR23827 for more details):
int foo();
int normal(int x, int y, int z) {
if (x != 0 && y != 0) return foo();
return 1;
}
int crazy(int x, int y) {
if (__builtin_unpredictable(x != 0 && y != 0)) return foo();
return 1;
}
Differential Revision: http://reviews.llvm.org/D12458
llvm-svn: 246699
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp index 104a81e..dab2f61 100644 --- a/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp @@ -41,11 +41,12 @@ bool BuiltinFunctionChecker::evalCall(const CallExpr *CE, default: return false; + case Builtin::BI__builtin_unpredictable: case Builtin::BI__builtin_expect: case Builtin::BI__builtin_assume_aligned: case Builtin::BI__builtin_addressof: { - // For __builtin_expect and __builtin_assume_aligned, just return the value - // of the subexpression. + // For __builtin_unpredictable, __builtin_expect, and + // __builtin_assume_aligned, just return the value of the subexpression. // __builtin_addressof is going from a reference to a pointer, but those // are represented the same way in the analyzer. assert (CE->arg_begin() != CE->arg_end()); |