Skip to content

Commit

Permalink
AMDGPU/GlobalISel: Start matching s_lshlN_add_u32 instructions
Browse files Browse the repository at this point in the history
Use a hack to only enable this for GlobalISel.

Technically this also works with SelectionDAG, but the divergence
selection isn't reliable enough and a few cases fail, but I have no
desire to spend time writing the manual expansion code for it. The DAG
actually does a better job since it catches using v_add_lshl_u32 in
the mixed SGPR/VGPR cases.
  • Loading branch information
arsenm committed Mar 9, 2020
1 parent e4dfc9f commit 209094e
Show file tree
Hide file tree
Showing 3 changed files with 432 additions and 4 deletions.
10 changes: 10 additions & 0 deletions llvm/lib/Target/AMDGPU/SIInstrInfo.td
Expand Up @@ -630,6 +630,16 @@ def add_ctpop : PatFrag <
(add (ctpop $src0), $src1)
>;

foreach I = 1-4 in {
def shl#I#_add : PatFrag <
(ops node:$src0, node:$src1),
(add (shl_oneuse $src0, (i32 I)), $src1)> {
// FIXME: Poor substitute for disabling pattern in SelectionDAG
let PredicateCode = [{return false;}];
let GISelPredicateCode = [{return true;}];
}
}

multiclass SIAtomicM0Glue2 <string op_name, bit is_amdgpu = 0,
SDTypeProfile tc = SDTAtomic2,
bit IsInt = 1> {
Expand Down
16 changes: 12 additions & 4 deletions llvm/lib/Target/AMDGPU/SOPInstructions.td
Expand Up @@ -613,10 +613,18 @@ let SubtargetPredicate = isGFX9Plus in {
def S_PACK_HH_B32_B16 : SOP2_32<"s_pack_hh_b32_b16">;

let Defs = [SCC] in {
def S_LSHL1_ADD_U32 : SOP2_32<"s_lshl1_add_u32">;
def S_LSHL2_ADD_U32 : SOP2_32<"s_lshl2_add_u32">;
def S_LSHL3_ADD_U32 : SOP2_32<"s_lshl3_add_u32">;
def S_LSHL4_ADD_U32 : SOP2_32<"s_lshl4_add_u32">;
def S_LSHL1_ADD_U32 : SOP2_32<"s_lshl1_add_u32",
[(set i32:$sdst, (shl1_add SSrc_b32:$src0, SSrc_b32:$src1))]
>;
def S_LSHL2_ADD_U32 : SOP2_32<"s_lshl2_add_u32",
[(set i32:$sdst, (shl2_add SSrc_b32:$src0, SSrc_b32:$src1))]
>;
def S_LSHL3_ADD_U32 : SOP2_32<"s_lshl3_add_u32",
[(set i32:$sdst, (shl3_add SSrc_b32:$src0, SSrc_b32:$src1))]
>;
def S_LSHL4_ADD_U32 : SOP2_32<"s_lshl4_add_u32",
[(set i32:$sdst, (shl4_add SSrc_b32:$src0, SSrc_b32:$src1))]
>;
} // End Defs = [SCC]

let isCommutable = 1 in {
Expand Down

0 comments on commit 209094e

Please sign in to comment.