[PATCH] D56745: AMDGPU: Raise the priority of MAD24 in instruction selection.
Changpeng Fang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 15 14:46:28 PST 2019
cfang created this revision.
cfang added reviewers: nhaehnle, rampitec.
Herald added subscribers: t-tye, tpr, dstuttard, yaxunl, wdng, jvesely, kzhuravl.
We have seen performance regression when v_add3 is generated. The major reason is that the v_mad pattern
is broken when v_add3 is generated. We also see the register pressure increased. While we could not properly
estimate register pressure during instruction selection, we can give mad a higher priority.
In this work, we raise the priority for mad24 in selection and resolve the performance regression.
https://reviews.llvm.org/D56745
Files:
lib/Target/AMDGPU/AMDGPUInstructions.td
test/CodeGen/AMDGPU/add3.ll
Index: test/CodeGen/AMDGPU/add3.ll
===================================================================
--- test/CodeGen/AMDGPU/add3.ll
+++ test/CodeGen/AMDGPU/add3.ll
@@ -23,6 +23,32 @@
ret float %bc
}
+; V_MAD_U32_U24 is given higher priority.
+define amdgpu_ps float @mad_no_add3(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
+; GFX9-LABEL: mad_no_add3:
+; GFX9: ; %bb.0:
+; GFX9-NEXT: v_mad_u32_u24 v0, v0, v1, v4
+; GFX9-NEXT: v_mad_u32_u24 v0, v2, v3, v0
+; GFX9-NEXT: ; return to shader part epilog
+ %1 = shl i32 %a, 8
+ %a1 = lshr i32 %1, 8
+ %2 = shl i32 %b, 8
+ %b1 = lshr i32 %2, 8
+ %mul1 = mul i32 %a1, %b1
+
+ %3 = shl i32 %c, 8
+ %a2 = lshr i32 %3, 8
+ %4 = shl i32 %d, 8
+ %b2 = lshr i32 %4, 8
+ %mul2 = mul i32 %a2, %b2
+
+ %5 = add i32 %e, %mul1
+ %result = add i32 %mul2, %5
+
+ %bc = bitcast i32 %result to float
+ ret float %bc
+}
+
; ThreeOp instruction variant not used due to Constant Bus Limitations
; TODO: with reassociation it is possible to replace a v_add_u32_e32 with a s_add_i32
define amdgpu_ps float @add3_vgpr_b(i32 inreg %a, i32 %b, i32 inreg %c) {
Index: lib/Target/AMDGPU/AMDGPUInstructions.td
===================================================================
--- lib/Target/AMDGPU/AMDGPUInstructions.td
+++ lib/Target/AMDGPU/AMDGPUInstructions.td
@@ -842,6 +842,7 @@
[{ (void)N; return TM.Options.NoNaNsFPMath; }]
>;
+let AddedComplexity = 2 in {
class IMad24Pat<Instruction Inst, bit HasClamp = 0> : AMDGPUPat <
(add (AMDGPUmul_i24 i32:$src0, i32:$src1), i32:$src2),
!if(HasClamp, (Inst $src0, $src1, $src2, (i1 0)),
@@ -853,6 +854,7 @@
!if(HasClamp, (Inst $src0, $src1, $src2, (i1 0)),
(Inst $src0, $src1, $src2))
>;
+} // AddedComplexity.
class RcpPat<Instruction RcpInst, ValueType vt> : AMDGPUPat <
(fdiv FP_ONE, vt:$src),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D56745.181889.patch
Type: text/x-patch
Size: 1843 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190115/d02abaae/attachment.bin>
More information about the llvm-commits
mailing list