Lines Matching +full:tri +full:- +full:default +full:- +full:2

1 //===- PrologEpilogInserter.cpp - Insert Prolog/Epilog code in function ---===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
16 //===----------------------------------------------------------------------===//
93 /// runOnMachineFunction - Insert prolog/epilog code and replace abstract
100 // MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved
112 // TRI->requiresFrameIndexScavenging() for the current function.
132 // target-specific addressing mode.
175 /// StackObjSet - A set of stack object indexes
191 if (!MI.isDebugValue() || !MI.getDebugVariable()->isParameter()) in stashEntryDbgValues()
203 return Var == DV->getDebugVariable() && in stashEntryDbgValues()
204 Expr->fragmentsOverlap(DV->getDebugExpression()); in stashEntryDbgValues()
216 MI->removeFromParent(); in stashEntryDbgValues()
219 /// runOnMachineFunction - Insert prolog/epilog code and replace abstract
224 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); in runOnMachineFunction() local
227 RS = TRI->requiresRegisterScavenging(MF) ? new RegScavenger() : nullptr; in runOnMachineFunction()
228 FrameIndexVirtualScavenging = TRI->requiresFrameIndexScavenging(MF); in runOnMachineFunction()
250 TFI->processFunctionBeforeFrameFinalized(MF, RS); in runOnMachineFunction()
265 I.first->insert(I.first->begin(), I.second.begin(), I.second.end()); in runOnMachineFunction()
269 TFI->processFunctionBeforeFrameIndicesReplaced(MF, RS); in runOnMachineFunction()
273 if (TFI->needsFrameIndexResolution(MF)) { in runOnMachineFunction()
277 TRI->requiresFrameIndexReplacementScavenging(MF); in runOnMachineFunction()
279 if (TRI->eliminateFrameIndicesBackwards()) in runOnMachineFunction()
286 // post-pass, scavenge the virtual registers that frame index elimination in runOnMachineFunction()
288 if (TRI->requiresRegisterScavenging(MF) && FrameIndexVirtualScavenging) in runOnMachineFunction()
295 uint64_t Threshold = TFI->getStackThreshold(); in runOnMachineFunction()
296 if (MF.getFunction().hasFnAttribute("warn-stack-size")) { in runOnMachineFunction()
298 .getFnAttribute("warn-stack-size") in runOnMachineFunction()
302 assert(!Failed && "Invalid warn-stack-size fn attr value"); in runOnMachineFunction()
322 dbgs() << formatv("{0}/{1} ({3:P}) spills, {2}/{1} ({4:P}) variables", in runOnMachineFunction()
323 SpillSize, StackSize, StackSize - SpillSize, SpillPct, in runOnMachineFunction()
324 1.0f - SpillPct)); in runOnMachineFunction()
326 LLVM_DEBUG(dbgs() << formatv(", {0}/{2} ({1:P}) unsafe stack", in runOnMachineFunction()
335 ORE->emit([&]() { in runOnMachineFunction()
345 TFI->emitRemarks(MF, ORE); in runOnMachineFunction()
362 // Get the function call frame set-up and tear-down instruction opcode in calculateCallFrameInfo()
371 // (Re-)Compute the MaxCallFrameSize. in calculateCallFrameInfo()
381 if (TFI->canSimplifyCallFramePseudos(MF)) { in calculateCallFrameInfo()
387 TFI->eliminateCallFramePseudoInstr(MF, *I->getParent(), I); in calculateCallFrameInfo()
397 /// callee-saved registers, and placing prolog and epilog code.
405 // Use the points found by shrink-wrapping, if any. in calculateSaveRestoreBlocks()
413 if (!RestoreBlock->succ_empty() || RestoreBlock->isReturnBlock()) in calculateSaveRestoreBlocks()
447 for (const MCPhysReg &SuperReg : RegInfo->superregs(Reg)) { in assignCalleeSavedSpillSlots()
463 if (!TFI->assignCalleeSavedSpillSlots(F, RegInfo, CSI, MinCSFrameIndex, in assignCalleeSavedSpillSlots()
472 TFI->getCalleeSavedSpillSlots(NumFixedSpillSlots); in assignCalleeSavedSpillSlots()
483 const TargetRegisterClass *RC = RegInfo->getMinimalPhysRegClass(Reg); in assignCalleeSavedSpillSlots()
486 if (RegInfo->hasReservedSpillSlot(F, Reg, FrameIdx)) { in assignCalleeSavedSpillSlots()
495 FixedSlot->Reg != Reg) in assignCalleeSavedSpillSlots()
498 unsigned Size = RegInfo->getSpillSize(*RC); in assignCalleeSavedSpillSlots()
501 Align Alignment = RegInfo->getSpillAlign(*RC); in assignCalleeSavedSpillSlots()
505 Alignment = std::min(Alignment, TFI->getStackAlign()); in assignCalleeSavedSpillSlots()
511 FrameIdx = MFI.CreateFixedSpillStackObject(Size, FixedSlot->Offset); in assignCalleeSavedSpillSlots()
521 /// Helper function to update the liveness information for the callee-saved
527 // - Anything that is not Save or Restore -> LiveThrough. in updateLiveness()
528 // - Save -> LiveIn. in updateLiveness()
529 // - Restore -> LiveOut. in updateLiveness()
530 // The live-out is not attached to the block, so no need to keep in updateLiveness()
556 // dominated by the Save and post-dominated by the Restore. in updateLiveness()
561 for (MachineBasicBlock *SuccBB : CurBB->successors()) in updateLiveness()
572 // Add the callee-saved register as live-in. in updateLiveness()
574 if (!MRI.isReserved(Reg) && !MBB->isLiveIn(Reg)) in updateLiveness()
575 MBB->addLiveIn(Reg); in updateLiveness()
577 // If callee-saved register is spilled to another register rather than in updateLiveness()
594 /// Insert spill code for the callee-saved registers used in the function.
600 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); in insertCSRSaves() local
603 if (!TFI->spillCalleeSavedRegisters(SaveBlock, I, CSI, TRI)) { in insertCSRSaves()
613 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); in insertCSRSaves()
615 TRI, Register()); in insertCSRSaves()
621 /// Insert restore code for the callee-saved registers used in the function.
627 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo(); in insertCSRRestores() local
633 if (!TFI->restoreCalleeSavedRegisters(RestoreBlock, I, CSI, TRI)) { in insertCSRRestores()
640 const TargetRegisterClass *RC = TRI->getMinimalPhysRegClass(Reg); in insertCSRRestores()
642 TRI, Register()); in insertCSRRestores()
669 TFI->determineCalleeSaves(MF, SavedRegs, RS); in spillCalleeSavedRegs()
671 // Assign stack slots for any callee-saved registers that must be spilled. in spillCalleeSavedRegs()
686 // Update the live-in information of all the blocks up to the save point. in spillCalleeSavedRegs()
695 /// AdjustStackOffset - Helper function used to adjust the stack frame offset.
713 LLVM_DEBUG(dbgs() << "alloc FI(" << FrameIdx << ") at SP[" << -Offset in AdjustStackOffset()
715 MFI.setObjectOffset(FrameIdx, -Offset); // Set the computed offset in AdjustStackOffset()
724 /// Compute which bytes of fixed and callee-save stack area are unused and keep
730 // Avoid undefined int64_t -> int conversion below in extreme case. in computeFreeStackSlots()
739 // StackSlot scavenging is only implemented for the default stack. in computeFreeStackSlots()
740 if (MFI.getStackID(i) == TargetStackID::Default) in computeFreeStackSlots()
742 // Add callee-save objects if there are any. in computeFreeStackSlots()
745 if (MFI.getStackID(i) == TargetStackID::Default) in computeFreeStackSlots()
757 ObjStart = -ObjOffset - ObjSize; in computeFreeStackSlots()
758 ObjEnd = -ObjOffset; in computeFreeStackSlots()
790 for (FreeStart = StackBytesFree.find_first(); FreeStart != -1; in scavengeStackSlot()
811 if (FreeStart == -1) in scavengeStackSlot()
815 int ObjStart = -(FreeStart + ObjSize); in scavengeStackSlot()
829 /// AssignProtectedObjSet - Helper function to assign large stack objects (i.e.,
842 /// calculateFrameObjectOffsets - Calculate actual frame offsets for all of the
855 // of stack growth -- so it's always nonnegative. in calculateFrameObjectOffsets()
858 LocalAreaOffset = -LocalAreaOffset; in calculateFrameObjectOffsets()
866 MFI.getStackID(i) == TargetStackID::Default) in calculateFrameObjectOffsets()
872 // non-fixed objects can't be allocated right at the start of local area. in calculateFrameObjectOffsets()
876 // Only allocate objects on the default stack. in calculateFrameObjectOffsets()
877 if (MFI.getStackID(i) != TargetStackID::Default) in calculateFrameObjectOffsets()
883 // the object -- which is given by offset. For down growing stack in calculateFrameObjectOffsets()
885 FixedOff = -MFI.getObjectOffset(i); in calculateFrameObjectOffsets()
898 for (unsigned i = 0; i <= MaxCSFrameIndex - MinCSFrameIndex; ++i) { in calculateFrameObjectOffsets()
900 StackGrowsDown ? MinCSFrameIndex + i : MaxCSFrameIndex - i; in calculateFrameObjectOffsets()
902 // Only allocate objects on the default stack. in calculateFrameObjectOffsets()
903 if (MFI.getStackID(FrameIndex) != TargetStackID::Default) in calculateFrameObjectOffsets()
915 "MFI.getMaxAlign should already account for all callee-saved " in calculateFrameObjectOffsets()
918 // FixedCSEnd is the stack offset to the end of the fixed and callee-save in calculateFrameObjectOffsets()
928 SmallVector<int, 2> SFIs; in calculateFrameObjectOffsets()
929 RS->getScavengingFrameIndices(SFIs); in calculateFrameObjectOffsets()
949 int64_t FIOffset = (StackGrowsDown ? -Offset : Offset) + Entry.second; in calculateFrameObjectOffsets()
963 EHRegNodeFrameIndex = FuncInfo->EHRegNodeFrameIndex; in calculateFrameObjectOffsets()
977 // is expected to be already pre-allocated. in calculateFrameObjectOffsets()
978 if (MFI.getStackID(StackProtectorFI) != TargetStackID::Default) { in calculateFrameObjectOffsets()
979 // If the stack protector isn't on the default stack then it's up to the in calculateFrameObjectOffsets()
982 "Offset of stack protector on non-default stack expected to be " in calculateFrameObjectOffsets()
985 "Stack protector on non-default stack expected to not be " in calculateFrameObjectOffsets()
986 "pre-allocated by LocalStackSlotPass."); in calculateFrameObjectOffsets()
992 "Stack protector not pre-allocated by LocalStackSlotPass."); in calculateFrameObjectOffsets()
1001 if (RS && RS->isScavengingFrameIndex((int)i)) in calculateFrameObjectOffsets()
1007 // Only allocate objects on the default stack. in calculateFrameObjectOffsets()
1008 if (MFI.getStackID(i) != TargetStackID::Default) in calculateFrameObjectOffsets()
1027 // We expect **all** the protected stack objects to be pre-allocated by in calculateFrameObjectOffsets()
1033 llvm_unreachable("Found protected stack objects not pre-allocated by " in calculateFrameObjectOffsets()
1053 if (RS && RS->isScavengingFrameIndex((int)i)) in calculateFrameObjectOffsets()
1061 // Only allocate objects on the default stack. in calculateFrameObjectOffsets()
1062 if (MFI.getStackID(i) != TargetStackID::Default) in calculateFrameObjectOffsets()
1079 // Keep track of which bytes in the fixed and callee-save range are used so we in calculateFrameObjectOffsets()
1099 SmallVector<int, 2> SFIs; in calculateFrameObjectOffsets()
1100 RS->getScavengingFrameIndices(SFIs); in calculateFrameObjectOffsets()
1119 (RegInfo->hasStackRealignment(MF) && MFI.getObjectIndexEnd() != 0)) in calculateFrameObjectOffsets()
1135 SmallVector<int, 2> SFIs; in calculateFrameObjectOffsets()
1136 RS->getScavengingFrameIndices(SFIs); in calculateFrameObjectOffsets()
1139 int64_t Delta = Offset - OffsetBeforeAlignment; in calculateFrameObjectOffsets()
1144 MFI.setObjectOffset(SFI, MFI.getObjectOffset(SFI) - Delta); in calculateFrameObjectOffsets()
1151 int64_t StackSize = Offset - LocalAreaOffset; in calculateFrameObjectOffsets()
1156 /// insertPrologEpilogCode - Scan the function for modified callee saved
1166 // Add epilogue to restore the callee-save registers in each exiting block. in insertPrologEpilogCode()
1170 // Zero call used registers before restoring callee-saved registers. in insertPrologEpilogCode()
1195 /// insertZeroCallUsedRegs - Zero out call used registers.
1199 if (!F.hasFnAttribute("zero-call-used-regs")) in insertZeroCallUsedRegs()
1206 F.getFnAttribute("zero-call-used-regs").getValueAsString()) in insertZeroCallUsedRegs()
1208 .Case("used-gpr-arg", ZeroCallUsedRegsKind::UsedGPRArg) in insertZeroCallUsedRegs()
1209 .Case("used-gpr", ZeroCallUsedRegsKind::UsedGPR) in insertZeroCallUsedRegs()
1210 .Case("used-arg", ZeroCallUsedRegsKind::UsedArg) in insertZeroCallUsedRegs()
1212 .Case("all-gpr-arg", ZeroCallUsedRegsKind::AllGPRArg) in insertZeroCallUsedRegs()
1213 .Case("all-gpr", ZeroCallUsedRegsKind::AllGPR) in insertZeroCallUsedRegs()
1214 .Case("all-arg", ZeroCallUsedRegsKind::AllArg) in insertZeroCallUsedRegs()
1224 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); in insertZeroCallUsedRegs() local
1225 const BitVector AllocatableSet(TRI.getAllocatableSet(MF)); in insertZeroCallUsedRegs()
1228 BitVector UsedRegs(TRI.getNumRegs()); in insertZeroCallUsedRegs()
1248 BitVector LiveIns(TRI.getNumRegs()); in insertZeroCallUsedRegs()
1252 BitVector RegsToZero(TRI.getNumRegs()); in insertZeroCallUsedRegs()
1255 if (TRI.isFixedRegister(MF, Reg)) in insertZeroCallUsedRegs()
1259 if (OnlyGPR && !TRI.isGeneralPurposeRegister(MF, Reg)) in insertZeroCallUsedRegs()
1271 } else if (!TRI.isArgumentRegister(MF, Reg)) { in insertZeroCallUsedRegs()
1293 // This picks up sibling registers (e.q. %al -> %ah). in insertZeroCallUsedRegs()
1294 for (MCRegUnit Unit : TRI.regunits(Reg)) in insertZeroCallUsedRegs()
1297 for (MCPhysReg SReg : TRI.sub_and_superregs_inclusive(Reg)) in insertZeroCallUsedRegs()
1311 for (const MachineOperand &MO : I->operands()) { in insertZeroCallUsedRegs()
1319 for (const MCPhysReg Reg : TRI.sub_and_superregs_inclusive(Reg)) in insertZeroCallUsedRegs()
1326 for (const MCPhysReg *CSRegs = TRI.getCalleeSavedRegs(&MF); in insertZeroCallUsedRegs()
1328 for (MCRegister Reg : TRI.sub_and_superregs_inclusive(CSReg)) in insertZeroCallUsedRegs()
1348 return Succ->getCallFrameSize() == in replaceFrameIndicesBackward()
1349 (*MBB.succ_begin())->getCallFrameSize(); in replaceFrameIndicesBackward()
1354 SPAdj = -SPAdj; in replaceFrameIndicesBackward()
1365 /// replaceFrameIndices - Replace all MO_FrameIndex operands with physical
1373 SPAdj = -SPAdj; in replaceFrameIndices()
1386 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); in replaceFrameIndexDebugInstr() local
1397 StackOffset Offset = TFI->getFrameIndexReference(MF, FrameIdx, Reg); in replaceFrameIndexDebugInstr()
1405 // This changes a pointer-valued variable to dereference that pointer, in replaceFrameIndexDebugInstr()
1410 if (!MI.isIndirectDebugValue() && !DIExpr->isComplex()) in replaceFrameIndexDebugInstr()
1417 if (MI.isIndirectDebugValue() && DIExpr->isImplicit()) { in replaceFrameIndexDebugInstr()
1418 SmallVector<uint64_t, 2> Ops = {dwarf::DW_OP_deref_size, Size}; in replaceFrameIndexDebugInstr()
1424 DIExpr = TRI.prependOffsetExpression(DIExpr, PrependFlags, Offset); in replaceFrameIndexDebugInstr()
1431 TRI.getOffsetOpcodes(Offset, Ops); in replaceFrameIndexDebugInstr()
1454 StackOffset refOffset = TFI->getFrameIndexReferencePreferSP( in replaceFrameIndexDebugInstr()
1471 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); in replaceFrameIndicesBackward() local
1476 LocalRS->enterBasicBlockEnd(*BB); in replaceFrameIndicesBackward()
1478 for (MachineBasicBlock::iterator I = BB->end(); I != BB->begin();) { in replaceFrameIndicesBackward()
1482 SPAdj -= TII.getSPAdjust(MI); in replaceFrameIndicesBackward()
1489 LocalRS->backward(I); in replaceFrameIndicesBackward()
1500 RemovedMI = TRI.eliminateFrameIndex(MI, SPAdj, Idx, LocalRS); in replaceFrameIndicesBackward()
1506 --I; in replaceFrameIndicesBackward()
1515 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo(); in replaceFrameIndices() local
1520 for (MachineBasicBlock::iterator I = BB->begin(); I != BB->end(); ) { in replaceFrameIndices()
1524 I = TFI->eliminateCallFramePseudoInstr(MF, *BB, I); in replaceFrameIndices()
1545 bool AtBeginning = (I == BB->begin()); in replaceFrameIndices()
1546 if (!AtBeginning) --I; in replaceFrameIndices()
1551 TRI.eliminateFrameIndex(MI, SPAdj, i); in replaceFrameIndices()
1555 I = BB->begin(); in replaceFrameIndices()
1573 if (DoIncr && I != BB->end()) in replaceFrameIndices()