Added transfer function support for __builtin_expect.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47971 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/GRExprEngine.cpp b/Analysis/GRExprEngine.cpp
index fa623a4..3b4b787 100644
--- a/Analysis/GRExprEngine.cpp
+++ b/Analysis/GRExprEngine.cpp
@@ -517,8 +517,21 @@
       
       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) {