diff options
| author | Matthias Braun <matze@braunis.de> | 2017-04-21 19:26:45 +0000 |
|---|---|---|
| committer | Matthias Braun <matze@braunis.de> | 2017-04-21 19:26:45 +0000 |
| commit | 1a9062408f4dd67eef21c96fddf1c1738200d1ea (patch) | |
| tree | 030aa6ff658d1cf44caed8a4cdb1052a3647a8b7 /llvm/lib/Target/X86/X86RegisterInfo.cpp | |
| parent | c4b18e7099ae416eb207b8b407b69d81557c465a (diff) | |
| download | bcm5719-llvm-1a9062408f4dd67eef21c96fddf1c1738200d1ea.tar.gz bcm5719-llvm-1a9062408f4dd67eef21c96fddf1c1738200d1ea.zip | |
Revert "X86RegisterInfo: eliminateFrameIndex: Avoid code duplication; NFC"
It seems we have on situation in a sanitizer enable bootstrap build
where the return instruction has a frame index operand that does not
point to a fixed object and fails the assert added here.
This reverts commit r300923.
This reverts commit r300922.
llvm-svn: 301024
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index b3d3cedf939..9bab9a4cf3b 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -669,27 +669,32 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, MachineFunction &MF = *MI.getParent()->getParent(); const X86FrameLowering *TFI = getFrameLowering(MF); int FrameIndex = MI.getOperand(FIOperandNum).getIndex(); - - // Determine base register and offset. - int FIOffset; unsigned BasePtr; - if (MI.isReturn()) { - assert(MF.getFrameInfo().isFixedObjectIndex(FrameIndex) && - "Should only reference fixed stack objects here"); - FIOffset = TFI->getFrameIndexReferenceSP(MF, FrameIndex, BasePtr, 0); - } else { - FIOffset = TFI->getFrameIndexReference(MF, FrameIndex, BasePtr); - } + + unsigned Opc = MI.getOpcode(); + bool AfterFPPop = Opc == X86::TAILJMPm64 || Opc == X86::TAILJMPm || + Opc == X86::TCRETURNmi || Opc == X86::TCRETURNmi64; + + if (hasBasePointer(MF)) + BasePtr = (FrameIndex < 0 ? FramePtr : getBaseRegister()); + else if (needsStackRealignment(MF)) + BasePtr = (FrameIndex < 0 ? FramePtr : StackPtr); + else if (AfterFPPop) + BasePtr = StackPtr; + else + BasePtr = (TFI->hasFP(MF) ? FramePtr : StackPtr); // LOCAL_ESCAPE uses a single offset, with no register. It only works in the // simple FP case, and doesn't work with stack realignment. On 32-bit, the // offset is from the traditional base pointer location. On 64-bit, the // offset is from the SP at the end of the prologue, not the FP location. This // matches the behavior of llvm.frameaddress. - unsigned Opc = MI.getOpcode(); + unsigned IgnoredFrameReg; if (Opc == TargetOpcode::LOCAL_ESCAPE) { MachineOperand &FI = MI.getOperand(FIOperandNum); - FI.ChangeToImmediate(FIOffset); + int Offset; + Offset = TFI->getFrameIndexReference(MF, FrameIndex, IgnoredFrameReg); + FI.ChangeToImmediate(Offset); return; } @@ -705,6 +710,15 @@ X86RegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, // FrameIndex with base register. Add an offset to the offset. MI.getOperand(FIOperandNum).ChangeToRegister(MachineBasePtr, false); + // Now add the frame object offset to the offset from EBP. + int FIOffset; + if (AfterFPPop) { + // Tail call jmp happens after FP is popped. + const MachineFrameInfo &MFI = MF.getFrameInfo(); + FIOffset = MFI.getObjectOffset(FrameIndex) - TFI->getOffsetOfLocalArea(); + } else + FIOffset = TFI->getFrameIndexReference(MF, FrameIndex, IgnoredFrameReg); + if (BasePtr == StackPtr) FIOffset += SPAdj; |

