Lines Matching +full:reg +full:- +full:addr
1 //===- RDFCopy.cpp --------------------------------------------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // RDF-based copy propagation.
11 //===----------------------------------------------------------------------===//
36 static cl::opt<unsigned> CpLimit("rdf-cp-limit", cl::init(0), cl::Hidden);
41 unsigned Opc = MI->getOpcode(); in interpretAsCopy()
44 const MachineOperand &Dst = MI->getOperand(0); in interpretAsCopy()
45 const MachineOperand &Src = MI->getOperand(1); in interpretAsCopy()
48 assert(Register::isPhysicalRegister(DstR.Reg)); in interpretAsCopy()
49 assert(Register::isPhysicalRegister(SrcR.Reg)); in interpretAsCopy()
51 if (TRI.getMinimalPhysRegClass(DstR.Reg) != in interpretAsCopy()
52 TRI.getMinimalPhysRegClass(SrcR.Reg)) in interpretAsCopy()
70 auto FS = DefM.find(I.second.Reg); in recordCopy()
71 if (FS == DefM.end() || FS->second.empty()) in recordCopy()
73 RDefMap[I.second][SA.Id] = FS->second.top()->Id; in recordCopy()
82 for (NodeAddr<RefNode*> RA : IA.Addr->members(DFG)) in updateMap()
83 RRs.insert(RA.Addr->getRegRef(DFG)); in updateMap()
97 auto F = DefM.find(R.first.Reg); in updateMap()
98 if (F == DefM.end() || F->second.empty()) in updateMap()
100 R.second[IA.Id] = F->second.top()->Id; in updateMap()
109 for (NodeAddr<InstrNode*> IA : BA.Addr->members(DFG)) { in scanBlock()
113 if (interpretAsCopy(SA.Addr->getCode(), EM)) in scanBlock()
123 Changed |= scanBlock(I->getBlock()); in scanBlock()
135 dbgs() << "Instr: " << *DFG.addr<StmtNode*>(I).Addr->getCode(); in run()
146 dbgs() << Print<RegisterRef>(R.first, DFG) << " -> {"; in run()
159 auto MinPhysReg = [this] (RegisterRef RR) -> unsigned { in run()
161 const TargetRegisterClass &RC = *TRI.getMinimalPhysRegClass(RR.Reg); in run()
163 return RR.Reg; in run()
164 for (MCSubRegIndexIterator S(RR.Reg, &TRI); S.isValid(); ++S) in run()
178 auto SA = DFG.addr<InstrNode*>(C); in run()
183 EqualityMap &EM = FS->second; in run()
184 for (NodeAddr<DefNode*> DA : SA.Addr->members_if(DFG.IsDef, DFG)) { in run()
185 RegisterRef DR = DA.Addr->getRegRef(DFG); in run()
189 RegisterRef SR = FR->second; in run()
196 for (NodeId N = DA.Addr->getReachedUse(), NextN; N; N = NextN) { in run()
197 auto UA = DFG.addr<UseNode*>(N); in run()
198 NextN = UA.Addr->getSibling(); in run()
199 uint16_t F = UA.Addr->getFlags(); in run()
202 if (!PRI.equal_to(UA.Addr->getRegRef(DFG), DR)) in run()
205 NodeAddr<InstrNode*> IA = UA.Addr->getOwner(DFG); in run()
210 MachineOperand &Op = UA.Addr->getOp(); in run()
216 << *NodeAddr<StmtNode*>(IA).Addr->getCode(); in run()
224 UA.Addr->linkToDef(UA.Id, DFG.addr<DefNode*>(RDefSR_SA)); in run()
226 UA.Addr->setReachingDef(0); in run()
227 UA.Addr->setSibling(0); in run()
240 auto &M = FC->second; in run()
248 } // for (N in reached-uses) in run()