summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-12-10 23:23:52 +0000
committerReid Kleckner <reid@kleckner.net>2013-12-10 23:23:52 +0000
commit4d5bee428fad8d67b0812cf8a3d185de33faf7ec (patch)
tree8b23aac005839e032f77e5b7c6d16e85745083f8
parent9e9622d63ec41b221e9212b87682487ad0058fe6 (diff)
downloadllvm-4d5bee428fad8d67b0812cf8a3d185de33faf7ec.tar.gz
llvm-4d5bee428fad8d67b0812cf8a3d185de33faf7ec.tar.bz2
llvm-4d5bee428fad8d67b0812cf8a3d185de33faf7ec.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196986 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86RegisterInfo.cpp6
-rw-r--r--test/CodeGen/X86/inline-asm-stack-realign.ll6
-rw-r--r--test/CodeGen/X86/inline-asm-stack-realign2.ll5
-rw-r--r--test/CodeGen/X86/inline-asm-stack-realign3.ll29
4 files changed, 35 insertions, 11 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp
index d3d05cd83a..e6cd59397c 100644
--- a/lib/Target/X86/X86RegisterInfo.cpp
+++ b/lib/Target/X86/X86RegisterInfo.cpp
@@ -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);
diff --git a/test/CodeGen/X86/inline-asm-stack-realign.ll b/test/CodeGen/X86/inline-asm-stack-realign.ll
index 476a628c8b..de98200a3a 100644
--- a/test/CodeGen/X86/inline-asm-stack-realign.ll
+++ b/test/CodeGen/X86/inline-asm-stack-realign.ll
@@ -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
diff --git a/test/CodeGen/X86/inline-asm-stack-realign2.ll b/test/CodeGen/X86/inline-asm-stack-realign2.ll
index 2f042e84c5..4861c2040e 100644
--- a/test/CodeGen/X86/inline-asm-stack-realign2.ll
+++ b/test/CodeGen/X86/inline-asm-stack-realign2.ll
@@ -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
index 0000000000..cdb77ca3ea
--- /dev/null
+++ b/test/CodeGen/X86/inline-asm-stack-realign3.ll
@@ -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