summaryrefslogtreecommitdiff
path: root/lib/Target/X86/X86RegisterInfo.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-12-10 05:31:27 +0000
committerReid Kleckner <reid@kleckner.net>2013-12-10 05:31:27 +0000
commitcc8d39acf5b16939d656ea8b6d755738bc3266d0 (patch)
treeac2b4dc2c9bebaf2286b995da954267ba58ecee3 /lib/Target/X86/X86RegisterInfo.cpp
parentec4d326aad404fa7a6335aadcc21710ecc6a63b0 (diff)
downloadllvm-cc8d39acf5b16939d656ea8b6d755738bc3266d0.tar.gz
llvm-cc8d39acf5b16939d656ea8b6d755738bc3266d0.tar.bz2
llvm-cc8d39acf5b16939d656ea8b6d755738bc3266d0.tar.xz
Revert "Fix miscompile of MS inline assembly with stack realignment"
This reverts commit r196876. Its tests failed on the bots, so I'll figure it out tomorrow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196879 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86RegisterInfo.cpp')
-rw-r--r--lib/Target/X86/X86RegisterInfo.cpp27
1 files changed, 12 insertions, 15 deletions
diff --git a/lib/Target/X86/X86RegisterInfo.cpp b/lib/Target/X86/X86RegisterInfo.cpp
index d3d05cd83a..dbda556b1b 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);
@@ -409,15 +403,18 @@ bool X86RegisterInfo::hasBasePointer(const MachineFunction &MF) const {
if (!EnableBasePointer)
return false;
- // When we need stack realignment, we can't address the stack from the frame
- // pointer. When we have dynamic allocas or stack-adjusting inline asm, we
- // can't address variables from the stack pointer. MS inline asm can
- // reference locals while also adjusting the stack pointer. When we can't
- // use both the SP and the FP, we need a separate base pointer register.
- bool CantUseFP = needsStackRealignment(MF);
- bool CantUseSP =
- MFI->hasVarSizedObjects() || MFI->hasInlineAsmWithSPAdjust();
- return CantUseFP && CantUseSP;
+ // When we need stack realignment and there are dynamic allocas, we can't
+ // reference off of the stack pointer, so we reserve a base pointer.
+ //
+ // This is also true if the function contain MS-style inline assembly. We
+ // do this because if any stack changes occur in the inline assembly, e.g.,
+ // "pusha", then any C local variable or C argument references in the
+ // inline assembly will be wrong because the SP is not properly tracked.
+ if ((needsStackRealignment(MF) && MFI->hasVarSizedObjects()) ||
+ MF.hasMSInlineAsm())
+ return true;
+
+ return false;
}
bool X86RegisterInfo::canRealignStack(const MachineFunction &MF) const {