Add basic (noop) CodeGen support for __assume
authorHal Finkel <hfinkel@anl.gov>
Wed, 16 Jul 2014 22:44:54 +0000 (22:44 +0000)
committerHal Finkel <hfinkel@anl.gov>
Wed, 16 Jul 2014 22:44:54 +0000 (22:44 +0000)
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
clang/test/CodeGen/builtin-assume.c [new file with mode: 0644]

index 3734716..4bdc87e 100644 (file)
@@ -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 (file)
index 0000000..a381a4c
--- /dev/null
@@ -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];
+}
+