diff options
| author | Chris Lattner <sabre@nondot.org> | 2008-10-06 06:56:41 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2008-10-06 06:56:41 +0000 |
| commit | 24355b524041fb91e82664c1279b5c98daf8a3f9 (patch) | |
| tree | 4fb9cdd037bbadf486f05b0326488a2523f0f7b0 /clang | |
| parent | b7c86a211c81d595722744fbac436c2d45024b2f (diff) | |
| download | bcm5719-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.cpp | 23 |
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); |

