Skip to content

Commit a41a36f

Browse files
committed
[AMDGPU][SDAG] Handle ISD::PTRADD in VOP3 patterns
This patch mirrors similar patterns for ISD::ADD. The main difference is that ISD::ADD is commutative, so that a pattern definition for, e.g., (add (mul x, y), z), automatically also handles (add z, (mul x, y)). ISD::PTRADD is not commutative, so we would need to handle these cases explicitly. This patch only implements (ptradd z, (op x, y)) patterns, where the nested operation (shift or multiply) is the offset of the ptradd (i.e., the right operand), since base pointers that are the result of a shift or multiply seem less likely. For SWDEV-516125.
1 parent b1a78b2 commit a41a36f

File tree

3 files changed

+52
-67
lines changed

3 files changed

+52
-67
lines changed

llvm/lib/Target/AMDGPU/VOP3Instructions.td

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -484,12 +484,13 @@ let OtherPredicates = [isGFX10Plus, Has16BitInsts], True16Predicate = NotHasTrue
484484
defm: Ternary_i16_Pats_gfx9<mul, add, V_MAD_U16_gfx9_e64>;
485485
} // End OtherPredicates = [isGFX10Plus, Has16BitInsts], True16Predicate = NotHasTrue16BitInsts
486486

487-
class ThreeOpFragSDAG<SDPatternOperator op1, SDPatternOperator op2> : PatFrag<
487+
class ThreeOpFragSDAG<SDPatternOperator op1, SDPatternOperator op2, bit op1IsRight = 0> : PatFrag<
488488
(ops node:$x, node:$y, node:$z),
489489
// When the inner operation is used multiple times, selecting 3-op
490490
// instructions may still be beneficial -- if the other users can be
491491
// combined similarly. Let's be conservative for now.
492-
(op2 (HasOneUseBinOp<op1> node:$x, node:$y), node:$z),
492+
!if(op1IsRight, (op2 node:$z, (HasOneUseBinOp<op1> node:$x, node:$y)),
493+
(op2 (HasOneUseBinOp<op1> node:$x, node:$y), node:$z)),
493494
[{
494495
// Only use VALU ops when the result is divergent.
495496
if (!N->isDivergent())
@@ -516,7 +517,10 @@ class ThreeOpFragSDAG<SDPatternOperator op1, SDPatternOperator op2> : PatFrag<
516517
let PredicateCodeUsesOperands = 1;
517518
}
518519

519-
class ThreeOpFrag<SDPatternOperator op1, SDPatternOperator op2> : ThreeOpFragSDAG<op1, op2> {
520+
// Matches (op2 (op1 x, y), z) if op1IsRight = 0 and
521+
// matches (op2 z, (op1, x, y)) if op1IsRight = 1.
522+
class ThreeOpFrag<SDPatternOperator op1, SDPatternOperator op2,
523+
bit op1IsRight = 0> : ThreeOpFragSDAG<op1, op2, op1IsRight> {
520524
// The divergence predicate is irrelevant in GlobalISel, as we have
521525
// proper register bank checks. We just need to verify the constant
522526
// bus restriction when all the sources are considered.
@@ -806,12 +810,19 @@ def : GCNPat<
806810
(DivergentBinFrag<mul> i32:$src0, IsPow2Plus1:$src1),
807811
(V_LSHL_ADD_U32_e64 i32:$src0, (i32 (Log2_32 imm:$src1)), i32:$src0)>;
808812

809-
let SubtargetPredicate = isGFX940Plus in
813+
let SubtargetPredicate = isGFX940Plus in {
810814
def : GCNPat<
811815
(ThreeOpFrag<shl_0_to_4, add> i64:$src0, i32:$src1, i64:$src2),
812816
(V_LSHL_ADD_U64_e64 VSrc_b64:$src0, VSrc_b32:$src1, VSrc_b64:$src2)
813817
>;
814818

819+
def : GCNPat <
820+
// (ptradd z, (shl x, y)) -> ((x << y) + z)
821+
(ThreeOpFrag<shl_0_to_4, ptradd, /*op1IsRight=*/1> i64:$src0, i32:$src1, i64:$src2),
822+
(V_LSHL_ADD_U64_e64 VSrc_b64:$src0, VSrc_b32:$src1, VSrc_b64:$src2)
823+
>;
824+
} // End SubtargetPredicate = isGFX940Plus
825+
815826
def : VOPBinOpClampPat<saddsat, V_ADD_I32_e64, i32>;
816827
def : VOPBinOpClampPat<ssubsat, V_SUB_I32_e64, i32>;
817828

@@ -880,19 +891,24 @@ multiclass IMAD32_Pats <VOP3_Pseudo inst> {
880891

881892
// Handle cases where amdgpu-codegenprepare-mul24 made a mul24 instead of a normal mul.
882893
// We need to separate this because otherwise OtherPredicates would be overriden.
883-
class IMAD32_Mul24_Pat<VOP3_Pseudo inst>: GCNPat <
884-
(i64 (add (i64 (AMDGPUmul_u24 i32:$src0, i32:$src1)), i64:$src2)),
885-
(inst $src0, $src1, $src2, 0 /* clamp */)
886-
>;
894+
class IMAD32_Mul24_Pats_Impl<VOP3_Pseudo inst, SDPatternOperator AddOp, bit mulIsRight = 0> : GCNPat <
895+
!if(mulIsRight, (i64 (AddOp i64:$src2, (i64 (AMDGPUmul_u24 i32:$src0, i32:$src1)))),
896+
(i64 (AddOp (i64 (AMDGPUmul_u24 i32:$src0, i32:$src1)), i64:$src2))),
897+
(inst $src0, $src1, $src2, 0 /* clamp */)>;
898+
899+
multiclass IMAD32_Mul24_Pats<VOP3_Pseudo inst> {
900+
def : IMAD32_Mul24_Pats_Impl<inst, add>;
901+
def : IMAD32_Mul24_Pats_Impl<inst, ptradd, /*mulIsRight=*/1>;
902+
}
887903

888904
// exclude pre-GFX9 where it was slow
889905
let OtherPredicates = [HasNotMADIntraFwdBug], SubtargetPredicate = isGFX9Plus in {
890906
defm : IMAD32_Pats<V_MAD_U64_U32_e64>;
891-
def : IMAD32_Mul24_Pat<V_MAD_U64_U32_e64>;
907+
defm : IMAD32_Mul24_Pats<V_MAD_U64_U32_e64>;
892908
}
893909
let OtherPredicates = [HasMADIntraFwdBug], SubtargetPredicate = isGFX11Only in {
894910
defm : IMAD32_Pats<V_MAD_U64_U32_gfx11_e64>;
895-
def : IMAD32_Mul24_Pat<V_MAD_U64_U32_gfx11_e64>;
911+
defm : IMAD32_Mul24_Pats<V_MAD_U64_U32_gfx11_e64>;
896912
}
897913

898914
def VOP3_PERMLANE_Profile : VOP3_Profile<VOPProfile <[i32, i32, i32, i32]>, VOP3_OPSEL> {

llvm/test/CodeGen/AMDGPU/ptradd-sdag-optimizations.ll

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -266,42 +266,25 @@ define amdgpu_kernel void @fold_mad64(ptr addrspace(1) %p) {
266266

267267
; Use non-zero shift amounts in v_lshl_add_u64.
268268
define ptr @select_v_lshl_add_u64(ptr %base, i64 %voffset) {
269-
; GFX942_PTRADD-LABEL: select_v_lshl_add_u64:
270-
; GFX942_PTRADD: ; %bb.0:
271-
; GFX942_PTRADD-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
272-
; GFX942_PTRADD-NEXT: v_lshlrev_b64 v[2:3], 3, v[2:3]
273-
; GFX942_PTRADD-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, v[2:3]
274-
; GFX942_PTRADD-NEXT: s_setpc_b64 s[30:31]
275-
;
276-
; GFX942_LEGACY-LABEL: select_v_lshl_add_u64:
277-
; GFX942_LEGACY: ; %bb.0:
278-
; GFX942_LEGACY-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
279-
; GFX942_LEGACY-NEXT: v_lshl_add_u64 v[0:1], v[2:3], 3, v[0:1]
280-
; GFX942_LEGACY-NEXT: s_setpc_b64 s[30:31]
269+
; GFX942-LABEL: select_v_lshl_add_u64:
270+
; GFX942: ; %bb.0:
271+
; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
272+
; GFX942-NEXT: v_lshl_add_u64 v[0:1], v[2:3], 3, v[0:1]
273+
; GFX942-NEXT: s_setpc_b64 s[30:31]
281274
%gep = getelementptr inbounds i64, ptr %base, i64 %voffset
282275
ret ptr %gep
283276
}
284277

285278
; Fold mul and add into v_mad, even if amdgpu-codegenprepare-mul24 turned the
286279
; mul into a mul24.
287280
define ptr @fold_mul24_into_mad(ptr %base, i64 %a, i64 %b) {
288-
; GFX942_PTRADD-LABEL: fold_mul24_into_mad:
289-
; GFX942_PTRADD: ; %bb.0:
290-
; GFX942_PTRADD-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
291-
; GFX942_PTRADD-NEXT: v_and_b32_e32 v2, 0xfffff, v2
292-
; GFX942_PTRADD-NEXT: v_and_b32_e32 v4, 0xfffff, v4
293-
; GFX942_PTRADD-NEXT: v_mul_hi_u32_u24_e32 v3, v2, v4
294-
; GFX942_PTRADD-NEXT: v_mul_u32_u24_e32 v2, v2, v4
295-
; GFX942_PTRADD-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, v[2:3]
296-
; GFX942_PTRADD-NEXT: s_setpc_b64 s[30:31]
297-
;
298-
; GFX942_LEGACY-LABEL: fold_mul24_into_mad:
299-
; GFX942_LEGACY: ; %bb.0:
300-
; GFX942_LEGACY-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
301-
; GFX942_LEGACY-NEXT: v_and_b32_e32 v2, 0xfffff, v2
302-
; GFX942_LEGACY-NEXT: v_and_b32_e32 v3, 0xfffff, v4
303-
; GFX942_LEGACY-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, v3, v[0:1]
304-
; GFX942_LEGACY-NEXT: s_setpc_b64 s[30:31]
281+
; GFX942-LABEL: fold_mul24_into_mad:
282+
; GFX942: ; %bb.0:
283+
; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
284+
; GFX942-NEXT: v_and_b32_e32 v2, 0xfffff, v2
285+
; GFX942-NEXT: v_and_b32_e32 v3, 0xfffff, v4
286+
; GFX942-NEXT: v_mad_u64_u32 v[0:1], s[0:1], v2, v3, v[0:1]
287+
; GFX942-NEXT: s_setpc_b64 s[30:31]
305288
%a_masked = and i64 %a, u0xfffff
306289
%b_masked = and i64 %b, u0xfffff
307290
%mul = mul i64 %a_masked, %b_masked

llvm/test/CodeGen/AMDGPU/ptradd-sdag.ll

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,12 @@ define ptr @gep_as0(ptr %p, i64 %offset) {
2525
; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
2626
; GFX8-NEXT: s_setpc_b64 s[30:31]
2727
;
28-
; GFX942_PTRADD-LABEL: gep_as0:
29-
; GFX942_PTRADD: ; %bb.0: ; %entry
30-
; GFX942_PTRADD-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
31-
; GFX942_PTRADD-NEXT: v_lshlrev_b64 v[2:3], 2, v[2:3]
32-
; GFX942_PTRADD-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, v[2:3]
33-
; GFX942_PTRADD-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, 5
34-
; GFX942_PTRADD-NEXT: s_setpc_b64 s[30:31]
35-
;
36-
; GFX942_LEGACY-LABEL: gep_as0:
37-
; GFX942_LEGACY: ; %bb.0: ; %entry
38-
; GFX942_LEGACY-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
39-
; GFX942_LEGACY-NEXT: v_lshl_add_u64 v[0:1], v[2:3], 2, v[0:1]
40-
; GFX942_LEGACY-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, 5
41-
; GFX942_LEGACY-NEXT: s_setpc_b64 s[30:31]
28+
; GFX942-LABEL: gep_as0:
29+
; GFX942: ; %bb.0: ; %entry
30+
; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
31+
; GFX942-NEXT: v_lshl_add_u64 v[0:1], v[2:3], 2, v[0:1]
32+
; GFX942-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, 5
33+
; GFX942-NEXT: s_setpc_b64 s[30:31]
4234
;
4335
; GFX10-LABEL: gep_as0:
4436
; GFX10: ; %bb.0: ; %entry
@@ -187,20 +179,12 @@ define ptr @multi_gep_as0(ptr %p, i64 %offset) {
187179
; GFX8-NEXT: v_addc_u32_e32 v1, vcc, 0, v1, vcc
188180
; GFX8-NEXT: s_setpc_b64 s[30:31]
189181
;
190-
; GFX942_PTRADD-LABEL: multi_gep_as0:
191-
; GFX942_PTRADD: ; %bb.0: ; %entry
192-
; GFX942_PTRADD-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
193-
; GFX942_PTRADD-NEXT: v_lshlrev_b64 v[2:3], 2, v[2:3]
194-
; GFX942_PTRADD-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, v[2:3]
195-
; GFX942_PTRADD-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, 5
196-
; GFX942_PTRADD-NEXT: s_setpc_b64 s[30:31]
197-
;
198-
; GFX942_LEGACY-LABEL: multi_gep_as0:
199-
; GFX942_LEGACY: ; %bb.0: ; %entry
200-
; GFX942_LEGACY-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
201-
; GFX942_LEGACY-NEXT: v_lshl_add_u64 v[0:1], v[2:3], 2, v[0:1]
202-
; GFX942_LEGACY-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, 5
203-
; GFX942_LEGACY-NEXT: s_setpc_b64 s[30:31]
182+
; GFX942-LABEL: multi_gep_as0:
183+
; GFX942: ; %bb.0: ; %entry
184+
; GFX942-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
185+
; GFX942-NEXT: v_lshl_add_u64 v[0:1], v[2:3], 2, v[0:1]
186+
; GFX942-NEXT: v_lshl_add_u64 v[0:1], v[0:1], 0, 5
187+
; GFX942-NEXT: s_setpc_b64 s[30:31]
204188
;
205189
; GFX10-LABEL: multi_gep_as0:
206190
; GFX10: ; %bb.0: ; %entry
@@ -535,3 +519,5 @@ entry:
535519
; GFX12_PTRADD: {{.*}}
536520
; GFX8_LEGACY: {{.*}}
537521
; GFX8_PTRADD: {{.*}}
522+
; GFX942_LEGACY: {{.*}}
523+
; GFX942_PTRADD: {{.*}}

0 commit comments

Comments
 (0)