diff options
author | Alexander Timofeev <Alexander.Timofeev@amd.com> | 2018-08-30 13:55:04 +0000 |
---|---|---|
committer | Alexander Timofeev <Alexander.Timofeev@amd.com> | 2018-08-30 13:55:04 +0000 |
commit | 201f892b3b597f24287ab6a712a286e25a45a7d9 (patch) | |
tree | c20d5238f0c9400b8af21a9be8c7518b2e879e65 /llvm/lib/Target/AMDGPU | |
parent | ca49e391b3428a20b4924bafebd50dbd5f4f5ec1 (diff) | |
download | bcm5719-llvm-201f892b3b597f24287ab6a712a286e25a45a7d9.tar.gz bcm5719-llvm-201f892b3b597f24287ab6a712a286e25a45a7d9.zip |
[AMDGPU] Preliminary patch for divergence driven instruction selection. Operands Folding 1.
Reviewers: rampitec
Differential revision: https://reviews/llvm/org/D51316
llvm-svn: 341068
Diffstat (limited to 'llvm/lib/Target/AMDGPU')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIFoldOperands.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp index eed9a4d43f6..d4b64ab203a 100644 --- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp +++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp @@ -438,8 +438,6 @@ void SIFoldOperands::foldOperand( bool FoldingImm = OpToFold.isImm(); - // In order to fold immediates into copies, we need to change the - // copy to a MOV. if (FoldingImm && UseMI->isCopy()) { unsigned DestReg = UseMI->getOperand(0).getReg(); const TargetRegisterClass *DestRC @@ -447,6 +445,31 @@ void SIFoldOperands::foldOperand( MRI->getRegClass(DestReg) : TRI->getPhysRegClass(DestReg); + unsigned SrcReg = UseMI->getOperand(1).getReg(); + if (TargetRegisterInfo::isVirtualRegister(DestReg) && + TargetRegisterInfo::isVirtualRegister(SrcReg)) { + const TargetRegisterClass * SrcRC = MRI->getRegClass(SrcReg); + if (TRI->isSGPRClass(SrcRC) && TRI->hasVGPRs(DestRC)) { + MachineRegisterInfo::use_iterator NextUse; + SmallVector<FoldCandidate, 4> CopyUses; + for (MachineRegisterInfo::use_iterator + Use = MRI->use_begin(DestReg), E = MRI->use_end(); + Use != E; Use = NextUse) { + NextUse = std::next(Use); + FoldCandidate FC = FoldCandidate(Use->getParent(), + Use.getOperandNo(), &UseMI->getOperand(1)); + CopyUses.push_back(FC); + } + for (auto & F : CopyUses) { + foldOperand(*F.OpToFold, F.UseMI, F.UseOpNo, + FoldList, CopiesToReplace); + } + } + } + + // In order to fold immediates into copies, we need to change the + // copy to a MOV. + unsigned MovOp = TII->getMovOpcode(DestRC); if (MovOp == AMDGPU::COPY) return; |