Revert the backend fatal error from r196939
authorReid Kleckner <reid@kleckner.net>
Tue, 10 Dec 2013 23:23:52 +0000 (23:23 +0000)
committerReid Kleckner <reid@kleckner.net>
Tue, 10 Dec 2013 23:23:52 +0000 (23:23 +0000)
The combination of inline asm, stack realignment, and dynamic allocas
turns out to be too common to reject out of hand.

ASan inserts empy inline asm fragments and uses aligned allocas.
Compiling any trivial function containing a dynamic alloca with ASan is
enough to trigger the check.

XFAIL the test cases that would be miscompiled and add one that uses the
relevant functionality.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196986 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86RegisterInfo.cpp
test/CodeGen/X86/inline-asm-stack-realign.ll
test/CodeGen/X86/inline-asm-stack-realign2.ll
test/CodeGen/X86/inline-asm-stack-realign3.ll [new file with mode: 0644]

index d3d05cd83a4406de54152f9741758f4dba254a73..e6cd59397cbd54f5aced9a90b75a05ef495d1683 100644 (file)
@@ -347,12 +347,6 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const {
         "Stack realignment in presence of dynamic allocas is not supported with"
         "this calling convention.");
 
-    // FIXME: Do a proper analysis of the inline asm to see if it actually
-    // conflicts with the base register we chose.
-    if (MF.hasInlineAsm())
-      report_fatal_error("Stack realignment in presence of dynamic stack "
-                         "adjustments is not supported with inline assembly.");
-
     for (MCSubRegIterator I(getBaseRegister(), this, /*IncludeSelf=*/true);
          I.isValid(); ++I)
       Reserved.set(*I);
index 476a628c8bb74a29beda71f1d7cd58da29aaefc2..de98200a3a9430c5a4cab0a4e886ced3fe6d597a 100644 (file)
@@ -1,8 +1,8 @@
 ; RUN: not llc -mtriple=i686-pc-win32 < %s 2>&1 | FileCheck %s
 
-; We don't currently support realigning the stack and adjusting the stack
-; pointer in inline asm.  This commonly happens in MS inline assembly using
-; push and pop.
+; FIXME: This is miscompiled due to our unconditional use of ESI as the base
+; pointer.
+; XFAIL:
 
 ; CHECK: Stack realignment in presence of dynamic stack adjustments is not supported with inline assembly
 
index 2f042e84c5a6b9586c7ebb131dbe8746520e6340..4861c2040ec7a7db0081655937289283a1fd501d 100644 (file)
@@ -1,7 +1,8 @@
 ; RUN: not llc -mtriple=i686-pc-win32 < %s 2>&1 | FileCheck %s
 
-; We don't currently support realigning the stack and adjusting the stack
-; pointer in inline asm.  This can even happen in GNU asm.
+; FIXME: This is miscompiled due to our unconditional use of ESI as the base
+; pointer.
+; XFAIL:
 
 ; CHECK: Stack realignment in presence of dynamic stack adjustments is not supported with inline assembly
 
diff --git a/test/CodeGen/X86/inline-asm-stack-realign3.ll b/test/CodeGen/X86/inline-asm-stack-realign3.ll
new file mode 100644 (file)
index 0000000..cdb77ca
--- /dev/null
@@ -0,0 +1,29 @@
+; RUN: llc -march=x86 < %s | FileCheck %s
+
+declare void @bar(i32* %junk)
+
+define i32 @foo(i1 %cond) {
+entry:
+  %r = alloca i32, align 128
+  store i32 -1, i32* %r, align 128
+  br i1 %cond, label %doit, label %skip
+
+doit:
+  call void asm sideeffect "xor %ecx, %ecx\0A\09mov %ecx, $0", "=*m,~{ecx},~{flags}"(i32* %r)
+  %junk = alloca i32
+  call void @bar(i32* %junk)
+  br label %skip
+
+skip:
+  %0 = load i32* %r, align 128
+  ret i32 %0
+}
+
+; CHECK-LABEL: foo:
+; CHECK: pushl %ebp
+; CHECK: andl $-128, %esp
+; CHECK: xor %ecx, %ecx
+; CHECK-NEXT: mov %ecx, (%esi)
+; CHECK: movl (%esi), %eax
+; CHECK: popl %ebp
+; CHECK: ret