Skip to content

Commit d3c91d5

Browse files
authored
AMDGPU: Add agpr versions of global return atomics (#156890)
Incremental step towards removing the special case hack in TargetInstrInfo::getRegClass.
1 parent a7c2ce6 commit d3c91d5

File tree

3 files changed

+67
-22
lines changed

3 files changed

+67
-22
lines changed

llvm/lib/Target/AMDGPU/DSInstructions.td

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,6 @@ class DS_Pseudo <string opName, dag outs, dag ins, string asmOps, list<dag> patt
5151
let Uses = !if(has_m0_read, [M0, EXEC], [EXEC]);
5252
}
5353

54-
class DstOperandIsAV<dag OperandList> {
55-
bit ret = OperandIsAV<!getdagarg<DAGOperand>(OperandList, "vdst")>.ret;
56-
}
57-
58-
class DstOperandIsAGPR<dag OperandList> {
59-
bit ret = OperandIsAGPR<!getdagarg<DAGOperand>(OperandList, "vdst")>.ret;
60-
}
61-
62-
class DataOperandIsAV<dag OperandList> {
63-
bit ret = OperandIsAV<!getdagarg<DAGOperand>(OperandList, "data0")>.ret;
64-
}
65-
66-
class DataOperandIsAGPR<dag OperandList> {
67-
bit ret = OperandIsAGPR<!getdagarg<DAGOperand>(OperandList, "data0")>.ret;
68-
}
69-
7054
class DS_Real <DS_Pseudo ps, string opName = ps.Mnemonic> :
7155
InstSI <ps.OutOperandList, ps.InOperandList, opName # ps.AsmOperands>,
7256
Enc64 {
@@ -115,13 +99,13 @@ class DS_Real <DS_Pseudo ps, string opName = ps.Mnemonic> :
11599
// register fields are only 8-bit, so data operands must all be AGPR
116100
// or VGPR.
117101
defvar DstOpIsAV = !if(ps.has_vdst,
118-
DstOperandIsAV<ps.OutOperandList>.ret, 0);
102+
VDstOperandIsAV<ps.OutOperandList>.ret, 0);
119103
defvar DstOpIsAGPR = !if(ps.has_vdst,
120-
DstOperandIsAGPR<ps.OutOperandList>.ret, 0);
104+
VDstOperandIsAGPR<ps.OutOperandList>.ret, 0);
121105
defvar DataOpIsAV = !if(!or(ps.has_data0, ps.has_gws_data0),
122-
DataOperandIsAV<ps.InOperandList>.ret, 0);
106+
Data0OperandIsAV<ps.InOperandList>.ret, 0);
123107
defvar DataOpIsAGPR = !if(!or(ps.has_data0, ps.has_gws_data0),
124-
DataOperandIsAGPR<ps.InOperandList>.ret, 0);
108+
Data0OperandIsAGPR<ps.InOperandList>.ret, 0);
125109

