@@ -2026,6 +2026,57 @@ void SIInstrInfo::insertReturn(MachineBasicBlock &MBB) const {
20262026 }
20272027}
20282028
2029+ MachineBasicBlock *SIInstrInfo::insertSimulatedTrap (MachineRegisterInfo &MRI,
2030+ MachineBasicBlock &MBB,
2031+ MachineInstr &MI,
2032+ const DebugLoc &DL) const {
2033+ MachineFunction *MF = MBB.getParent ();
2034+ MachineBasicBlock *SplitBB = MBB.splitAt (MI, /* UpdateLiveIns=*/ false );
2035+ MachineBasicBlock *HaltLoop = MF->CreateMachineBasicBlock ();
2036+ MF->push_back (HaltLoop);
2037+
2038+ constexpr unsigned DoorbellIDMask = 0x3ff ;
2039+ constexpr unsigned ECQueueWaveAbort = 0x400 ;
2040+
2041+ // Start with a `s_trap 2`, if we're in PRIV=1 and we need the workaround this
2042+ // will be a nop.
2043+ BuildMI (MBB, MI, DL, get (AMDGPU::S_TRAP))
2044+ .addImm (static_cast <unsigned >(GCNSubtarget::TrapID::LLVMAMDHSATrap));
2045+ Register DoorbellReg = MRI.createVirtualRegister (&AMDGPU::SReg_32RegClass);
2046+ BuildMI (MBB, MI, DL, get (AMDGPU::S_SENDMSG_RTN_B32), DoorbellReg)
2047+ .addImm (AMDGPU::SendMsg::ID_RTN_GET_DOORBELL);
2048+ BuildMI (MBB, MI, DL, get (AMDGPU::S_MOV_B32), AMDGPU::TTMP2)
2049+ .addUse (AMDGPU::M0);
2050+ Register DoorbellRegMasked =
2051+ MRI.createVirtualRegister (&AMDGPU::SReg_32RegClass);
2052+ BuildMI (MBB, MI, DL, get (AMDGPU::S_AND_B32), DoorbellRegMasked)
2053+ .addUse (DoorbellReg)
2054+ .addImm (DoorbellIDMask);
2055+ Register SetWaveAbortBit =
2056+ MRI.createVirtualRegister (&AMDGPU::SReg_32RegClass);
2057+ BuildMI (MBB, MI, DL, get (AMDGPU::S_OR_B32), SetWaveAbortBit)
2058+ .addUse (DoorbellRegMasked)
2059+ .addImm (ECQueueWaveAbort);
2060+ BuildMI (MBB, MI, DL, get (AMDGPU::S_MOV_B32), AMDGPU::M0)
2061+ .addUse (SetWaveAbortBit);
2062+ BuildMI (MBB, MI, DL, get (AMDGPU::S_SENDMSG))
2063+ .addImm (AMDGPU::SendMsg::ID_INTERRUPT);
2064+ BuildMI (MBB, MI, DL, get (AMDGPU::S_MOV_B32), AMDGPU::M0)
2065+ .addUse (AMDGPU::TTMP2);
2066+ BuildMI (MBB, MI, DL, get (AMDGPU::S_BRANCH)).addMBB (HaltLoop);
2067+
2068+ BuildMI (*HaltLoop, HaltLoop->end (), DL, get (AMDGPU::S_SETHALT)).addImm (5 );
2069+ BuildMI (*HaltLoop, HaltLoop->end (), DL, get (AMDGPU::S_BRANCH))
2070+ .addMBB (HaltLoop);
2071+
2072+ if (SplitBB != &MBB)
2073+ MBB.removeSuccessor (SplitBB);
2074+ MBB.addSuccessor (HaltLoop);
2075+ HaltLoop->addSuccessor (HaltLoop);
2076+
2077+ return SplitBB;
2078+ }
2079+
20292080unsigned SIInstrInfo::getNumWaitStates (const MachineInstr &MI) {
20302081 switch (MI.getOpcode ()) {
20312082 default :
0 commit comments