================
@@ -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);
+ }
+ }
+
----------------
petar-avramovic wrote:
Does this really make a difference? SIFoldOperands should be dealing with it
constant being defined in sgpr or vgpr.
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