14fb2116eSMatt Arsenault //===- GISelUtilsTest.cpp -------------------------------------------------===//
24fb2116eSMatt Arsenault //
34fb2116eSMatt Arsenault // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44fb2116eSMatt Arsenault // See https://llvm.org/LICENSE.txt for license information.
54fb2116eSMatt Arsenault // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64fb2116eSMatt Arsenault //
74fb2116eSMatt Arsenault //===----------------------------------------------------------------------===//
84fb2116eSMatt Arsenault 
94fb2116eSMatt Arsenault #include "llvm/CodeGen/GlobalISel/Utils.h"
104fb2116eSMatt Arsenault #include "gtest/gtest.h"
114fb2116eSMatt Arsenault 
124fb2116eSMatt Arsenault using namespace llvm;
134fb2116eSMatt Arsenault 
144fb2116eSMatt Arsenault namespace {
154fb2116eSMatt Arsenault static const LLT S1 = LLT::scalar(1);
1612d5bec8SMatt Arsenault static const LLT S8 = LLT::scalar(8);
174fb2116eSMatt Arsenault static const LLT S16 = LLT::scalar(16);
184fb2116eSMatt Arsenault static const LLT S32 = LLT::scalar(32);
194fb2116eSMatt Arsenault static const LLT S64 = LLT::scalar(64);
204fb2116eSMatt Arsenault static const LLT P0 = LLT::pointer(0, 64);
214fb2116eSMatt Arsenault static const LLT P1 = LLT::pointer(1, 32);
224fb2116eSMatt Arsenault 
23*d5e14ba8SSander de Smalen static const LLT V2S8 = LLT::fixed_vector(2, 8);
24*d5e14ba8SSander de Smalen static const LLT V4S8 = LLT::fixed_vector(4, 8);
25*d5e14ba8SSander de Smalen static const LLT V8S8 = LLT::fixed_vector(8, 8);
2612d5bec8SMatt Arsenault 
27*d5e14ba8SSander de Smalen static const LLT V2S16 = LLT::fixed_vector(2, 16);
28*d5e14ba8SSander de Smalen static const LLT V3S16 = LLT::fixed_vector(3, 16);
29*d5e14ba8SSander de Smalen static const LLT V4S16 = LLT::fixed_vector(4, 16);
304fb2116eSMatt Arsenault 
31*d5e14ba8SSander de Smalen static const LLT V2S32 = LLT::fixed_vector(2, 32);
32*d5e14ba8SSander de Smalen static const LLT V3S32 = LLT::fixed_vector(3, 32);
33*d5e14ba8SSander de Smalen static const LLT V4S32 = LLT::fixed_vector(4, 32);
34*d5e14ba8SSander de Smalen static const LLT V6S32 = LLT::fixed_vector(6, 32);
354fb2116eSMatt Arsenault 
36*d5e14ba8SSander de Smalen static const LLT V2S64 = LLT::fixed_vector(2, 64);
37*d5e14ba8SSander de Smalen static const LLT V3S64 = LLT::fixed_vector(3, 64);
38*d5e14ba8SSander de Smalen static const LLT V4S64 = LLT::fixed_vector(4, 64);
3912d5bec8SMatt Arsenault 
40*d5e14ba8SSander de Smalen static const LLT V2P0 = LLT::fixed_vector(2, P0);
41*d5e14ba8SSander de Smalen static const LLT V3P0 = LLT::fixed_vector(3, P0);
42*d5e14ba8SSander de Smalen static const LLT V4P0 = LLT::fixed_vector(4, P0);
43*d5e14ba8SSander de Smalen static const LLT V6P0 = LLT::fixed_vector(6, P0);
444fb2116eSMatt Arsenault 
45*d5e14ba8SSander de Smalen static const LLT V2P1 = LLT::fixed_vector(2, P1);
46*d5e14ba8SSander de Smalen static const LLT V4P1 = LLT::fixed_vector(4, P1);
4712d5bec8SMatt Arsenault 
TEST(GISelUtilsTest,getGCDType)484fb2116eSMatt Arsenault TEST(GISelUtilsTest, getGCDType) {
494fb2116eSMatt Arsenault   EXPECT_EQ(S1, getGCDType(S1, S1));
504fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(S32, S32));
514fb2116eSMatt Arsenault   EXPECT_EQ(S1, getGCDType(S1, S32));
524fb2116eSMatt Arsenault   EXPECT_EQ(S1, getGCDType(S32, S1));
534fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(S16, S32));
544fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(S32, S16));
554fb2116eSMatt Arsenault 
564fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getGCDType(V2S32, V2S32));
574fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(V3S32, V2S32));
584fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(V2S32, V3S32));
594fb2116eSMatt Arsenault 
604fb2116eSMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V4S16, V2S16));
614fb2116eSMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V2S16, V4S16));
624fb2116eSMatt Arsenault 
634fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getGCDType(V4S32, V2S32));
644fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getGCDType(V2S32, V4S32));
654fb2116eSMatt Arsenault 
664fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(P0, S16));
674fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(S16, P0));
684fb2116eSMatt Arsenault 
694fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(P0, S32));
704fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(S32, P0));
714fb2116eSMatt Arsenault 
7212d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(P0, S64));
734fb2116eSMatt Arsenault   EXPECT_EQ(S64, getGCDType(S64, P0));
744fb2116eSMatt Arsenault 
754fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(P0, P1));
764fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(P1, P0));
774fb2116eSMatt Arsenault 
784fb2116eSMatt Arsenault   EXPECT_EQ(P0, getGCDType(V3P0, V2P0));
794fb2116eSMatt Arsenault   EXPECT_EQ(P0, getGCDType(V2P0, V3P0));
8012d5bec8SMatt Arsenault 
8112d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(P0, V2P0));
8212d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(V2P0, P0));
8312d5bec8SMatt Arsenault 
8412d5bec8SMatt Arsenault 
8512d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V2P0, V2P0));
8612d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(V3P0, V2P0));
8712d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(V2P0, V3P0));
8812d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V4P0, V2P0));
8912d5bec8SMatt Arsenault 
9012d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V2P0, V4P1));
9112d5bec8SMatt Arsenault   EXPECT_EQ(V4P1, getGCDType(V4P1, V2P0));
9212d5bec8SMatt Arsenault 
9312d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V4P0, V4P1));
9412d5bec8SMatt Arsenault   EXPECT_EQ(V4P1, getGCDType(V4P1, V4P0));
9512d5bec8SMatt Arsenault 
9612d5bec8SMatt Arsenault   // Elements have same size, but have different pointeriness, so prefer the
9712d5bec8SMatt Arsenault   // original element type.
9812d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V2P0, V4S64));
9912d5bec8SMatt Arsenault   EXPECT_EQ(V2S64, getGCDType(V4S64, V2P0));
10012d5bec8SMatt Arsenault 
10112d5bec8SMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V2S16, V4P1));
10212d5bec8SMatt Arsenault   EXPECT_EQ(P1, getGCDType(V4P1, V2S16));
10312d5bec8SMatt Arsenault   EXPECT_EQ(V2P1, getGCDType(V4P1, V4S16));
10412d5bec8SMatt Arsenault   EXPECT_EQ(V4S16, getGCDType(V4S16, V2P1));
10512d5bec8SMatt Arsenault 
10612d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(P0, V2S64));
10712d5bec8SMatt Arsenault   EXPECT_EQ(S64, getGCDType(V2S64, P0));
10812d5bec8SMatt Arsenault 
10912d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V2S16, V3S16));
11012d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V3S16, V2S16));
11112d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V3S16, S16));
11212d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(S16, V3S16));
11312d5bec8SMatt Arsenault 
11412d5bec8SMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V2S16, V2S32));
11512d5bec8SMatt Arsenault   EXPECT_EQ(S32, getGCDType(V2S32, V2S16));
11612d5bec8SMatt Arsenault 
11712d5bec8SMatt Arsenault   EXPECT_EQ(V4S8, getGCDType(V4S8, V2S32));
11812d5bec8SMatt Arsenault   EXPECT_EQ(S32, getGCDType(V2S32, V4S8));
11912d5bec8SMatt Arsenault 
12012d5bec8SMatt Arsenault   // Test cases where neither element type nicely divides.
121*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3),
122*d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(3, 5), LLT::fixed_vector(2, 6)));
123*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3),
124*d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(2, 6), LLT::fixed_vector(3, 5)));
12512d5bec8SMatt Arsenault 
12612d5bec8SMatt Arsenault   // Have to go smaller than a pointer element.
127*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3), getGCDType(LLT::fixed_vector(2, LLT::pointer(3, 6)),
128*d5e14ba8SSander de Smalen                                        LLT::fixed_vector(3, 5)));
129*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3),
130*d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(3, 5),
131*d5e14ba8SSander de Smalen                        LLT::fixed_vector(2, LLT::pointer(3, 6))));
13212d5bec8SMatt Arsenault 
13312d5bec8SMatt Arsenault   EXPECT_EQ(V4S8, getGCDType(V4S8, S32));
13412d5bec8SMatt Arsenault   EXPECT_EQ(S32, getGCDType(S32, V4S8));
13512d5bec8SMatt Arsenault   EXPECT_EQ(V4S8, getGCDType(V4S8, P1));
13612d5bec8SMatt Arsenault   EXPECT_EQ(P1, getGCDType(P1, V4S8));
13712d5bec8SMatt Arsenault 
13812d5bec8SMatt Arsenault   EXPECT_EQ(V2S8, getGCDType(V2S8, V4S16));
13912d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V4S16, V2S8));
14012d5bec8SMatt Arsenault 
141*d5e14ba8SSander de Smalen   EXPECT_EQ(S8, getGCDType(V2S8, LLT::fixed_vector(4, 2)));
142*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(4, 2), getGCDType(LLT::fixed_vector(4, 2), S8));
14312d5bec8SMatt Arsenault 
144*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::pointer(4, 8),
145*d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(2, LLT::pointer(4, 8)),
146*d5e14ba8SSander de Smalen                        LLT::fixed_vector(4, 2)));
14712d5bec8SMatt Arsenault 
148*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(4, 2),
149*d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(4, 2),
150*d5e14ba8SSander de Smalen                        LLT::fixed_vector(2, LLT::pointer(4, 8))));
15112d5bec8SMatt Arsenault 
152*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(4), getGCDType(LLT::fixed_vector(3, 4), S8));
153*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(4), getGCDType(S8, LLT::fixed_vector(3, 4)));
1544fb2116eSMatt Arsenault }
1554fb2116eSMatt Arsenault 
TEST(GISelUtilsTest,getLCMType)1564fb2116eSMatt Arsenault TEST(GISelUtilsTest, getLCMType) {
1574fb2116eSMatt Arsenault   EXPECT_EQ(S1, getLCMType(S1, S1));
1584fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, S1));
1594fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S1, S32));
1604fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, S32));
1614fb2116eSMatt Arsenault 
1624fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, S16));
1634fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S16, S32));
1644fb2116eSMatt Arsenault 
1654fb2116eSMatt Arsenault   EXPECT_EQ(S64, getLCMType(S64, P0));
1661ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, S64));
1674fb2116eSMatt Arsenault 
1681ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(S32, P0));
1691ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, S32));
1704fb2116eSMatt Arsenault 
1714fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, P1));
1721ef3ed0eSMatt Arsenault   EXPECT_EQ(P1, getLCMType(P1, S32));
1731ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, P0));
1741ef3ed0eSMatt Arsenault   EXPECT_EQ(P1, getLCMType(P1, P1));
1754fb2116eSMatt Arsenault 
1761ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, P1));
1771ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P1, P0));
1784fb2116eSMatt Arsenault 
1794fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V2S32));
1804fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, S32));
1814fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(S32, V2S32));
1824fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V2S32));
1834fb2116eSMatt Arsenault   EXPECT_EQ(V6S32, getLCMType(V2S32, V3S32));
1844fb2116eSMatt Arsenault   EXPECT_EQ(V6S32, getLCMType(V3S32, V2S32));
185*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S32), getLCMType(V4S32, V3S32));
186*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S32), getLCMType(V3S32, V4S32));
1874fb2116eSMatt Arsenault 
1884fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V2P0));
1894fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, P0));
1904fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(P0, V2P0));
1914fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V2P0));
1924fb2116eSMatt Arsenault   EXPECT_EQ(V6P0, getLCMType(V2P0, V3P0));
1934fb2116eSMatt Arsenault   EXPECT_EQ(V6P0, getLCMType(V3P0, V2P0));
194*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V4P0, V3P0));
195*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V3P0, V4P0));
1964fb2116eSMatt Arsenault 
197*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S64), getLCMType(V4S64, V3P0));
198*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V3P0, V4S64));
1994fb2116eSMatt Arsenault 
200*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V4P0, V3S64));
201*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S64), getLCMType(V3S64, V4P0));
2021ef3ed0eSMatt Arsenault 
2031ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, S32));
2041ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S32, getLCMType(S32, V2P0));
2051ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, S64));
2061ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S64, getLCMType(S64, V2P0));
2071ef3ed0eSMatt Arsenault 
2081ef3ed0eSMatt Arsenault 
2091ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V2P1));
2101ef3ed0eSMatt Arsenault   EXPECT_EQ(V4P1, getLCMType(V2P1, V2P0));
2111ef3ed0eSMatt Arsenault 
2121ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V4P1));
2131ef3ed0eSMatt Arsenault   EXPECT_EQ(V4P1, getLCMType(V4P1, V2P0));
2141ef3ed0eSMatt Arsenault 
2151ef3ed0eSMatt Arsenault 
2161ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, S64));
2171ef3ed0eSMatt Arsenault   EXPECT_EQ(S64, getLCMType(S64, V2S32));
2181ef3ed0eSMatt Arsenault 
2191ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S16, getLCMType(V4S16, V2S32));
2201ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V4S16));
2211ef3ed0eSMatt Arsenault 
2221ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V4S8));
2231ef3ed0eSMatt Arsenault   EXPECT_EQ(V8S8, getLCMType(V4S8, V2S32));
2241ef3ed0eSMatt Arsenault 
2251ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S16, getLCMType(V2S16, V4S8));
2261ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S8, getLCMType(V4S8, V2S16));
2271ef3ed0eSMatt Arsenault 
228*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(6, S16), getLCMType(V3S16, V4S8));
229*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S8), getLCMType(V4S8, V3S16));
2301ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S16, getLCMType(V4S16, V4S8));
2311ef3ed0eSMatt Arsenault   EXPECT_EQ(V8S8, getLCMType(V4S8, V4S16));
2321ef3ed0eSMatt Arsenault 
233*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(6, 4), getLCMType(LLT::fixed_vector(3, 4), S8));
234*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(3, 8), getLCMType(S8, LLT::fixed_vector(3, 4)));
2351ef3ed0eSMatt Arsenault 
236*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(6, 4),
237*d5e14ba8SSander de Smalen             getLCMType(LLT::fixed_vector(3, 4), LLT::pointer(4, 8)));
238*d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(3, LLT::pointer(4, 8)),
239*d5e14ba8SSander de Smalen             getLCMType(LLT::pointer(4, 8), LLT::fixed_vector(3, 4)));
2401ef3ed0eSMatt Arsenault 
2411ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S64, getLCMType(V2S64, P0));
2421ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(P0, V2S64));
2431ef3ed0eSMatt Arsenault 
2441ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S64, getLCMType(V2S64, P1));
2451ef3ed0eSMatt Arsenault   EXPECT_EQ(V4P1, getLCMType(P1, V2S64));
2464fb2116eSMatt Arsenault }
2474fb2116eSMatt Arsenault 
2484fb2116eSMatt Arsenault }
249