Skip to content

Commit 201f892

Browse files
committed
[AMDGPU] Preliminary patch for divergence driven instruction selection. Operands Folding 1.
Reviewers: rampitec Differential revision: https://reviews/llvm/org/D51316 llvm-svn: 341068
1 parent ca49e39 commit 201f892

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

llvm/lib/Target/AMDGPU/SIFoldOperands.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,15 +438,38 @@ void SIFoldOperands::foldOperand(
438438

439439
bool FoldingImm = OpToFold.isImm();
440440

441-
// In order to fold immediates into copies, we need to change the
442-
// copy to a MOV.
443441
if (FoldingImm && UseMI->isCopy()) {
444442
unsigned DestReg = UseMI->getOperand(0).getReg();
445443
const TargetRegisterClass *DestRC
446444
= TargetRegisterInfo::isVirtualRegister(DestReg) ?
447445
MRI->getRegClass(DestReg) :
448446
TRI->getPhysRegClass(DestReg);
449447

448+
unsigned SrcReg = UseMI->getOperand(1).getReg();
449+
if (TargetRegisterInfo::isVirtualRegister(DestReg) &&
450+
TargetRegisterInfo::isVirtualRegister(SrcReg)) {
451+
const TargetRegisterClass * SrcRC = MRI->getRegClass(SrcReg);
452+
if (TRI->isSGPRClass(SrcRC) && TRI->hasVGPRs(DestRC)) {
453+
MachineRegisterInfo::use_iterator NextUse;
454+
SmallVector<FoldCandidate, 4> CopyUses;
455+
for (MachineRegisterInfo::use_iterator
456+
Use = MRI->use_begin(DestReg), E = MRI->use_end();
457+
Use != E; Use = NextUse) {
458+
NextUse = std::next(Use);
459+
FoldCandidate FC = FoldCandidate(Use->getParent(),
460+
Use.getOperandNo(), &UseMI->getOperand(1));
461+
CopyUses.push_back(FC);
462+
}
463+
for (auto & F : CopyUses) {
464+
foldOperand(*F.OpToFold, F.UseMI, F.UseOpNo,
465+
FoldList, CopiesToReplace);
466+
}
467+
}
468+
}
469+
470+
// In order to fold immediates into copies, we need to change the
471+
// copy to a MOV.
472+
450473
unsigned MovOp = TII->getMovOpcode(DestRC);
451474
if (MovOp == AMDGPU::COPY)
452475
return;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# RUN: llc -march=amdgcn -run-pass si-fold-operands %s -o - | FileCheck -check-prefix=GCN %s
2+
3+
# GCN-LABEL: name: fold-imm-copy
4+
# GCN: [[SREG:%[0-9+]]]:sreg_32_xm0 = S_MOV_B32 65535
5+
# GCN: V_AND_B32_e32 [[SREG]]
6+
7+
name: fold-imm-copy
8+
body: |
9+
bb.0:
10+
liveins: $vgpr0, $sgpr0_sgpr1
11+
%0:vgpr_32 = COPY $vgpr0
12+
%1:sgpr_64 = COPY $sgpr0_sgpr1
13+
%2:sreg_128 = S_LOAD_DWORDX4_IMM %1, 9, 0
14+
%3:sreg_32_xm0 = S_MOV_B32 2
15+
%4:vgpr_32 = V_LSHLREV_B32_e64 killed %3, %0, implicit $exec
16+
%5:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
17+
%6:vreg_64 = REG_SEQUENCE killed %4, %subreg.sub0, killed %5, %subreg.sub1
18+
%7:vgpr_32 = BUFFER_LOAD_DWORD_ADDR64 %6, %2, 0, 4, 0, 0, 0, implicit $exec
19+
%8:sreg_32_xm0 = S_MOV_B32 65535
20+
%9:vgpr_32 = COPY %8
21+
%10:vgpr_32 = V_AND_B32_e32 %7, %9, implicit $exec
22+
...

0 commit comments

Comments
 (0)