126110
bits<1> acc = !if(ps.has_vdst,
127111
!if(DstOpIsAV, vdst{9}, DstOpIsAGPR),

llvm/lib/Target/AMDGPU/FLATInstructions.td

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,18 @@ class FLAT_Real <bits<7> op, FLAT_Pseudo ps, string opName = ps.Mnemonic> :
137137
// unsigned for flat accesses.
138138
bits<13> offset;
139139
// GFX90A+ only: instruction uses AccVGPR for data
140-
bits<1> acc = !if(ps.has_vdst, vdst{9}, !if(ps.has_data, vdata{9}, 0));
140+
defvar DstOpIsAV = !if(ps.has_vdst,
141+
VDstOperandIsAV<ps.OutOperandList>.ret, 0);
142+
defvar DstOpIsAGPR = !if(ps.has_vdst,
143+
VDstOperandIsAGPR<ps.OutOperandList>.ret, 0);
144+
defvar DataOpIsAV = !if(ps.has_data,
145+
VDataOperandIsAV<ps.InOperandList>.ret, 0);
146+
defvar DataOpIsAGPR = !if(ps.has_data,
147+
VDataOperandIsAGPR<ps.InOperandList>.ret, 0);
148+
149+
bits<1> acc = !if(ps.has_vdst,
150+
!if(DstOpIsAV, vdst{9}, DstOpIsAGPR),
151+
!if(DataOpIsAV, vdata{9}, DataOpIsAGPR));
141152

142153
// We don't use tfe right now, and it was removed in gfx9.
143154
bits<1> tfe = 0;
@@ -860,6 +871,30 @@ multiclass FLAT_Global_Atomic_Pseudo_RTN<
860871
let enabled_saddr = 1;
861872
let FPAtomic = data_vt.isFP;
862873
}
874+
875+
defvar vdst_op_agpr = getEquivalentAGPROperand<vdst_op>.ret;
876+
defvar data_op_agpr = getEquivalentAGPROperand<data_op>.ret;
877+
878+
let SubtargetPredicate = isGFX90APlus in {
879+
def _RTN_agpr : FLAT_AtomicRet_Pseudo <opName,
880+
(outs vdst_op_agpr:$vdst),
881+
(ins VReg_64:$vaddr, data_op_agpr:$vdata, flat_offset:$offset, CPol_GLC1:$cpol),
882+
" $vdst, $vaddr, $vdata, off$offset$cpol">,
883+
GlobalSaddrTable<0, opName#"_rtn_agpr"> {
884+
let has_saddr = 1;
885+
let FPAtomic = data_vt.isFP;
886+
}
887+
888+
def _SADDR_RTN_agpr : FLAT_AtomicRet_Pseudo <opName,
889+
(outs vdst_op_agpr:$vdst),
890+
(ins VGPR_32:$vaddr, data_op_agpr:$vdata, SReg_64_XEXEC_XNULL:$saddr, flat_offset:$offset, CPol_GLC1:$cpol),
891+
" $vdst, $vaddr, $vdata, $saddr$offset$cpol">,
892+
GlobalSaddrTable<1, opName#"_rtn_agpr"> {
893+
let has_saddr = 1;
894+
let enabled_saddr = 1;
895+
let FPAtomic = data_vt.isFP;
896+
}
897+
}
863898
}
864899
}
865900

@@ -2637,8 +2672,10 @@ multiclass FLAT_Global_Real_Atomics_vi<bits<7> op,
26372672
FLAT_Real_AllAddr_vi<op, has_sccb> {
26382673
def _RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN"), has_sccb>;
26392674
def _SADDR_RTN_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN"), has_sccb>;
2640-
}
26412675

2676+
def _RTN_agpr_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_RTN_agpr"), has_sccb>;
2677+
def _SADDR_RTN_agpr_vi : FLAT_Real_vi <op, !cast<FLAT_Pseudo>(NAME#"_SADDR_RTN_agpr"), has_sccb>;
2678+
}
26422679

26432680
defm FLAT_ATOMIC_SWAP : FLAT_Real_Atomics_vi <0x40>;
26442681
defm FLAT_ATOMIC_CMPSWAP : FLAT_Real_Atomics_vi <0x41>;

llvm/lib/Target/AMDGPU/SIRegisterInfo.td

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,3 +1492,27 @@ class OperandIsVGPR<DAGOperand Op> {
14921492
defvar reg_class = getRegClassFromOp<Op>.ret;
14931493
bit ret = !and(reg_class.HasVGPR, !not(reg_class.HasAGPR));
14941494
}
1495+
1496+
class VDstOperandIsAV<dag OperandList> {
1497+
bit ret = OperandIsAV<!getdagarg<DAGOperand>(OperandList, "vdst")>.ret;
1498+
}
1499+
1500+
class VDstOperandIsAGPR<dag OperandList> {
1501+
bit ret = OperandIsAGPR<!getdagarg<DAGOperand>(OperandList, "vdst")>.ret;
1502+
}
1503+
1504+
class Data0OperandIsAV<dag OperandList> {
1505+
bit ret = OperandIsAV<!getdagarg<DAGOperand>(OperandList, "data0")>.ret;
1506+
}
1507+
1508+
class Data0OperandIsAGPR<dag OperandList> {
1509+
bit ret = OperandIsAGPR<!getdagarg<DAGOperand>(OperandList, "data0")>.ret;
1510+
}
1511+
1512+
class VDataOperandIsAV<dag OperandList> {
1513+
bit ret = OperandIsAV<!getdagarg<DAGOperand>(OperandList, "vdata")>.ret;
1514+
}
1515+
1516+
class VDataOperandIsAGPR<dag OperandList> {
1517+
bit ret = OperandIsAGPR<!getdagarg<DAGOperand>(OperandList, "vdata")>.ret;
1518+
}

0 commit comments

Comments
 (0)