Skip to content

Commit 0da34b8

Browse files
authored
[AMDGPU] Analyze implicit reg operands when generating swaps (#192220)
Fix register usage analysis during swap generation by including implicit register operands. Critical change was to replace MachineInstr uses/defs with all_uses/all_defs. --------- Signed-off-by: John Lu <John.Lu@amd.com>
1 parent 7ddf771 commit 0da34b8

2 files changed

Lines changed: 24 additions & 8 deletions

File tree

llvm/lib/Target/AMDGPU/SIShrinkInstructions.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ class SIShrinkInstructions {
4848
bool shrinkMadFma(MachineInstr &MI) const;
4949
ChangeKind shrinkScalarLogicOp(MachineInstr &MI) const;
5050
bool tryReplaceDeadSDST(MachineInstr &MI) const;
51-
bool instAccessReg(iterator_range<MachineInstr::const_mop_iterator> &&R,
52-
Register Reg, unsigned SubReg) const;
51+
bool instAccessReg(MachineInstr::filtered_const_mop_range &&R, Register Reg,
52+
unsigned SubReg) const;
5353
bool instReadsReg(const MachineInstr *MI, unsigned Reg,
5454
unsigned SubReg) const;
5555
bool instModifiesReg(const MachineInstr *MI, unsigned Reg,
@@ -620,12 +620,9 @@ ChangeKind SIShrinkInstructions::shrinkScalarLogicOp(MachineInstr &MI) const {
620620
// This is the same as MachineInstr::readsRegister/modifiesRegister except
621621
// it takes subregs into account.
622622
bool SIShrinkInstructions::instAccessReg(
623-
iterator_range<MachineInstr::const_mop_iterator> &&R, Register Reg,
623+
MachineInstr::filtered_const_mop_range &&R, Register Reg,
624624
unsigned SubReg) const {
625625
for (const MachineOperand &MO : R) {
626-
if (!MO.isReg())
627-
continue;
628-
629626
if (Reg.isPhysical() && MO.getReg().isPhysical()) {
630627
if (TRI->regsOverlap(Reg, MO.getReg()))
631628
return true;
@@ -641,12 +638,12 @@ bool SIShrinkInstructions::instAccessReg(
641638

642639
bool SIShrinkInstructions::instReadsReg(const MachineInstr *MI, unsigned Reg,
643640
unsigned SubReg) const {
644-
return instAccessReg(MI->uses(), Reg, SubReg);
641+
return instAccessReg(MI->all_uses(), Reg, SubReg);
645642
}
646643

647644
bool SIShrinkInstructions::instModifiesReg(const MachineInstr *MI, unsigned Reg,
648645
unsigned SubReg) const {
649-
return instAccessReg(MI->defs(), Reg, SubReg);
646+
return instAccessReg(MI->all_defs(), Reg, SubReg);
650647
}
651648

652649
TargetInstrInfo::RegSubRegPair

llvm/test/CodeGen/AMDGPU/v_swap_b32.mir

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -967,3 +967,22 @@ body: |
967967
$vgpr1 = V_MOV_B32_e32 killed $vgpr3, implicit $exec, implicit $vgpr2, implicit-def $vgpr0_vgpr1, implicit killed $vgpr3
968968
S_SETPC_B64_return $sgpr30_sgpr31, implicit $vgpr0, implicit $vgpr1
969969
...
970+
971+
# GCN-LABEL: negative_test_implicit_blocks_swap
972+
# GCN: $vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec
973+
# GCN-NEXT: $sgpr30_sgpr31 = SI_CALL killed renamable $sgpr0_sgpr1, 0, implicit-def $vgpr2
974+
# GCN-NEXT: $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
975+
# GCN-NEXT: $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
976+
# GCN-NEXT: S_SETPC_B64_return $sgpr30_sgpr31, implicit $vgpr0, implicit $vgpr1
977+
---
978+
name: negative_test_implicit_blocks_swap
979+
tracksRegLiveness: true
980+
body: |
981+
bb.0:
982+
liveins: $vgpr0, $vgpr1, $sgpr0_sgpr1
983+
$vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec
984+
$sgpr30_sgpr31 = SI_CALL killed renamable $sgpr0_sgpr1, 0, implicit-def $vgpr2
985+
$vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
986+
$vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
987+
S_SETPC_B64_return $sgpr30_sgpr31, implicit $vgpr0, implicit $vgpr1
988+
...

0 commit comments

Comments
 (0)