r239651 - [CodeGen] Don't evaluate immediate inlineasm arguments using isICE().

Ahmed Bougacha ahmed.bougacha at gmail.com
Fri Jun 12 18:16:10 PDT 2015


Author: ab
Date: Fri Jun 12 20:16:10 2015
New Revision: 239651

URL: http://llvm.org/viewvc/llvm-project?rev=239651&view=rev
Log:
[CodeGen] Don't evaluate immediate inlineasm arguments using isICE().

Instead, just EvaluateAsInt().

Follow-up to r239549: rsmith points out that isICE() is expensive;
seems like it's not the right concept anyway, as it fails on
`static const' in C, and will actually trigger the assert below on:
    test/Sema/inline-asm-validate-x86.c

Modified:
    cfe/trunk/lib/CodeGen/CGStmt.cpp
    cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c

Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=239651&r1=239650&r2=239651&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGStmt.cpp Fri Jun 12 20:16:10 2015
@@ -1754,7 +1754,7 @@ llvm::Value* CodeGenFunction::EmitAsmInp
   // (immediate or symbolic), try to emit it as such.
   if (!Info.allowsRegister() && !Info.allowsMemory()) {
     llvm::APSInt Result;
-    if (InputExpr->isIntegerConstantExpr(Result, getContext()))
+    if (InputExpr->EvaluateAsInt(Result, getContext()))
       return llvm::ConstantInt::get(getLLVMContext(), Result);
     assert(!Info.requiresImmediateConstant() &&
            "Required-immediate inlineasm arg isn't constant?");

Modified: cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c?rev=239651&r1=239650&r2=239651&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c (original)
+++ cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c Fri Jun 12 20:16:10 2015
@@ -20,6 +20,11 @@ void test_inlineasm_i() {
 
 // CHECK-LABEL: @test_inlineasm_I
 // CHECK: call void asm sideeffect "int $0", "I{{.*}}"(i32 2)
+// CHECK: call void asm sideeffect "int $0", "I{{.*}}"(i32 3)
 void test_inlineasm_I() {
   __asm__ __volatile__("int %0" :: "I"(1 + 1));
+
+  // Also check a C non-ICE.
+  static const int N = 1;
+  __asm__ __volatile__("int %0" :: "I"(N + 2));
 }





More information about the cfe-commits mailing list