[AMDGPU] Fold copy (copy vgpr)
This allows to reduce a number of used VGPRs in some cases.
Differential Revision: https://reviews.llvm.org/D52577
llvm-svn: 343249
diff --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
index d4b64ab..bd0bc73 100644
--- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
+++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp
@@ -477,6 +477,20 @@
UseMI->setDesc(TII->get(MovOp));
CopiesToReplace.push_back(UseMI);
} else {
+ if (UseMI->isCopy() && OpToFold.isReg() &&
+ TargetRegisterInfo::isVirtualRegister(UseMI->getOperand(0).getReg()) &&
+ TargetRegisterInfo::isVirtualRegister(UseMI->getOperand(1).getReg()) &&
+ TRI->isVGPR(*MRI, UseMI->getOperand(0).getReg()) &&
+ TRI->isVGPR(*MRI, UseMI->getOperand(1).getReg()) &&
+ !UseMI->getOperand(1).getSubReg()) {
+ UseMI->getOperand(1).setReg(OpToFold.getReg());
+ UseMI->getOperand(1).setSubReg(OpToFold.getSubReg());
+ UseMI->getOperand(1).setIsKill(false);
+ CopiesToReplace.push_back(UseMI);
+ OpToFold.setIsKill(false);
+ return;
+ }
+
const MCInstrDesc &UseDesc = UseMI->getDesc();
// Don't fold into target independent nodes. Target independent opcodes