Lines Matching +full:tri +full:- +full:state
1 //===-- FixupStatepointCallerSaved.cpp - Fixup caller saved registers ----===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
21 //===----------------------------------------------------------------------===//
35 #define DEBUG_TYPE "fixup-statepoint-caller-saved"
41 "fixup-scs-extend-slot-size", cl::Hidden, cl::init(false),
46 "fixup-allow-gcptr-in-csr", cl::Hidden, cl::init(false),
50 "fixup-scs-enable-copy-propagation", cl::Hidden, cl::init(true),
56 "fixup-max-csr-statepoints", cl::Hidden,
92 static unsigned getRegisterSize(const TargetRegisterInfo &TRI, Register Reg) { in getRegisterSize() argument
93 const TargetRegisterClass *RC = TRI.getMinimalPhysRegClass(Reg); in getRegisterSize()
94 return TRI.getSpillSize(*RC); in getRegisterSize()
105 // Reg - register we're about to spill
106 // RI - On entry points to statepoint.
108 // IsKill - set to true if COPY is Kill (there are no uses of Y)
113 const TargetRegisterInfo &TRI) { in performCopyPropagation() argument
114 // First check if statepoint itself uses Reg in non-meta operands. in performCopyPropagation()
115 int Idx = RI->findRegisterUseOperandIdx(Reg, &TRI, false); in performCopyPropagation()
124 MachineBasicBlock *MBB = RI->getParent(); in performCopyPropagation()
125 MachineBasicBlock::reverse_iterator E = MBB->rend(); in performCopyPropagation()
128 if (It->readsRegister(Reg, &TRI) && !Use) in performCopyPropagation()
130 if (It->modifiesRegister(Reg, &TRI)) { in performCopyPropagation()
140 if (!DestSrc || DestSrc->Destination->getReg() != Reg) in performCopyPropagation()
143 Register SrcReg = DestSrc->Source->getReg(); in performCopyPropagation()
145 if (getRegisterSize(TRI, Reg) != getRegisterSize(TRI, SrcReg)) in performCopyPropagation()
149 << printReg(Reg, &TRI) << " -> " << printReg(SrcReg, &TRI) in performCopyPropagation()
154 IsKill = DestSrc->Source->isKill(); in performCopyPropagation()
160 Def->eraseFromParent(); in performCopyPropagation()
164 const_cast<MachineOperand *>(DestSrc->Source)->setIsKill(false); in performCopyPropagation()
197 // Cache used frame indexes during statepoint re-write to re-use them in
207 // Current index of un-used yet frame index.
211 const TargetRegisterInfo &TRI; member in __anon2f435cf10211::FrameIndexesCache
235 FrameIndexesCache(MachineFrameInfo &MFI, const TargetRegisterInfo &TRI) in FrameIndexesCache() argument
236 : MFI(MFI), TRI(TRI) {} in FrameIndexesCache()
237 // Reset the current state of used frame indexes. After invocation of
255 auto &Vec = It->second; in getFrameIndex()
259 int FI = Idx->second; in getFrameIndex()
261 << printReg(Reg, &TRI) << " at " in getFrameIndex()
268 unsigned Size = getRegisterSize(TRI, Reg); in getFrameIndex()
292 << printReg(Reg, &TRI) << " at landing pad " in getFrameIndex()
306 return getRegisterSize(TRI, A) > getRegisterSize(TRI, B); in sortRegisters()
311 // Describes the state of the current processing statepoint instruction.
317 // If non-null then statepoint is invoke, and this points to the landing pad.
319 const TargetRegisterInfo &TRI; member in __anon2f435cf10211::StatepointState
339 : MI(MI), MF(*MI.getMF()), TRI(*MF.getSubtarget().getRegisterInfo()), in StatepointState()
347 bool Last = std::none_of(++MI.getIterator(), MBB->end().getInstrIterator(), in StatepointState()
355 auto IsEHPad = [](MachineBasicBlock *B) { return B->isEHPad(); }; in StatepointState()
357 assert(llvm::count_if(MBB->successors(), IsEHPad) < 2 && "multiple EHPads"); in StatepointState()
359 auto It = llvm::find_if(MBB->successors(), IsEHPad); in StatepointState()
360 if (It != MBB->succ_end()) in StatepointState()
394 LLVM_DEBUG(dbgs() << "Will spill " << printReg(Reg, &TRI) << " at index " in findRegistersToSpill()
414 LLVM_DEBUG(dbgs() << "Spilling " << printReg(Reg, &TRI) << " to FI " << FI in spillRegisters()
420 Reg = performCopyPropagation(Reg, InsertBefore, IsKill, TII, TRI); in spillRegisters()
421 const TargetRegisterClass *RC = TRI.getMinimalPhysRegClass(Reg); in spillRegisters()
425 RC, &TRI, Register()); in spillRegisters()
431 const TargetRegisterClass *RC = TRI.getMinimalPhysRegClass(Reg); in insertReloadBefore()
433 if (It != MBB->end()) { in insertReloadBefore()
434 TII.loadRegFromStackSlot(*MBB, It, Reg, FI, RC, &TRI, Register()); in insertReloadBefore()
440 assert(!MBB->empty() && "Empty block"); in insertReloadBefore()
441 --It; in insertReloadBefore()
442 TII.loadRegFromStackSlot(*MBB, It, Reg, FI, RC, &TRI, Register()); in insertReloadBefore()
443 MachineInstr *Reload = It->getPrevNode(); in insertReloadBefore()
448 MBB->remove(Reload); in insertReloadBefore()
449 MBB->insertAfter(It, Reload); in insertReloadBefore()
454 MachineBasicBlock *MBB = NewStatepoint->getParent(); in insertReloads()
455 auto InsertPoint = std::next(NewStatepoint->getIterator()); in insertReloads()
459 LLVM_DEBUG(dbgs() << "Reloading " << printReg(Reg, &TRI) << " from FI " in insertReloads()
465 EHPad->SkipPHIsLabelsAndDebug(EHPad->begin(), Reg); in insertReloads()
473 // Re-write statepoint machine instruction to replace caller saved operands
494 NewIndices.push_back(NewMI->getNumOperands()); in rewriteStatepoint()
504 NewIndices.push_back(NewMI->getNumOperands()); in rewriteStatepoint()
522 MIB.addImm(getRegisterSize(TRI, MO.getReg())); in rewriteStatepoint()
534 MIB->tieOperands(NewIndices[OldDef], MIB->getNumOperands() - 1); in rewriteStatepoint()
538 assert(CurOpIdx == (OpsToSpill.size() - 1) && "Not all operands processed"); in rewriteStatepoint()
540 NewMI->setMemRefs(MF, MI.memoperands()); in rewriteStatepoint()
549 MF.getMachineMemOperand(PtrInfo, Flags, getRegisterSize(TRI, R), in rewriteStatepoint()
551 NewMI->addMemOperand(MF, MMO); in rewriteStatepoint()
555 MI.getParent()->insert(MI, NewMI); in rewriteStatepoint()
566 const TargetRegisterInfo &TRI; member in __anon2f435cf10211::StatepointProcessor
572 : MF(MF), TRI(*MF.getSubtarget().getRegisterInfo()), in StatepointProcessor()
573 CacheFI(MF.getFrameInfo(), TRI) {} in StatepointProcessor()
581 LLVM_DEBUG(dbgs() << "\nMBB " << MI.getParent()->getNumber() << " " in process()
582 << MI.getParent()->getName() << " : process statepoint " in process()
585 const uint32_t *Mask = TRI.getCallPreservedMask(MF, CC); in process()