diff options
author | Reid Kleckner <reid@kleckner.net> | 2013-12-10 05:31:27 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2013-12-10 05:31:27 +0000 |
commit | cc8d39acf5b16939d656ea8b6d755738bc3266d0 (patch) | |
tree | ac2b4dc2c9bebaf2286b995da954267ba58ecee3 /lib/Target/X86/X86RegisterInfo.cpp | |
parent | ec4d326aad404fa7a6335aadcc21710ecc6a63b0 (diff) | |
download | llvm-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.cpp | 27 |
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 { |