================ @@ -63,4 +70,189 @@ char &llvm::AMDGPURBSelectID = AMDGPURBSelect::ID; FunctionPass *llvm::createAMDGPURBSelectPass() { return new AMDGPURBSelect(); } -bool AMDGPURBSelect::runOnMachineFunction(MachineFunction &MF) { return true; } +bool shouldRBSelect(MachineInstr &MI) { + if (isTargetSpecificOpcode(MI.getOpcode()) && !MI.isPreISelOpcode()) + return false; + + if (MI.getOpcode() == AMDGPU::PHI || MI.getOpcode() == AMDGPU::IMPLICIT_DEF) + return false; + + if (MI.isInlineAsm()) + return false; + + return true; +} + +void setRB(MachineInstr &MI, MachineOperand &DefOP, MachineIRBuilder B, + MachineRegisterInfo &MRI, const RegisterBank &RB) { + Register Reg = DefOP.getReg(); + // Register that already has Register class got it during pre-inst selection + // of another instruction. Maybe cross bank copy was required so we insert a + // copy trat can be removed later. This simplifies post-rb-legalize artifact + // combiner and avoids need to special case some patterns. + if (MRI.getRegClassOrNull(Reg)) { + LLT Ty = MRI.getType(Reg); + Register NewReg = MRI.createVirtualRegister({&RB, Ty}); + DefOP.setReg(NewReg); + + auto &MBB = *MI.getParent(); + B.setInsertPt(MBB, MI.isPHI() ? MBB.getFirstNonPHI() + : std::next(MI.getIterator())); + B.buildCopy(Reg, NewReg); + + // The problem was discoverd for uniform S1 that was used as both ---------------- rovka wrote:
```suggestion // The problem was discovered for uniform S1 that was used as both ``` https://github.com/llvm/llvm-project/pull/112863 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits