[llvm] r196986 - Revert the backend fatal error from r196939

Reid Kleckner reid at kleckner.net
Tue Dec 10 15:23:52 PST 2013


Author: rnk
Date: Tue Dec 10 17:23:52 2013
New Revision: 196986

URL: http://llvm.org/viewvc/llvm-project?rev=196986&view=rev
Log:
Revert the backend fatal error from r196939

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.

Added:
    llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign3.ll
Modified:
    llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
    llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign.ll
    llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign2.ll

Modified: llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp?rev=196986&r1=196985&r2=196986&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86RegisterInfo.cpp Tue Dec 10 17:23:52 2013
@@ -347,12 +347,6 @@ BitVector X86RegisterInfo::getReservedRe
         "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);

Modified: llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign.ll?rev=196986&r1=196985&r2=196986&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign.ll (original)
+++ llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign.ll Tue Dec 10 17:23:52 2013
@@ -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
 

Modified: llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign2.ll?rev=196986&r1=196985&r2=196986&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign2.ll (original)
+++ llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign2.ll Tue Dec 10 17:23:52 2013
@@ -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
 

Added: llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign3.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign3.ll?rev=196986&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign3.ll (added)
+++ llvm/trunk/test/CodeGen/X86/inline-asm-stack-realign3.ll Tue Dec 10 17:23:52 2013
@@ -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





More information about the llvm-commits mailing list