From 3e49fda0d4f2de4c22a4cedfd9c2d2e5b0589f9c Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Wed, 16 Jul 2014 22:44:54 +0000 Subject: [PATCH] Add basic (noop) CodeGen support for __assume Clang supports __assume, at least at the semantic level, when MS extensions are enabled. Unfortunately, trying to actually compile code using __assume would result in this error: error: cannot compile this builtin function yet __assume is an optimizer hint, and can be ignored at the IR level. Until LLVM supports assumptions at the IR level, a noop lowering is valid, and that is what is done here. llvm-svn: 213206 --- clang/lib/CodeGen/CGBuiltin.cpp | 3 +++ clang/test/CodeGen/builtin-assume.c | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 clang/test/CodeGen/builtin-assume.c diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 3734716..4bdc87e 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1517,6 +1517,9 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, case Builtin::BI__noop: // __noop always evaluates to an integer literal zero. return RValue::get(ConstantInt::get(IntTy, 0)); + case Builtin::BI__assume: + // Until LLVM supports assumptions at the IR level, this becomes nothing. + return RValue::get(nullptr); case Builtin::BI_InterlockedExchange: case Builtin::BI_InterlockedExchangePointer: return EmitBinaryAtomic(*this, llvm::AtomicRMWInst::Xchg, E); diff --git a/clang/test/CodeGen/builtin-assume.c b/clang/test/CodeGen/builtin-assume.c new file mode 100644 index 0000000..a381a4c --- /dev/null +++ b/clang/test/CodeGen/builtin-assume.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -triple i386-mingw32 -fms-extensions -emit-llvm -o - %s | FileCheck %s + +// CHECK-LABEL: @test1 +int test1(int *a) { + __assume(a != 0); + return a[0]; +} + -- 2.7.4