Lines Matching +full:r +full:- +full:tile
1 //===-- X86PreTileConfig.cpp - Tile Register Pre-configure-----------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 /// \file Pass to pre-config the shapes of AMX registers
24 //===----------------------------------------------------------------------===//
45 #define DEBUG_TYPE "tile-pre-config"
51 ": Failed to config tile register, please define the shape earlier"); in emitErrorMsg()
63 for (auto I = MBB->begin(), E = MBB->end(); I != E && I->isPHI(); in MIRef()
68 : MI(MI), MBB(MI->getParent()), in MIRef()
69 Pos(std::distance(MBB->instr_begin(), ++MI->getIterator())) {} in MIRef()
72 Pos(std::distance(MBB->instr_begin(), ++MI->getIterator())) {} in MIRef()
113 UsableRegs.clearBitsInMask(Iter->getRegMask()); in isDestructiveCall()
125 MRI->getRegClass(MO.getReg())->getID() == X86::TILERegClassID) { in isAMXInstruction()
135 if (!MLI->isLoopHeader(Header)) in isLoopBackEdge()
137 auto *ML = MLI->getLoopFor(Header); in isLoopBackEdge()
138 if (ML->contains(Bottom) && ML->isLoopLatch(Bottom)) in isLoopBackEdge()
151 auto InsertPoint = FirstAMX.MI->getIterator(); in hoistShapesInBB()
154 if (I->MI->mayLoadOrStore()) in hoistShapesInBB()
156 for (auto &MO : I->MI->operands()) { in hoistShapesInBB()
161 if (MO.isReg() && MIRef(MRI->getVRegDef(MO.getReg())) > FirstAMX) in hoistShapesInBB()
165 MBB->insert(InsertPoint, I->MI->removeFromParent()); in hoistShapesInBB()
169 Shapes.push_back(MIRef(&*--InsertPoint, MBB)); in hoistShapesInBB()
178 return "Tile Register Pre-configure"; in getPassName()
206 "Tile Register Pre-configure", false, false)
209 "Tile Register Pre-configure", false, false) in INITIALIZE_PASS_DEPENDENCY()
222 Register R = WorkList.pop_back_val(); in INITIALIZE_PASS_DEPENDENCY() local
223 MachineInstr *DefMI = MRI->getVRegDef(R); in INITIALIZE_PASS_DEPENDENCY()
224 assert(DefMI && "R must has one define instruction"); in INITIALIZE_PASS_DEPENDENCY()
225 MachineBasicBlock *DefMBB = DefMI->getParent(); in INITIALIZE_PASS_DEPENDENCY()
226 if (DefMI->isMoveImmediate() || !DefVisited.insert(DefMI).second) in INITIALIZE_PASS_DEPENDENCY()
228 if (DefMI->isPHI()) { in INITIALIZE_PASS_DEPENDENCY()
229 for (unsigned I = 1; I < DefMI->getNumOperands(); I += 2) in INITIALIZE_PASS_DEPENDENCY()
230 if (isLoopBackEdge(DefMBB, DefMI->getOperand(I + 1).getMBB())) in INITIALIZE_PASS_DEPENDENCY()
233 WorkList.push_back(DefMI->getOperand(I).getReg()); in INITIALIZE_PASS_DEPENDENCY()
242 // Early exit in the common case of non-AMX code. in runOnMachineFunction()
243 if (X86FI->getAMXProgModel() != AMXProgModelEnum::ManagedRA) in runOnMachineFunction()
249 const TargetRegisterClass *RC = TRI->getRegClass(X86::TILERegClassID); in runOnMachineFunction()
251 BitVector AMXRegs(TRI->getNumRegs()); in runOnMachineFunction()
252 for (unsigned I = 0; I < RC->getNumRegs(); I++) in runOnMachineFunction()
265 // If there's call before the AMX, we need to reload tile config. in runOnMachineFunction()
268 else // Otherwise, we need tile config to live in this BB. in runOnMachineFunction()
293 for (auto *Pred : MBB->predecessors()) { in runOnMachineFunction()
306 // There's no AMX instruction if we didn't find a tile config live in point. in runOnMachineFunction()
315 // We are not able to config tile registers since the shape to config in runOnMachineFunction()
317 // would not config tile registers. in runOnMachineFunction()
331 for (auto *Pred : MBB->predecessors()) { in runOnMachineFunction()
344 // Try to insert for the tile config live in points. in runOnMachineFunction()
359 for (auto *Succ : I.MBB->successors()) in runOnMachineFunction()
374 auto II = I.MI ? I.MI->getIterator() : I.MBB->instr_begin(); in runOnMachineFunction()
375 addFrameReference(BuildMI(*I.MBB, ++II, DL, TII->get(X86::PLDTILECFGV)), in runOnMachineFunction()
385 Register Zmm = MRI->createVirtualRegister(&X86::VR512RegClass); in runOnMachineFunction()
386 BuildMI(MBB, MI, DL, TII->get(X86::AVX512_512_SET0), Zmm); in runOnMachineFunction()
387 addFrameReference(BuildMI(MBB, MI, DL, TII->get(X86::VMOVUPSZmr)), SS) in runOnMachineFunction()
390 Register Ymm = MRI->createVirtualRegister(&X86::VR256RegClass); in runOnMachineFunction()
391 BuildMI(MBB, MI, DL, TII->get(X86::AVX_SET0), Ymm); in runOnMachineFunction()
392 addFrameReference(BuildMI(MBB, MI, DL, TII->get(X86::VMOVUPSYmr)), SS) in runOnMachineFunction()
394 addFrameReference(BuildMI(MBB, MI, DL, TII->get(X86::VMOVUPSYmr)), SS, 32) in runOnMachineFunction()
399 Register Xmm = MRI->createVirtualRegister(&X86::VR128RegClass); in runOnMachineFunction()
400 BuildMI(MBB, MI, DL, TII->get(X86::V_SET0), Xmm); in runOnMachineFunction()
401 addFrameReference(BuildMI(MBB, MI, DL, TII->get(StoreOpc)), SS).addReg(Xmm); in runOnMachineFunction()
402 addFrameReference(BuildMI(MBB, MI, DL, TII->get(StoreOpc)), SS, 16) in runOnMachineFunction()
404 addFrameReference(BuildMI(MBB, MI, DL, TII->get(StoreOpc)), SS, 32) in runOnMachineFunction()
406 addFrameReference(BuildMI(MBB, MI, DL, TII->get(StoreOpc)), SS, 48) in runOnMachineFunction()
410 addFrameReference(BuildMI(MBB, MI, DL, TII->get(X86::MOV8mi)), SS).addImm(1); in runOnMachineFunction()