Skip to content

Commit bfa9ce1

Browse files
committed
[PowerPC] Improve handling of some BUILD_VECTOR nodes
An analysis of real world code turned up a number of patterns with BUILD_VECTOR of nodes resulting from operations on extracted vector elements for which we produce poor code. This addresses those cases. No attempt is made for completeness as that would entail a large amount of work for something that there is no evidence of in real code. Differential revision: https://reviews.llvm.org/D72660
1 parent c5c4109 commit bfa9ce1

File tree

5 files changed

+806
-550
lines changed

5 files changed

+806
-550
lines changed

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,21 @@ def DWToSPExtractConv {
13411341
dag BVS = (v4f32 (build_vector El0SS1, El1SS1, El0SS2, El1SS2));
13421342
}
13431343

1344+
def WToDPExtractConv {
1345+
dag El0S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 0))));
1346+
dag El1S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 1))));
1347+
dag El2S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 2))));
1348+
dag El3S = (f64 (PPCfcfid (PPCmtvsra (extractelt v4i32:$A, 3))));
1349+
dag El0U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 0))));
1350+
dag El1U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 1))));
1351+
dag El2U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 2))));
1352+
dag El3U = (f64 (PPCfcfidu (PPCmtvsrz (extractelt v4i32:$A, 3))));
1353+
dag BV02S = (v2f64 (build_vector El0S, El2S));
1354+
dag BV13S = (v2f64 (build_vector El1S, El3S));
1355+
dag BV02U = (v2f64 (build_vector El0U, El2U));
1356+
dag BV13U = (v2f64 (build_vector El1U, El3U));
1357+
}
1358+
13441359
// The following VSX instructions were introduced in Power ISA 2.07
13451360
/* FIXME: if the operands are v2i64, these patterns will not match.
13461361
we should define new patterns or otherwise match the same patterns
@@ -4171,6 +4186,41 @@ let AddedComplexity = 400 in {
41714186
def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
41724187
ExtDbl.B0U, ExtDbl.B1U)),
41734188
(v4i32 (VMRGEW MrgWords.CVA0B0U, MrgWords.CVA1B1U))>;
4189+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4190+
(f64 (fpextend (extractelt v4f32:$A, 1))))),
4191+
(v2f64 (XVCVSPDP (XXMRGHW $A, $A)))>;
4192+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4193+
(f64 (fpextend (extractelt v4f32:$A, 0))))),
4194+
(v2f64 (XXPERMDI (XVCVSPDP (XXMRGHW $A, $A)),
4195+
(XVCVSPDP (XXMRGHW $A, $A)), 2))>;
4196+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4197+
(f64 (fpextend (extractelt v4f32:$A, 2))))),
4198+
(v2f64 (XVCVSPDP $A))>;
4199+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4200+
(f64 (fpextend (extractelt v4f32:$A, 3))))),
4201+
(v2f64 (XVCVSPDP (XXSLDWI $A, $A, 3)))>;
4202+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 2))),
4203+
(f64 (fpextend (extractelt v4f32:$A, 3))))),
4204+
(v2f64 (XVCVSPDP (XXMRGLW $A, $A)))>;
4205+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4206+
(f64 (fpextend (extractelt v4f32:$A, 2))))),
4207+
(v2f64 (XXPERMDI (XVCVSPDP (XXMRGLW $A, $A)),
4208+
(XVCVSPDP (XXMRGLW $A, $A)), 2))>;
4209+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4210+
(f64 (fpextend (extractelt v4f32:$B, 0))))),
4211+
(v2f64 (XVCVSPDP (XXPERMDI $A, $B, 0)))>;
4212+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4213+
(f64 (fpextend (extractelt v4f32:$B, 3))))),
4214+
(v2f64 (XVCVSPDP (XXSLDWI (XXPERMDI $A, $B, 3),
4215+
(XXPERMDI $A, $B, 3), 1)))>;
4216+
def : Pat<WToDPExtractConv.BV02S,
4217+
(v2f64 (XVCVSXWDP $A))>;
4218+
def : Pat<WToDPExtractConv.BV13S,
4219+
(v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 3)))>;
4220+
def : Pat<WToDPExtractConv.BV02U,
4221+
(v2f64 (XVCVUXWDP $A))>;
4222+
def : Pat<WToDPExtractConv.BV13U,
4223+
(v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 3)))>;
41744224
}
41754225

41764226
let Predicates = [IsLittleEndian, HasP8Vector] in {
@@ -4249,6 +4299,41 @@ let AddedComplexity = 400 in {
42494299
def : Pat<(v4i32 (build_vector ExtDbl.A0U, ExtDbl.A1U,
42504300
ExtDbl.B0U, ExtDbl.B1U)),
42514301
(v4i32 (VMRGEW MrgWords.CVB1A1U, MrgWords.CVB0A0U))>;
4302+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4303+
(f64 (fpextend (extractelt v4f32:$A, 1))))),
4304+
(v2f64 (XVCVSPDP (XXMRGLW $A, $A)))>;
4305+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4306+
(f64 (fpextend (extractelt v4f32:$A, 0))))),
4307+
(v2f64 (XXPERMDI (XVCVSPDP (XXMRGLW $A, $A)),
4308+
(XVCVSPDP (XXMRGLW $A, $A)), 2))>;
4309+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4310+
(f64 (fpextend (extractelt v4f32:$A, 2))))),
4311+
(v2f64 (XVCVSPDP (XXSLDWI $A, $A, 1)))>;
4312+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 1))),
4313+
(f64 (fpextend (extractelt v4f32:$A, 3))))),
4314+
(v2f64 (XVCVSPDP $A))>;
4315+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 2))),
4316+
(f64 (fpextend (extractelt v4f32:$A, 3))))),
4317+
(v2f64 (XVCVSPDP (XXMRGHW $A, $A)))>;
4318+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4319+
(f64 (fpextend (extractelt v4f32:$A, 2))))),
4320+
(v2f64 (XXPERMDI (XVCVSPDP (XXMRGHW $A, $A)),
4321+
(XVCVSPDP (XXMRGHW $A, $A)), 2))>;
4322+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 0))),
4323+
(f64 (fpextend (extractelt v4f32:$B, 0))))),
4324+
(v2f64 (XVCVSPDP (XXSLDWI (XXPERMDI $B, $A, 3),
4325+
(XXPERMDI $B, $A, 3), 1)))>;
4326+
def : Pat<(v2f64 (build_vector (f64 (fpextend (extractelt v4f32:$A, 3))),
4327+
(f64 (fpextend (extractelt v4f32:$B, 3))))),
4328+
(v2f64 (XVCVSPDP (XXPERMDI $B, $A, 0)))>;
4329+
def : Pat<WToDPExtractConv.BV02S,
4330+
(v2f64 (XVCVSXWDP (XXSLDWI $A, $A, 1)))>;
4331+
def : Pat<WToDPExtractConv.BV13S,
4332+
(v2f64 (XVCVSXWDP $A))>;
4333+
def : Pat<WToDPExtractConv.BV02U,
4334+
(v2f64 (XVCVUXWDP (XXSLDWI $A, $A, 1)))>;
4335+
def : Pat<WToDPExtractConv.BV13U,
4336+
(v2f64 (XVCVUXWDP $A))>;
42524337
}
42534338

42544339
let Predicates = [HasDirectMove] in {

0 commit comments

Comments
 (0)