From: Fariborz Jahanian Date: Mon, 25 Apr 2011 22:30:02 +0000 (+0000) Subject: Ir-gen the side-effect(s) when __builtin_expect is X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ec9919549095390b5737c561544f8bd49fc894de;p=clang Ir-gen the side-effect(s) when __builtin_expect is constant-folded. // rdar://9330105 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130163 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index e553eb6c27..2971436831 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -177,6 +177,15 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, // 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 (Result.Val.isInt()) return RValue::get(llvm::ConstantInt::get(getLLVMContext(), Result.Val.getInt())); diff --git a/test/CodeGen/builtin-expect.c b/test/CodeGen/builtin-expect.c index 8f02c4da78..88479d90a0 100644 --- a/test/CodeGen/builtin-expect.c +++ b/test/CodeGen/builtin-expect.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s | FileCheck %s int x; int y(void); @@ -9,3 +9,13 @@ void FUNC() { foo (); } +// rdar://9330105 +void isigprocmask(void); +long bar(); + +int main() { + (void) __builtin_expect((isigprocmask(), 0), bar()); +} + +// CHECK: call void @isigprocmask() +// CHECK: [[C:%.*]] = call i64 (...)* @bar()