summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2011-04-25 23:10:07 +0000
committerFariborz Jahanian <fjahanian@apple.com>2011-04-25 23:10:07 +0000
commit24ac1599fc39f14a85bdab04b4657f3cc98271b8 (patch)
tree6cfd16a7aa50f98e61e86c921eae931847c4ef90 /clang
parent2606f4d6d2500dd8d0aeb4b60d34df3da3206383 (diff)
downloadbcm5719-llvm-24ac1599fc39f14a85bdab04b4657f3cc98271b8.tar.gz
bcm5719-llvm-24ac1599fc39f14a85bdab04b4657f3cc98271b8.zip
Generalize case for built-in expressions having
side-effect to generate their ir. Not just for __builtin_expect. // rdar://9330105 llvm-svn: 130172
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp15
1 files changed, 4 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 29714368317..7a0c8da5024 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -176,16 +176,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
unsigned BuiltinID, const CallExpr *E) {
// See if we can constant fold this builtin. If so, don't emit it at all.
Expr::EvalResult Result;
- if (E->Evaluate(Result, CGM.getContext())) {
- // Short circuiting the __builtin_expect on its 1st argument
- // must still IR-gen the 1st and 2nd argument's side-effect.
- if (BuiltinID == Builtin::BI__builtin_expect) {
- if (E->getArg(0)->HasSideEffects(getContext()))
- (void)EmitScalarExpr(E->getArg(0));
- if (E->getArg(1)->HasSideEffects(getContext()))
- (void)EmitScalarExpr(E->getArg(1));
- }
-
+ if (E->Evaluate(Result, CGM.getContext()) &&
+ !Result.hasSideEffects()) {
if (Result.Val.isInt())
return RValue::get(llvm::ConstantInt::get(getLLVMContext(),
Result.Val.getInt()));
@@ -321,9 +313,10 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
}
case Builtin::BI__builtin_expect: {
// FIXME: pass expect through to LLVM
+ Value *ArgValue = EmitScalarExpr(E->getArg(0));
if (E->getArg(1)->HasSideEffects(getContext()))
(void)EmitScalarExpr(E->getArg(1));
- return RValue::get(EmitScalarExpr(E->getArg(0)));
+ return RValue::get(ArgValue);
}
case Builtin::BI__builtin_bswap32:
case Builtin::BI__builtin_bswap64: {
OpenPOWER on IntegriCloud