Skip to content

Commit 69e2278

Browse files
committed
[X86] Remove duplicate FMA patterns from the isel table.
This reorders some patterns to get tablegen to detect them as duplicates. Tablegen only detects duplicates when creating variants for commutable operations. It does not detect duplicates between the patterns as written in the td file. So we need to ensure all the FMA patterns in the td file are unique. This also uses null_frag to remove some other unneeded patterns. llvm-svn: 312470
1 parent af0b992 commit 69e2278

File tree

1 file changed

+16
-17
lines changed

1 file changed

+16
-17
lines changed

llvm/lib/Target/X86/X86InstrAVX512.td

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6800,19 +6800,22 @@ multiclass avx512_fma3p_132_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,
68006800
(_.VT (OpNode _.RC:$src1, _.RC:$src3, _.RC:$src2)), 1, 1, vselect, 1>,
68016801
AVX512FMA3Base;
68026802

6803+
// Pattern is 312 order so that the load is in a different place from the
6804+
// 213 and 231 patterns this helps tablegen's duplicate pattern detection.
68036805
defm m: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst),
68046806
(ins _.RC:$src2, _.MemOp:$src3),
68056807
OpcodeStr, "$src3, $src2", "$src2, $src3",
6806-
(_.VT (OpNode _.RC:$src1, (_.LdFrag addr:$src3), _.RC:$src2)), 1, 0>,
6808+
(_.VT (OpNode (_.LdFrag addr:$src3), _.RC:$src1, _.RC:$src2)), 1, 0>,
68076809
AVX512FMA3Base;
68086810

6811+
// Pattern is 312 order so that the load is in a different place from the
6812+
// 213 and 231 patterns this helps tablegen's duplicate pattern detection.
68096813
defm mb: AVX512_maskable_3src<opc, MRMSrcMem, _, (outs _.RC:$dst),
68106814
(ins _.RC:$src2, _.ScalarMemOp:$src3),
68116815
OpcodeStr, "${src3}"##_.BroadcastStr##", $src2",
68126816
"$src2, ${src3}"##_.BroadcastStr,
6813-
(_.VT (OpNode _.RC:$src1,
6814-
(_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))),
6815-
_.RC:$src2)), 1, 0>, AVX512FMA3Base, EVEX_B;
6817+
(_.VT (OpNode (_.VT (X86VBroadcast(_.ScalarLdFrag addr:$src3))),
6818+
_.RC:$src1, _.RC:$src2)), 1, 0>, AVX512FMA3Base, EVEX_B;
68166819
}
68176820
}
68186821

@@ -6861,22 +6864,20 @@ defm VFNMSUB132 : avx512_fma3p_132_f<0x9E, "vfnmsub132", X86Fnmsub, X86FnmsubR
68616864
// Scalar FMA
68626865
multiclass avx512_fma3s_common<bits<8> opc, string OpcodeStr, X86VectorVTInfo _,
68636866
dag RHS_VEC_r, dag RHS_VEC_m, dag RHS_VEC_rb,
6864-
dag RHS_r, dag RHS_m, bit MaskOnlyReg,
6865-
bit MaskOnlyRegInt> {
6867+
dag RHS_r, dag RHS_m, bit MaskOnlyReg> {
68666868
let Constraints = "$src1 = $dst", hasSideEffects = 0 in {
68676869
defm r_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),
68686870
(ins _.RC:$src2, _.RC:$src3), OpcodeStr,
6869-
"$src3, $src2", "$src2, $src3", RHS_VEC_r, 1, 1, MaskOnlyRegInt>,
6870-
AVX512FMA3Base;
6871+
"$src3, $src2", "$src2, $src3", RHS_VEC_r, 1, 1>, AVX512FMA3Base;
68716872

68726873
defm m_Int: AVX512_maskable_3src_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst),
68736874
(ins _.RC:$src2, _.IntScalarMemOp:$src3), OpcodeStr,
68746875
"$src3, $src2", "$src2, $src3", RHS_VEC_m, 1, 1>, AVX512FMA3Base;
68756876

68766877
defm rb_Int: AVX512_maskable_3src_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),
68776878
(ins _.RC:$src2, _.RC:$src3, AVX512RC:$rc),
6878-
OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb, 1, 1,
6879-
MaskOnlyRegInt>, AVX512FMA3Base, EVEX_B, EVEX_RC;
6879+
OpcodeStr, "$rc, $src3, $src2", "$src2, $src3, $rc", RHS_VEC_rb, 1, 1>,
6880+
AVX512FMA3Base, EVEX_B, EVEX_RC;
68806881

68816882
let isCodeGenOnly = 1, isCommutable = 1 in {
68826883
def r : AVX512FMA3<opc, MRMSrcReg, (outs _.FRC:$dst),
@@ -6909,7 +6910,7 @@ multiclass avx512_fma3s_all<bits<8> opc213, bits<8> opc231, bits<8> opc132,
69096910
(set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src1,
69106911
_.FRC:$src3))),
69116912
(set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src1,
6912-
(_.ScalarLdFrag addr:$src3)))), 0, 0>;
6913+
(_.ScalarLdFrag addr:$src3)))), 0>;
69136914

69146915
defm NAME#231#SUFF#Z: avx512_fma3s_common<opc231, OpcodeStr#"231"#_.Suffix, _,
69156916
(_.VT (OpNodeRnds3 _.RC:$src2, _.RC:$src3, _.RC:$src1,
@@ -6921,19 +6922,17 @@ multiclass avx512_fma3s_all<bits<8> opc213, bits<8> opc231, bits<8> opc132,
69216922
(set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2, _.FRC:$src3,
69226923
_.FRC:$src1))),
69236924
(set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src2,
6924-
(_.ScalarLdFrag addr:$src3), _.FRC:$src1))), 1, 0>;
6925+
(_.ScalarLdFrag addr:$src3), _.FRC:$src1))), 1>;
69256926

69266927
defm NAME#132#SUFF#Z: avx512_fma3s_common<opc132, OpcodeStr#"132"#_.Suffix, _,
6927-
(_.VT (OpNodeRnds1 _.RC:$src1, _.RC:$src3, _.RC:$src2,
6928-
(i32 FROUND_CURRENT))),
6928+
(null_frag),
69296929
(_.VT (OpNodeRnds1 _.RC:$src1, _.ScalarIntMemCPat:$src3,
69306930
_.RC:$src2, (i32 FROUND_CURRENT))),
6931-
(_.VT (OpNodeRnds1 _.RC:$src1, _.RC:$src3, _.RC:$src2,
6932-
(i32 imm:$rc))),
6931+
(null_frag),
69336932
(set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src1, _.FRC:$src3,
69346933
_.FRC:$src2))),
69356934
(set _.FRC:$dst, (_.EltVT (OpNode _.FRC:$src1,
6936-
(_.ScalarLdFrag addr:$src3), _.FRC:$src2))), 1, 1>;
6935+
(_.ScalarLdFrag addr:$src3), _.FRC:$src2))), 1>;
69376936
}
69386937
}
69396938

0 commit comments

Comments
 (0)