Skip to content

Commit 711a17a

Browse files
committed
AMDGPU/GlobalISel: Select exp with patterns
This does produce slightly different code. Now a unique IMPLICIT_DEF is emitted for each of the implicit_def operands, rather than reusing the same one.
1 parent eef92f2 commit 711a17a

File tree

2 files changed

+7
-55
lines changed

2 files changed

+7
-55
lines changed

llvm/lib/Target/AMDGPU/AMDGPUInstructionSelector.cpp

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -779,24 +779,6 @@ bool AMDGPUInstructionSelector::selectG_ICMP(MachineInstr &I) const {
779779
return Ret;
780780
}
781781

782-
static MachineInstr *
783-
buildEXP(const TargetInstrInfo &TII, MachineInstr *Insert, unsigned Tgt,
784-
unsigned Reg0, unsigned Reg1, unsigned Reg2, unsigned Reg3,
785-
unsigned VM, bool Compr, unsigned Enabled, bool Done) {
786-
const DebugLoc &DL = Insert->getDebugLoc();
787-
MachineBasicBlock &BB = *Insert->getParent();
788-
unsigned Opcode = Done ? AMDGPU::EXP_DONE : AMDGPU::EXP;
789-
return BuildMI(BB, Insert, DL, TII.get(Opcode))
790-
.addImm(Tgt)
791-
.addReg(Reg0)
792-
.addReg(Reg1)
793-
.addReg(Reg2)
794-
.addReg(Reg3)
795-
.addImm(VM)
796-
.addImm(Compr)
797-
.addImm(Enabled);
798-
}
799-
800782
static bool isZero(Register Reg, MachineRegisterInfo &MRI) {
801783
int64_t C;
802784
if (mi_match(Reg, MRI, m_ICst(C)) && C == 0)
@@ -1111,38 +1093,6 @@ bool AMDGPUInstructionSelector::selectG_INTRINSIC_W_SIDE_EFFECTS(
11111093
MachineBasicBlock *BB = I.getParent();
11121094
unsigned IntrinsicID = I.getIntrinsicID();
11131095
switch (IntrinsicID) {
1114-
case Intrinsic::amdgcn_exp: {
1115-
int64_t Tgt = I.getOperand(1).getImm();
1116-
int64_t Enabled = I.getOperand(2).getImm();
1117-
int64_t Done = I.getOperand(7).getImm();
1118-
int64_t VM = I.getOperand(8).getImm();
1119-
1120-
MachineInstr *Exp = buildEXP(TII, &I, Tgt, I.getOperand(3).getReg(),
1121-
I.getOperand(4).getReg(),
1122-
I.getOperand(5).getReg(),
1123-
I.getOperand(6).getReg(),
1124-
VM, false, Enabled, Done);
1125-
1126-
I.eraseFromParent();
1127-
return constrainSelectedInstRegOperands(*Exp, TII, TRI, RBI);
1128-
}
1129-
case Intrinsic::amdgcn_exp_compr: {
1130-
const DebugLoc &DL = I.getDebugLoc();
1131-
int64_t Tgt = I.getOperand(1).getImm();
1132-
int64_t Enabled = I.getOperand(2).getImm();
1133-
Register Reg0 = I.getOperand(3).getReg();
1134-
Register Reg1 = I.getOperand(4).getReg();
1135-
Register Undef = MRI->createVirtualRegister(&AMDGPU::VGPR_32RegClass);
1136-
int64_t Done = I.getOperand(5).getImm();
1137-
int64_t VM = I.getOperand(6).getImm();
1138-
1139-
BuildMI(*BB, &I, DL, TII.get(AMDGPU::IMPLICIT_DEF), Undef);
1140-
MachineInstr *Exp = buildEXP(TII, &I, Tgt, Reg0, Reg1, Undef, Undef, VM,
1141-
true, Enabled, Done);
1142-
1143-
I.eraseFromParent();
1144-
return constrainSelectedInstRegOperands(*Exp, TII, TRI, RBI);
1145-
}
11461096
case Intrinsic::amdgcn_end_cf: {
11471097
// FIXME: Manually selecting to avoid dealiing with the SReg_1 trick
11481098
// SelectionDAG uses for wave32 vs wave64.

llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-amdgcn.exp.mir

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@ body: |
1515
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.exp),1, 15, %0:vgpr(s32), %0:vgpr(s32), %0:vgpr(s32), %0:vgpr(s32), 0, 0
1616
1717
; CHECK: EXP_DONE 1, %0, %0, %0, %0, 0, 0, 15, implicit $exec
18-
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.exp), 1, 15, %0:vgpr(s32), %0:vgpr(s32), %0:vgpr(s32), %0:vgpr(s32), 1, 0
18+
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.exp), 1, 15, %0:vgpr(s32), %0:vgpr(s32), %0:vgpr(s32), %0:vgpr(s32), -1, 0
1919
2020
%5:vgpr(<2 x s16>) = G_BITCAST %0(s32)
2121
2222
; CHECK: [[UNDEF0:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
23-
; CHECK: EXP 1, %0, %0, [[UNDEF0]], [[UNDEF0]], 0, 1, 15, implicit $exec
23+
; CHECK: [[UNDEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
24+
; CHECK: EXP 1, %0, %0, [[UNDEF1]], [[UNDEF0]], 0, 1, 15, implicit $exec
2425
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.exp.compr), 1, 15, %5:vgpr(<2 x s16>), %5:vgpr(<2 x s16>), 0, 0
2526
26-
; CHECK: [[UNDEF1:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
27-
; CHECK: EXP_DONE 1, %0, %0, [[UNDEF1]], [[UNDEF1]], 0, 1, 15, implicit $exec
28-
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.exp.compr), 1, 15, %5:vgpr(<2 x s16>), %5:vgpr(<2 x s16>), 1, 0
27+
; CHECK: [[UNDEF2:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
28+
; CHECK: [[UNDEF3:%[0-9]+]]:vgpr_32 = IMPLICIT_DEF
29+
; CHECK: EXP_DONE 1, %0, %0, [[UNDEF3]], [[UNDEF2]], 0, 1, 15, implicit $exec
30+
G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.exp.compr), 1, 15, %5:vgpr(<2 x s16>), %5:vgpr(<2 x s16>), -1, 0
2931

0 commit comments

Comments
 (0)