aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Analysis/GRExprEngine.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/Analysis/GRExprEngine.cpp b/Analysis/GRExprEngine.cpp
index fa623a49e4..3b4b787d6a 100644
--- a/Analysis/GRExprEngine.cpp
+++ b/Analysis/GRExprEngine.cpp
@@ -517,8 +517,21 @@ void GRExprEngine::VisitCall(CallExpr* CE, NodeTy* Pred,
IdentifierInfo* Info = cast<lval::FuncVal>(L).getDecl()->getIdentifier();
- if (Info->getBuiltinID())
- invalidateArgs = true;
+ if (unsigned id = Info->getBuiltinID()) {
+ switch (id) {
+ case Builtin::BI__builtin_expect: {
+ // For __builtin_expect, just return the value of the subexpression.
+ assert (CE->arg_begin() != CE->arg_end());
+ RVal X = GetRVal(St, *(CE->arg_begin()));
+ Nodify(Dst, CE, *DI, SetRVal(St, CE, X));
+ continue;
+ }
+
+ default:
+ invalidateArgs = true;
+ break;
+ }
+ }
}
if (invalidateArgs) {