summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-10-06 06:56:41 +0000
committerChris Lattner <sabre@nondot.org>2008-10-06 06:56:41 +0000
commit24355b524041fb91e82664c1279b5c98daf8a3f9 (patch)
tree4fb9cdd037bbadf486f05b0326488a2523f0f7b0 /clang
parentb7c86a211c81d595722744fbac436c2d45024b2f (diff)
downloadbcm5719-llvm-24355b524041fb91e82664c1279b5c98daf8a3f9.tar.gz
bcm5719-llvm-24355b524041fb91e82664c1279b5c98daf8a3f9.zip
always try to fold a builtin before emitting it. In the future
it is possible that a builtin could sometimes be folded (e.g. __builtin_clz) if it's operand is a constant. llvm-svn: 57161
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp23
1 files changed, 5 insertions, 18 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 99a3463a221..fc7cc027104 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -37,30 +37,17 @@ static RValue EmitBinaryAtomic(CodeGenFunction& CFG,
}
RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) {
- switch (BuiltinID) {
- default: break; // Handle intrinsics and libm functions below.
-
- case Builtin::BI__builtin_huge_val:
- case Builtin::BI__builtin_huge_valf:
- case Builtin::BI__builtin_huge_vall:
- case Builtin::BI__builtin_inf:
- case Builtin::BI__builtin_inff:
- case Builtin::BI__builtin_infl:
- case Builtin::BI__builtin_nan:
- case Builtin::BI__builtin_nanf:
- case Builtin::BI__builtin_nanl:
- case Builtin::BI__builtin_classify_type:
- case Builtin::BI__builtin_constant_p: {
- APValue Result;
- if (!E->tryEvaluate(Result, CGM.getContext()))
- break; // Not a constant, expand below.
-
+ // See if we can constant fold this builtin. If so, don't emit it at all.
+ APValue Result;
+ if (E->tryEvaluate(Result, CGM.getContext())) {
if (Result.isInt())
return RValue::get(llvm::ConstantInt::get(Result.getInt()));
assert(Result.isFloat() && "Unsupported constant type");
return RValue::get(llvm::ConstantFP::get(Result.getFloat()));
}
+ switch (BuiltinID) {
+ default: break; // Handle intrinsics and libm functions below.
case Builtin::BI__builtin___CFStringMakeConstantString: {
const Expr *Arg = E->getArg(0);
OpenPOWER on IntegriCloud