================
@@ -133,23 +145,116 @@ bool AMDGPURegBankCombinerImpl::isVgprRegBank(Register 
Reg) const {
   return RBI.getRegBank(Reg, MRI, TRI)->getID() == AMDGPU::VGPRRegBankID;
 }
 
+bool AMDGPURegBankCombinerImpl::isSgprRegBank(Register Reg) const {
+  return RBI.getRegBank(Reg, MRI, TRI)->getID() == AMDGPU::SGPRRegBankID;
+}
+
 Register AMDGPURegBankCombinerImpl::getAsVgpr(Register Reg) const {
   if (isVgprRegBank(Reg))
     return Reg;
 
+  const RegisterBank &VgprRB = RBI.getRegBank(AMDGPU::VGPRRegBankID);
+
+  // Build constants directly in VGPR instead of copying from SGPR.
+  if (auto V = getIConstantVRegValWithLookThrough(Reg, MRI)) {
+    auto VgprCst = B.buildConstant(MRI.getType(Reg), V->Value);
+    MRI.setRegBank(VgprCst.getReg(0), VgprRB);
+    return VgprCst.getReg(0);
+  }
+  if (auto V = getFConstantVRegValWithLookThrough(Reg, MRI)) {
+    if (MRI.getType(Reg).getSizeInBits() >= 32) {
+      auto VgprCst = B.buildFConstant(MRI.getType(Reg), V->Value);
+      MRI.setRegBank(VgprCst.getReg(0), VgprRB);
+      return VgprCst.getReg(0);
+    }
+  }
+
+  // Look through READANYLANE: the VGPR source holds the same uniform value.
+  if (const MachineInstr *Def = MRI.getVRegDef(Reg)) {
+    if (Def->getOpcode() == AMDGPU::G_AMDGPU_READANYLANE) {
+      Register Src = Def->getOperand(1).getReg();
+      if (isVgprRegBank(Src))
+        return Src;
+    }
+  }
+
   // Search for existing copy of Reg to vgpr.
-  for (MachineInstr &Use : MRI.use_instructions(Reg)) {
+  for (MachineInstr &Use : MRI.use_nodbg_instructions(Reg)) {
     Register Def = Use.getOperand(0).getReg();
     if (Use.getOpcode() == AMDGPU::COPY && isVgprRegBank(Def))
       return Def;
----------------
petar-avramovic wrote:

Could it be that you get Def to be defined after MI, so you end up using before 
def?

https://github.com/llvm/llvm-project/pull/179352
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to