Introduce __builtin_expect() intrinsic support.
llvm-svn: 134761
This commit is contained in:
parent
284b467d9f
commit
d2cf2cbae9
|
@ -22,6 +22,7 @@
|
||||||
#include "clang/Basic/TargetBuiltins.h"
|
#include "clang/Basic/TargetBuiltins.h"
|
||||||
#include "llvm/Intrinsics.h"
|
#include "llvm/Intrinsics.h"
|
||||||
#include "llvm/Target/TargetData.h"
|
#include "llvm/Target/TargetData.h"
|
||||||
|
|
||||||
using namespace clang;
|
using namespace clang;
|
||||||
using namespace CodeGen;
|
using namespace CodeGen;
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
@ -311,11 +312,16 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
||||||
return RValue::get(Result);
|
return RValue::get(Result);
|
||||||
}
|
}
|
||||||
case Builtin::BI__builtin_expect: {
|
case Builtin::BI__builtin_expect: {
|
||||||
// FIXME: pass expect through to LLVM
|
|
||||||
Value *ArgValue = EmitScalarExpr(E->getArg(0));
|
Value *ArgValue = EmitScalarExpr(E->getArg(0));
|
||||||
if (E->getArg(1)->HasSideEffects(getContext()))
|
const llvm::Type *ArgType = ArgValue->getType();
|
||||||
(void)EmitScalarExpr(E->getArg(1));
|
|
||||||
return RValue::get(ArgValue);
|
Value *FnExpect = CGM.getIntrinsic(Intrinsic::expect, &ArgType, 1);
|
||||||
|
Value *ExpectedValue = EmitScalarExpr(E->getArg(1));
|
||||||
|
|
||||||
|
Value *Result = Builder.CreateCall2(FnExpect, ArgValue, ExpectedValue,
|
||||||
|
"expval");
|
||||||
|
return RValue::get(Result);
|
||||||
|
|
||||||
}
|
}
|
||||||
case Builtin::BI__builtin_bswap32:
|
case Builtin::BI__builtin_bswap32:
|
||||||
case Builtin::BI__builtin_bswap64: {
|
case Builtin::BI__builtin_bswap64: {
|
||||||
|
|
|
@ -19,3 +19,29 @@ int main() {
|
||||||
|
|
||||||
// CHECK: call void @isigprocmask()
|
// CHECK: call void @isigprocmask()
|
||||||
// CHECK: [[C:%.*]] = call i64 (...)* @bar()
|
// CHECK: [[C:%.*]] = call i64 (...)* @bar()
|
||||||
|
|
||||||
|
|
||||||
|
// CHECK: @test1
|
||||||
|
int test1(int x) {
|
||||||
|
// CHECK: @llvm.expect
|
||||||
|
if (__builtin_expect (x, 1))
|
||||||
|
return 0;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK: @test2
|
||||||
|
int test2(int x) {
|
||||||
|
// CHECK: @llvm.expect
|
||||||
|
switch(__builtin_expect(x, 5)) {
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
return 1;
|
||||||
|
case 5:
|
||||||
|
return 5;
|
||||||
|
};
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue