From e85f0ef7d5e72b33fbeda1e91f4b6ea84cafb302 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213206 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGBuiltin.cpp | 3 +++ test/CodeGen/builtin-assume.c | 8 ++++++++ 2 files changed, 11 insertions(+) create mode 100644 test/CodeGen/builtin-assume.c diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 37347168f3..4bdc87e2d4 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/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/test/CodeGen/builtin-assume.c b/test/CodeGen/builtin-assume.c new file mode 100644 index 0000000000..a381a4c1df --- /dev/null +++ b/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.40.0