]> granicus.if.org Git - clang/commitdiff
Fix for PR6274: teach constant folding to evaluate __builtin_expect.
authorEli Friedman <eli.friedman@gmail.com>
Sat, 13 Feb 2010 00:10:10 +0000 (00:10 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 13 Feb 2010 00:10:10 +0000 (00:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96054 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ExprConstant.cpp
test/Sema/const-eval.c

index 382bfe59b5b71a1d01406c4f2c8e543f47c29daa..1a44cd02d9c16eecdc0e61db305b46c70d77f8bd 100644 (file)
@@ -812,7 +812,7 @@ public:
     return false;
   }
 
-  bool VisitCallExpr(const CallExpr *E);
+  bool VisitCallExpr(CallExpr *E);
   bool VisitBinaryOperator(const BinaryOperator *E);
   bool VisitUnaryOperator(const UnaryOperator *E);
   bool VisitConditionalOperator(const ConditionalOperator *E);
@@ -967,7 +967,7 @@ static int EvaluateBuiltinClassifyType(const CallExpr *E) {
   return -1;
 }
 
-bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
+bool IntExprEvaluator::VisitCallExpr(CallExpr *E) {
   switch (E->isBuiltinCall(Info.Ctx)) {
   default:
     return Error(E->getLocStart(), diag::note_invalid_subexpr_in_ice, E);
@@ -1022,6 +1022,9 @@ bool IntExprEvaluator::VisitCallExpr(const CallExpr *E) {
     Operand = Info.Ctx.Target.getEHDataRegisterNumber(Operand);
     return Success(Operand, E);
   }
+
+  case Builtin::BI__builtin_expect:
+    return Visit(E->getArg(0));
   }
 }
 
index fee8d97f9bb41cedc88d9446fcbd1023890bdb20..9c537250a93a067e284370692b01825b6f526aa9 100644 (file)
@@ -75,3 +75,4 @@ EVAL_EXPR(35, constbool)
 EVAL_EXPR(36, constbool)
 
 EVAL_EXPR(37, (1,2.0) == 2.0)
+EVAL_EXPR(38, __builtin_expect(1,1) == 1)