Author: hans Date: Thu Jan 14 11:52:28 2016 New Revision: 257779 URL: http://llvm.org/viewvc/llvm-project?rev=257779&view=rev Log: Merging r257730: ------------------------------------------------------------------------ r257730 | majnemer | 2016-01-13 17:20:03 -0800 (Wed, 13 Jan 2016) | 11 lines
[X86] Don't alter HasOpaqueSPAdjustment after we've relied on it We rely on HasOpaqueSPAdjustment not changing after we've calculated things based on it. Things like whether or not we can use 'rep;movs' to copy bytes around, that sort of thing. If it changes, invariants in the backend will quietly break. This situation arose when we had a call to memcpy *and* a COPY of the FLAGS register where we would attempt to reference local variables using %esi, a register that was clobbered by the 'rep;movs'. This fixes PR26124. ------------------------------------------------------------------------ Added: llvm/branches/release_38/test/CodeGen/X86/x86-repmov-copy-eflags.ll - copied unchanged from r257730, llvm/trunk/test/CodeGen/X86/x86-repmov-copy-eflags.ll Modified: llvm/branches/release_38/ (props changed) llvm/branches/release_38/include/llvm/CodeGen/MachineFrameInfo.h llvm/branches/release_38/include/llvm/Target/TargetLowering.h llvm/branches/release_38/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp llvm/branches/release_38/lib/Target/X86/X86FrameLowering.cpp llvm/branches/release_38/lib/Target/X86/X86ISelLowering.cpp Propchange: llvm/branches/release_38/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Jan 14 11:52:28 2016 @@ -1,3 +1,3 @@ /llvm/branches/Apple/Pertwee:110850,110961 /llvm/branches/type-system-rewrite:133420-134817 -/llvm/trunk:155241,257645,257648 +/llvm/trunk:155241,257645,257648,257730 Modified: llvm/branches/release_38/include/llvm/CodeGen/MachineFrameInfo.h URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_38/include/llvm/CodeGen/MachineFrameInfo.h?rev=257779&r1=257778&r2=257779&view=diff ============================================================================== --- llvm/branches/release_38/include/llvm/CodeGen/MachineFrameInfo.h (original) +++ llvm/branches/release_38/include/llvm/CodeGen/MachineFrameInfo.h Thu Jan 14 11:52:28 2016 @@ -251,6 +251,10 @@ class MachineFrameInfo { /// opaque mechanism like inline assembly or Win32 EH. bool HasOpaqueSPAdjustment; + /// True if the function contains operations which will lower down to + /// instructions which manipulate the stack pointer. + bool HasCopyImplyingStackAdjustment; + /// True if the function contains a call to the llvm.vastart intrinsic. bool HasVAStart; @@ -288,6 +292,7 @@ public: LocalFrameMaxAlign = 0; UseLocalStackAllocationBlock = false; HasOpaqueSPAdjustment = false; + HasCopyImplyingStackAdjustment = false; HasVAStart = false; HasMustTailInVarArgFunc = false; Save = nullptr; @@ -493,6 +498,15 @@ public: bool hasOpaqueSPAdjustment() const { return HasOpaqueSPAdjustment; } void setHasOpaqueSPAdjustment(bool B) { HasOpaqueSPAdjustment = B; } + /// Returns true if the function contains operations which will lower down to + /// instructions which manipulate the stack pointer. + bool hasCopyImplyingStackAdjustment() const { + return HasCopyImplyingStackAdjustment; + } + void setHasCopyImplyingStackAdjustment(bool B) { + HasCopyImplyingStackAdjustment = B; + } + /// Returns true if the function calls the llvm.va_start intrinsic. bool hasVAStart() const { return HasVAStart; } void setHasVAStart(bool B) { HasVAStart = B; } Modified: llvm/branches/release_38/include/llvm/Target/TargetLowering.h URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_38/include/llvm/Target/TargetLowering.h?rev=257779&r1=257778&r2=257779&view=diff ============================================================================== --- llvm/branches/release_38/include/llvm/Target/TargetLowering.h (original) +++ llvm/branches/release_38/include/llvm/Target/TargetLowering.h Thu Jan 14 11:52:28 2016 @@ -2270,7 +2270,7 @@ public: } /// Return true if the MachineFunction contains a COPY which would imply - /// HasOpaqueSPAdjustment. + /// HasCopyImplyingStackAdjustment. virtual bool hasCopyImplyingStackAdjustment(MachineFunction *MF) const { return false; } Modified: llvm/branches/release_38/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_38/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp?rev=257779&r1=257778&r2=257779&view=diff ============================================================================== --- llvm/branches/release_38/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (original) +++ llvm/branches/release_38/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Thu Jan 14 11:52:28 2016 @@ -634,7 +634,7 @@ bool SelectionDAGISel::runOnMachineFunct } if (TLI->hasCopyImplyingStackAdjustment(MF)) - MFI->setHasOpaqueSPAdjustment(true); + MFI->setHasCopyImplyingStackAdjustment(true); // Freeze the set of reserved registers now that MachineFrameInfo has been // set up. All the information required by getReservedRegs() should be Modified: llvm/branches/release_38/lib/Target/X86/X86FrameLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_38/lib/Target/X86/X86FrameLowering.cpp?rev=257779&r1=257778&r2=257779&view=diff ============================================================================== --- llvm/branches/release_38/lib/Target/X86/X86FrameLowering.cpp (original) +++ llvm/branches/release_38/lib/Target/X86/X86FrameLowering.cpp Thu Jan 14 11:52:28 2016 @@ -91,7 +91,8 @@ bool X86FrameLowering::hasFP(const Machi MFI->isFrameAddressTaken() || MFI->hasOpaqueSPAdjustment() || MF.getInfo<X86MachineFunctionInfo>()->getForceFramePointer() || MMI.callsUnwindInit() || MMI.hasEHFunclets() || MMI.callsEHReturn() || - MFI->hasStackMap() || MFI->hasPatchPoint()); + MFI->hasStackMap() || MFI->hasPatchPoint() || + MFI->hasCopyImplyingStackAdjustment()); } static unsigned getSUBriOpcode(unsigned IsLP64, int64_t Imm) { @@ -943,11 +944,11 @@ void X86FrameLowering::emitPrologue(Mach // push and pop from the stack. if (Is64Bit && !Fn->hasFnAttribute(Attribute::NoRedZone) && !TRI->needsStackRealignment(MF) && - !MFI->hasVarSizedObjects() && // No dynamic alloca. - !MFI->adjustsStack() && // No calls. - !IsWin64CC && // Win64 has no Red Zone - !MFI->hasOpaqueSPAdjustment() && // Don't push and pop. - !MF.shouldSplitStack()) { // Regular stack + !MFI->hasVarSizedObjects() && // No dynamic alloca. + !MFI->adjustsStack() && // No calls. + !IsWin64CC && // Win64 has no Red Zone + !MFI->hasCopyImplyingStackAdjustment() && // Don't push and pop. + !MF.shouldSplitStack()) { // Regular stack uint64_t MinSize = X86FI->getCalleeSavedFrameSize(); if (HasFP) MinSize += SlotSize; StackSize = std::max(MinSize, StackSize > 128 ? StackSize - 128 : 0); Modified: llvm/branches/release_38/lib/Target/X86/X86ISelLowering.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/branches/release_38/lib/Target/X86/X86ISelLowering.cpp?rev=257779&r1=257778&r2=257779&view=diff ============================================================================== --- llvm/branches/release_38/lib/Target/X86/X86ISelLowering.cpp (original) +++ llvm/branches/release_38/lib/Target/X86/X86ISelLowering.cpp Thu Jan 14 11:52:28 2016 @@ -17458,7 +17458,7 @@ static SDValue LowerINTRINSIC_W_CHAIN(SD // We need a frame pointer because this will get lowered to a PUSH/POP // sequence. MachineFrameInfo *MFI = DAG.getMachineFunction().getFrameInfo(); - MFI->setHasOpaqueSPAdjustment(true); + MFI->setHasCopyImplyingStackAdjustment(true); // Don't do anything here, we will expand these intrinsics out later // during ExpandISelPseudos in EmitInstrWithCustomInserter. return SDValue(); _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits