xref: /llvm-project/llvm/unittests/CodeGen/GlobalISel/GISelUtilsTest.cpp (revision c21a3776c94eef46ea43192c6d0b8df6258b6489)
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 
9704b2e16SJessica Paquette #include "GISelMITest.h"
104fb2116eSMatt Arsenault #include "llvm/CodeGen/GlobalISel/Utils.h"
114fb2116eSMatt Arsenault #include "gtest/gtest.h"
124fb2116eSMatt Arsenault 
134fb2116eSMatt Arsenault using namespace llvm;
144fb2116eSMatt Arsenault 
154fb2116eSMatt Arsenault namespace {
164fb2116eSMatt Arsenault static const LLT S1 = LLT::scalar(1);
1712d5bec8SMatt Arsenault static const LLT S8 = LLT::scalar(8);
184fb2116eSMatt Arsenault static const LLT S16 = LLT::scalar(16);
194fb2116eSMatt Arsenault static const LLT S32 = LLT::scalar(32);
204fb2116eSMatt Arsenault static const LLT S64 = LLT::scalar(64);
214fb2116eSMatt Arsenault static const LLT P0 = LLT::pointer(0, 64);
224fb2116eSMatt Arsenault static const LLT P1 = LLT::pointer(1, 32);
234fb2116eSMatt Arsenault 
24d5e14ba8SSander de Smalen static const LLT V2S8 = LLT::fixed_vector(2, 8);
25d5e14ba8SSander de Smalen static const LLT V4S8 = LLT::fixed_vector(4, 8);
26d5e14ba8SSander de Smalen static const LLT V8S8 = LLT::fixed_vector(8, 8);
2712d5bec8SMatt Arsenault 
28d5e14ba8SSander de Smalen static const LLT V2S16 = LLT::fixed_vector(2, 16);
29d5e14ba8SSander de Smalen static const LLT V3S16 = LLT::fixed_vector(3, 16);
30d5e14ba8SSander de Smalen static const LLT V4S16 = LLT::fixed_vector(4, 16);
314fb2116eSMatt Arsenault 
32d5e14ba8SSander de Smalen static const LLT V2S32 = LLT::fixed_vector(2, 32);
33d5e14ba8SSander de Smalen static const LLT V3S32 = LLT::fixed_vector(3, 32);
34d5e14ba8SSander de Smalen static const LLT V4S32 = LLT::fixed_vector(4, 32);
35d5e14ba8SSander de Smalen static const LLT V6S32 = LLT::fixed_vector(6, 32);
364fb2116eSMatt Arsenault 
37d5e14ba8SSander de Smalen static const LLT V2S64 = LLT::fixed_vector(2, 64);
38d5e14ba8SSander de Smalen static const LLT V3S64 = LLT::fixed_vector(3, 64);
39d5e14ba8SSander de Smalen static const LLT V4S64 = LLT::fixed_vector(4, 64);
4012d5bec8SMatt Arsenault 
41d5e14ba8SSander de Smalen static const LLT V2P0 = LLT::fixed_vector(2, P0);
42d5e14ba8SSander de Smalen static const LLT V3P0 = LLT::fixed_vector(3, P0);
43d5e14ba8SSander de Smalen static const LLT V4P0 = LLT::fixed_vector(4, P0);
44d5e14ba8SSander de Smalen static const LLT V6P0 = LLT::fixed_vector(6, P0);
454fb2116eSMatt Arsenault 
46d5e14ba8SSander de Smalen static const LLT V2P1 = LLT::fixed_vector(2, P1);
47d5e14ba8SSander de Smalen static const LLT V4P1 = LLT::fixed_vector(4, P1);
4812d5bec8SMatt Arsenault 
49055ac72eSMichael Maitland static const LLT NXV1S1 = LLT::scalable_vector(1, S1);
50055ac72eSMichael Maitland static const LLT NXV2S1 = LLT::scalable_vector(2, S1);
51055ac72eSMichael Maitland static const LLT NXV3S1 = LLT::scalable_vector(3, S1);
52055ac72eSMichael Maitland static const LLT NXV4S1 = LLT::scalable_vector(4, S1);
53055ac72eSMichael Maitland static const LLT NXV12S1 = LLT::scalable_vector(12, S1);
54055ac72eSMichael Maitland static const LLT NXV32S1 = LLT::scalable_vector(32, S1);
55055ac72eSMichael Maitland static const LLT NXV64S1 = LLT::scalable_vector(64, S1);
56055ac72eSMichael Maitland static const LLT NXV128S1 = LLT::scalable_vector(128, S1);
57055ac72eSMichael Maitland static const LLT NXV384S1 = LLT::scalable_vector(384, S1);
58055ac72eSMichael Maitland 
59055ac72eSMichael Maitland static const LLT NXV1S32 = LLT::scalable_vector(1, S32);
60055ac72eSMichael Maitland static const LLT NXV2S32 = LLT::scalable_vector(2, S32);
61055ac72eSMichael Maitland static const LLT NXV3S32 = LLT::scalable_vector(3, S32);
62055ac72eSMichael Maitland static const LLT NXV4S32 = LLT::scalable_vector(4, S32);
63055ac72eSMichael Maitland static const LLT NXV8S32 = LLT::scalable_vector(8, S32);
64055ac72eSMichael Maitland static const LLT NXV12S32 = LLT::scalable_vector(12, S32);
65055ac72eSMichael Maitland static const LLT NXV24S32 = LLT::scalable_vector(24, S32);
66055ac72eSMichael Maitland 
67055ac72eSMichael Maitland static const LLT NXV1S64 = LLT::scalable_vector(1, S64);
68055ac72eSMichael Maitland static const LLT NXV2S64 = LLT::scalable_vector(2, S64);
69055ac72eSMichael Maitland static const LLT NXV3S64 = LLT::scalable_vector(3, S64);
70055ac72eSMichael Maitland static const LLT NXV4S64 = LLT::scalable_vector(4, S64);
71055ac72eSMichael Maitland static const LLT NXV6S64 = LLT::scalable_vector(6, S64);
72055ac72eSMichael Maitland static const LLT NXV12S64 = LLT::scalable_vector(12, S64);
73055ac72eSMichael Maitland 
74055ac72eSMichael Maitland static const LLT NXV1P0 = LLT::scalable_vector(1, P0);
75055ac72eSMichael Maitland static const LLT NXV2P0 = LLT::scalable_vector(2, P0);
76055ac72eSMichael Maitland static const LLT NXV3P0 = LLT::scalable_vector(3, P0);
77055ac72eSMichael Maitland static const LLT NXV4P0 = LLT::scalable_vector(4, P0);
78055ac72eSMichael Maitland static const LLT NXV12P0 = LLT::scalable_vector(12, P0);
79055ac72eSMichael Maitland 
80*c21a3776SVikash Gupta static void collectNonCopyMI(SmallVectorImpl<MachineInstr *> &MIList,
81*c21a3776SVikash Gupta                              MachineFunction *MF) {
82*c21a3776SVikash Gupta   for (auto &MBB : *MF)
83*c21a3776SVikash Gupta     for (MachineInstr &MI : MBB) {
84*c21a3776SVikash Gupta       if (MI.getOpcode() != TargetOpcode::COPY)
85*c21a3776SVikash Gupta         MIList.push_back(&MI);
86*c21a3776SVikash Gupta     }
87*c21a3776SVikash Gupta }
88*c21a3776SVikash Gupta 
894fb2116eSMatt Arsenault TEST(GISelUtilsTest, getGCDType) {
904fb2116eSMatt Arsenault   EXPECT_EQ(S1, getGCDType(S1, S1));
914fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(S32, S32));
924fb2116eSMatt Arsenault   EXPECT_EQ(S1, getGCDType(S1, S32));
934fb2116eSMatt Arsenault   EXPECT_EQ(S1, getGCDType(S32, S1));
944fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(S16, S32));
954fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(S32, S16));
964fb2116eSMatt Arsenault 
974fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getGCDType(V2S32, V2S32));
984fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(V3S32, V2S32));
994fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(V2S32, V3S32));
1004fb2116eSMatt Arsenault 
1014fb2116eSMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V4S16, V2S16));
1024fb2116eSMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V2S16, V4S16));
1034fb2116eSMatt Arsenault 
1044fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getGCDType(V4S32, V2S32));
1054fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getGCDType(V2S32, V4S32));
1064fb2116eSMatt Arsenault 
1074fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(P0, S16));
1084fb2116eSMatt Arsenault   EXPECT_EQ(S16, getGCDType(S16, P0));
1094fb2116eSMatt Arsenault 
1104fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(P0, S32));
1114fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(S32, P0));
1124fb2116eSMatt Arsenault 
11312d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(P0, S64));
1144fb2116eSMatt Arsenault   EXPECT_EQ(S64, getGCDType(S64, P0));
1154fb2116eSMatt Arsenault 
1164fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(P0, P1));
1174fb2116eSMatt Arsenault   EXPECT_EQ(S32, getGCDType(P1, P0));
1184fb2116eSMatt Arsenault 
1194fb2116eSMatt Arsenault   EXPECT_EQ(P0, getGCDType(V3P0, V2P0));
1204fb2116eSMatt Arsenault   EXPECT_EQ(P0, getGCDType(V2P0, V3P0));
12112d5bec8SMatt Arsenault 
12212d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(P0, V2P0));
12312d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(V2P0, P0));
12412d5bec8SMatt Arsenault 
12512d5bec8SMatt Arsenault 
12612d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V2P0, V2P0));
12712d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(V3P0, V2P0));
12812d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(V2P0, V3P0));
12912d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V4P0, V2P0));
13012d5bec8SMatt Arsenault 
13112d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V2P0, V4P1));
13212d5bec8SMatt Arsenault   EXPECT_EQ(V4P1, getGCDType(V4P1, V2P0));
13312d5bec8SMatt Arsenault 
13412d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V4P0, V4P1));
13512d5bec8SMatt Arsenault   EXPECT_EQ(V4P1, getGCDType(V4P1, V4P0));
13612d5bec8SMatt Arsenault 
13712d5bec8SMatt Arsenault   // Elements have same size, but have different pointeriness, so prefer the
13812d5bec8SMatt Arsenault   // original element type.
13912d5bec8SMatt Arsenault   EXPECT_EQ(V2P0, getGCDType(V2P0, V4S64));
14012d5bec8SMatt Arsenault   EXPECT_EQ(V2S64, getGCDType(V4S64, V2P0));
14112d5bec8SMatt Arsenault 
14212d5bec8SMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V2S16, V4P1));
14312d5bec8SMatt Arsenault   EXPECT_EQ(P1, getGCDType(V4P1, V2S16));
14412d5bec8SMatt Arsenault   EXPECT_EQ(V2P1, getGCDType(V4P1, V4S16));
14512d5bec8SMatt Arsenault   EXPECT_EQ(V4S16, getGCDType(V4S16, V2P1));
14612d5bec8SMatt Arsenault 
14712d5bec8SMatt Arsenault   EXPECT_EQ(P0, getGCDType(P0, V2S64));
14812d5bec8SMatt Arsenault   EXPECT_EQ(S64, getGCDType(V2S64, P0));
14912d5bec8SMatt Arsenault 
15012d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V2S16, V3S16));
15112d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V3S16, V2S16));
15212d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V3S16, S16));
15312d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(S16, V3S16));
15412d5bec8SMatt Arsenault 
15512d5bec8SMatt Arsenault   EXPECT_EQ(V2S16, getGCDType(V2S16, V2S32));
15612d5bec8SMatt Arsenault   EXPECT_EQ(S32, getGCDType(V2S32, V2S16));
15712d5bec8SMatt Arsenault 
15812d5bec8SMatt Arsenault   EXPECT_EQ(V4S8, getGCDType(V4S8, V2S32));
15912d5bec8SMatt Arsenault   EXPECT_EQ(S32, getGCDType(V2S32, V4S8));
16012d5bec8SMatt Arsenault 
16112d5bec8SMatt Arsenault   // Test cases where neither element type nicely divides.
162d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3),
163d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(3, 5), LLT::fixed_vector(2, 6)));
164d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3),
165d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(2, 6), LLT::fixed_vector(3, 5)));
16612d5bec8SMatt Arsenault 
16712d5bec8SMatt Arsenault   // Have to go smaller than a pointer element.
168d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3), getGCDType(LLT::fixed_vector(2, LLT::pointer(3, 6)),
169d5e14ba8SSander de Smalen                                        LLT::fixed_vector(3, 5)));
170d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(3),
171d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(3, 5),
172d5e14ba8SSander de Smalen                        LLT::fixed_vector(2, LLT::pointer(3, 6))));
17312d5bec8SMatt Arsenault 
17412d5bec8SMatt Arsenault   EXPECT_EQ(V4S8, getGCDType(V4S8, S32));
17512d5bec8SMatt Arsenault   EXPECT_EQ(S32, getGCDType(S32, V4S8));
17612d5bec8SMatt Arsenault   EXPECT_EQ(V4S8, getGCDType(V4S8, P1));
17712d5bec8SMatt Arsenault   EXPECT_EQ(P1, getGCDType(P1, V4S8));
17812d5bec8SMatt Arsenault 
17912d5bec8SMatt Arsenault   EXPECT_EQ(V2S8, getGCDType(V2S8, V4S16));
18012d5bec8SMatt Arsenault   EXPECT_EQ(S16, getGCDType(V4S16, V2S8));
18112d5bec8SMatt Arsenault 
182d5e14ba8SSander de Smalen   EXPECT_EQ(S8, getGCDType(V2S8, LLT::fixed_vector(4, 2)));
183d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(4, 2), getGCDType(LLT::fixed_vector(4, 2), S8));
18412d5bec8SMatt Arsenault 
185d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::pointer(4, 8),
186d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(2, LLT::pointer(4, 8)),
187d5e14ba8SSander de Smalen                        LLT::fixed_vector(4, 2)));
18812d5bec8SMatt Arsenault 
189d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(4, 2),
190d5e14ba8SSander de Smalen             getGCDType(LLT::fixed_vector(4, 2),
191d5e14ba8SSander de Smalen                        LLT::fixed_vector(2, LLT::pointer(4, 8))));
19212d5bec8SMatt Arsenault 
193d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(4), getGCDType(LLT::fixed_vector(3, 4), S8));
194d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(4), getGCDType(S8, LLT::fixed_vector(3, 4)));
195c954986fSMichael Maitland 
196c954986fSMichael Maitland   // Scalable -> Scalable
197c954986fSMichael Maitland   EXPECT_EQ(NXV1S1, getGCDType(NXV1S1, NXV1S32));
198c954986fSMichael Maitland   EXPECT_EQ(NXV1S32, getGCDType(NXV1S64, NXV1S32));
199c954986fSMichael Maitland   EXPECT_EQ(NXV1S32, getGCDType(NXV1S32, NXV1S64));
200c954986fSMichael Maitland   EXPECT_EQ(NXV1P0, getGCDType(NXV1P0, NXV1S64));
201c954986fSMichael Maitland   EXPECT_EQ(NXV1S64, getGCDType(NXV1S64, NXV1P0));
202c954986fSMichael Maitland 
203c954986fSMichael Maitland   EXPECT_EQ(NXV4S1, getGCDType(NXV4S1, NXV4S32));
204c954986fSMichael Maitland   EXPECT_EQ(NXV2S64, getGCDType(NXV4S64, NXV4S32));
205c954986fSMichael Maitland   EXPECT_EQ(NXV4S32, getGCDType(NXV4S32, NXV4S64));
206c954986fSMichael Maitland   EXPECT_EQ(NXV4P0, getGCDType(NXV4P0, NXV4S64));
207c954986fSMichael Maitland   EXPECT_EQ(NXV4S64, getGCDType(NXV4S64, NXV4P0));
208c954986fSMichael Maitland 
209c954986fSMichael Maitland   EXPECT_EQ(NXV4S1, getGCDType(NXV4S1, NXV2S32));
210c954986fSMichael Maitland   EXPECT_EQ(NXV1S64, getGCDType(NXV4S64, NXV2S32));
211c954986fSMichael Maitland   EXPECT_EQ(NXV4S32, getGCDType(NXV4S32, NXV2S64));
212c954986fSMichael Maitland   EXPECT_EQ(NXV2P0, getGCDType(NXV4P0, NXV2S64));
213c954986fSMichael Maitland   EXPECT_EQ(NXV2S64, getGCDType(NXV4S64, NXV2P0));
214c954986fSMichael Maitland 
215c954986fSMichael Maitland   EXPECT_EQ(NXV2S1, getGCDType(NXV2S1, NXV4S32));
216c954986fSMichael Maitland   EXPECT_EQ(NXV2S64, getGCDType(NXV2S64, NXV4S32));
217c954986fSMichael Maitland   EXPECT_EQ(NXV2S32, getGCDType(NXV2S32, NXV4S64));
218c954986fSMichael Maitland   EXPECT_EQ(NXV2P0, getGCDType(NXV2P0, NXV4S64));
219c954986fSMichael Maitland   EXPECT_EQ(NXV2S64, getGCDType(NXV2S64, NXV4P0));
220c954986fSMichael Maitland 
221c954986fSMichael Maitland   EXPECT_EQ(NXV1S1, getGCDType(NXV3S1, NXV4S32));
222c954986fSMichael Maitland   EXPECT_EQ(NXV1S64, getGCDType(NXV3S64, NXV4S32));
223c954986fSMichael Maitland   EXPECT_EQ(NXV1S32, getGCDType(NXV3S32, NXV4S64));
224c954986fSMichael Maitland   EXPECT_EQ(NXV1P0, getGCDType(NXV3P0, NXV4S64));
225c954986fSMichael Maitland   EXPECT_EQ(NXV1S64, getGCDType(NXV3S64, NXV4P0));
226c954986fSMichael Maitland 
227c954986fSMichael Maitland   EXPECT_EQ(NXV1S1, getGCDType(NXV3S1, NXV4S1));
228c954986fSMichael Maitland   EXPECT_EQ(NXV1S32, getGCDType(NXV3S32, NXV4S32));
229c954986fSMichael Maitland   EXPECT_EQ(NXV1S64, getGCDType(NXV3S64, NXV4S64));
230c954986fSMichael Maitland   EXPECT_EQ(NXV1P0, getGCDType(NXV3P0, NXV4P0));
231c954986fSMichael Maitland 
232c954986fSMichael Maitland   // Scalable, Scalar
233c954986fSMichael Maitland 
234c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(NXV1S1, S1));
235c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(NXV1S1, S32));
236c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(NXV1S32, S1));
237c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(NXV1S32, S32));
238c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(NXV1S32, S64));
239c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(NXV2S32, S1));
240c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(NXV2S32, S32));
241c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(NXV2S32, S64));
242c954986fSMichael Maitland 
243c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(S1, NXV1S1));
244c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(S32, NXV1S1));
245c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(S1, NXV1S32));
246c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(S32, NXV1S32));
247c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(S64, NXV1S32));
248c954986fSMichael Maitland   EXPECT_EQ(S1, getGCDType(S1, NXV2S32));
249c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(S32, NXV2S32));
250c954986fSMichael Maitland   EXPECT_EQ(S32, getGCDType(S64, NXV2S32));
2514fb2116eSMatt Arsenault }
2524fb2116eSMatt Arsenault 
2534fb2116eSMatt Arsenault TEST(GISelUtilsTest, getLCMType) {
2544fb2116eSMatt Arsenault   EXPECT_EQ(S1, getLCMType(S1, S1));
2554fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, S1));
2564fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S1, S32));
2574fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, S32));
2584fb2116eSMatt Arsenault 
2594fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, S16));
2604fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S16, S32));
2614fb2116eSMatt Arsenault 
2624fb2116eSMatt Arsenault   EXPECT_EQ(S64, getLCMType(S64, P0));
2631ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, S64));
2644fb2116eSMatt Arsenault 
2651ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(S32, P0));
2661ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, S32));
2674fb2116eSMatt Arsenault 
2684fb2116eSMatt Arsenault   EXPECT_EQ(S32, getLCMType(S32, P1));
2691ef3ed0eSMatt Arsenault   EXPECT_EQ(P1, getLCMType(P1, S32));
2701ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, P0));
2711ef3ed0eSMatt Arsenault   EXPECT_EQ(P1, getLCMType(P1, P1));
2724fb2116eSMatt Arsenault 
2731ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P0, P1));
2741ef3ed0eSMatt Arsenault   EXPECT_EQ(P0, getLCMType(P1, P0));
2754fb2116eSMatt Arsenault 
2764fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V2S32));
2774fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, S32));
2784fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(S32, V2S32));
2794fb2116eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V2S32));
2804fb2116eSMatt Arsenault   EXPECT_EQ(V6S32, getLCMType(V2S32, V3S32));
2814fb2116eSMatt Arsenault   EXPECT_EQ(V6S32, getLCMType(V3S32, V2S32));
282d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S32), getLCMType(V4S32, V3S32));
283d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S32), getLCMType(V3S32, V4S32));
2844fb2116eSMatt Arsenault 
2854fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V2P0));
2864fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, P0));
2874fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(P0, V2P0));
2884fb2116eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V2P0));
2894fb2116eSMatt Arsenault   EXPECT_EQ(V6P0, getLCMType(V2P0, V3P0));
2904fb2116eSMatt Arsenault   EXPECT_EQ(V6P0, getLCMType(V3P0, V2P0));
291d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V4P0, V3P0));
292d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V3P0, V4P0));
2934fb2116eSMatt Arsenault 
294d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S64), getLCMType(V4S64, V3P0));
295d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V3P0, V4S64));
2964fb2116eSMatt Arsenault 
297d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, P0), getLCMType(V4P0, V3S64));
298d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S64), getLCMType(V3S64, V4P0));
2991ef3ed0eSMatt Arsenault 
3001ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, S32));
3011ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S32, getLCMType(S32, V2P0));
3021ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, S64));
3031ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S64, getLCMType(S64, V2P0));
3041ef3ed0eSMatt Arsenault 
3051ef3ed0eSMatt Arsenault 
3061ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V2P1));
3071ef3ed0eSMatt Arsenault   EXPECT_EQ(V4P1, getLCMType(V2P1, V2P0));
3081ef3ed0eSMatt Arsenault 
3091ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(V2P0, V4P1));
3101ef3ed0eSMatt Arsenault   EXPECT_EQ(V4P1, getLCMType(V4P1, V2P0));
3111ef3ed0eSMatt Arsenault 
3121ef3ed0eSMatt Arsenault 
3131ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, S64));
3141ef3ed0eSMatt Arsenault   EXPECT_EQ(S64, getLCMType(S64, V2S32));
3151ef3ed0eSMatt Arsenault 
3161ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S16, getLCMType(V4S16, V2S32));
3171ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V4S16));
3181ef3ed0eSMatt Arsenault 
3191ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S32, getLCMType(V2S32, V4S8));
3201ef3ed0eSMatt Arsenault   EXPECT_EQ(V8S8, getLCMType(V4S8, V2S32));
3211ef3ed0eSMatt Arsenault 
3221ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S16, getLCMType(V2S16, V4S8));
3231ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S8, getLCMType(V4S8, V2S16));
3241ef3ed0eSMatt Arsenault 
325d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(6, S16), getLCMType(V3S16, V4S8));
326d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(12, S8), getLCMType(V4S8, V3S16));
3271ef3ed0eSMatt Arsenault   EXPECT_EQ(V4S16, getLCMType(V4S16, V4S8));
3281ef3ed0eSMatt Arsenault   EXPECT_EQ(V8S8, getLCMType(V4S8, V4S16));
3291ef3ed0eSMatt Arsenault 
330d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(6, 4), getLCMType(LLT::fixed_vector(3, 4), S8));
331d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(3, 8), getLCMType(S8, LLT::fixed_vector(3, 4)));
3321ef3ed0eSMatt Arsenault 
333d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(6, 4),
334d5e14ba8SSander de Smalen             getLCMType(LLT::fixed_vector(3, 4), LLT::pointer(4, 8)));
335d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(3, LLT::pointer(4, 8)),
336d5e14ba8SSander de Smalen             getLCMType(LLT::pointer(4, 8), LLT::fixed_vector(3, 4)));
3371ef3ed0eSMatt Arsenault 
3381ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S64, getLCMType(V2S64, P0));
3391ef3ed0eSMatt Arsenault   EXPECT_EQ(V2P0, getLCMType(P0, V2S64));
3401ef3ed0eSMatt Arsenault 
3411ef3ed0eSMatt Arsenault   EXPECT_EQ(V2S64, getLCMType(V2S64, P1));
3421ef3ed0eSMatt Arsenault   EXPECT_EQ(V4P1, getLCMType(P1, V2S64));
343055ac72eSMichael Maitland 
344055ac72eSMichael Maitland   // Scalable, Scalable
345055ac72eSMichael Maitland   EXPECT_EQ(NXV32S1, getLCMType(NXV1S1, NXV1S32));
346055ac72eSMichael Maitland   EXPECT_EQ(NXV1S64, getLCMType(NXV1S64, NXV1S32));
347055ac72eSMichael Maitland   EXPECT_EQ(NXV2S32, getLCMType(NXV1S32, NXV1S64));
348055ac72eSMichael Maitland   EXPECT_EQ(NXV1P0, getLCMType(NXV1P0, NXV1S64));
349055ac72eSMichael Maitland   EXPECT_EQ(NXV1S64, getLCMType(NXV1S64, NXV1P0));
350055ac72eSMichael Maitland 
351055ac72eSMichael Maitland   EXPECT_EQ(NXV128S1, getLCMType(NXV4S1, NXV4S32));
352055ac72eSMichael Maitland   EXPECT_EQ(NXV4S64, getLCMType(NXV4S64, NXV4S32));
353055ac72eSMichael Maitland   EXPECT_EQ(NXV8S32, getLCMType(NXV4S32, NXV4S64));
354055ac72eSMichael Maitland   EXPECT_EQ(NXV4P0, getLCMType(NXV4P0, NXV4S64));
355055ac72eSMichael Maitland   EXPECT_EQ(NXV4S64, getLCMType(NXV4S64, NXV4P0));
356055ac72eSMichael Maitland 
357055ac72eSMichael Maitland   EXPECT_EQ(NXV64S1, getLCMType(NXV4S1, NXV2S32));
358055ac72eSMichael Maitland   EXPECT_EQ(NXV4S64, getLCMType(NXV4S64, NXV2S32));
359055ac72eSMichael Maitland   EXPECT_EQ(NXV4S32, getLCMType(NXV4S32, NXV2S64));
360055ac72eSMichael Maitland   EXPECT_EQ(NXV4P0, getLCMType(NXV4P0, NXV2S64));
361055ac72eSMichael Maitland   EXPECT_EQ(NXV4S64, getLCMType(NXV4S64, NXV2P0));
362055ac72eSMichael Maitland 
363055ac72eSMichael Maitland   EXPECT_EQ(NXV128S1, getLCMType(NXV2S1, NXV4S32));
364055ac72eSMichael Maitland   EXPECT_EQ(NXV2S64, getLCMType(NXV2S64, NXV4S32));
365055ac72eSMichael Maitland   EXPECT_EQ(NXV8S32, getLCMType(NXV2S32, NXV4S64));
366055ac72eSMichael Maitland   EXPECT_EQ(NXV4P0, getLCMType(NXV2P0, NXV4S64));
367055ac72eSMichael Maitland   EXPECT_EQ(NXV4S64, getLCMType(NXV2S64, NXV4P0));
368055ac72eSMichael Maitland 
369055ac72eSMichael Maitland   EXPECT_EQ(NXV384S1, getLCMType(NXV3S1, NXV4S32));
370055ac72eSMichael Maitland   EXPECT_EQ(NXV6S64, getLCMType(NXV3S64, NXV4S32));
371055ac72eSMichael Maitland   EXPECT_EQ(NXV24S32, getLCMType(NXV3S32, NXV4S64));
372055ac72eSMichael Maitland   EXPECT_EQ(NXV12P0, getLCMType(NXV3P0, NXV4S64));
373055ac72eSMichael Maitland   EXPECT_EQ(NXV12S64, getLCMType(NXV3S64, NXV4P0));
374055ac72eSMichael Maitland 
375055ac72eSMichael Maitland   EXPECT_EQ(NXV12S1, getLCMType(NXV3S1, NXV4S1));
376055ac72eSMichael Maitland   EXPECT_EQ(NXV12S32, getLCMType(NXV3S32, NXV4S32));
377055ac72eSMichael Maitland   EXPECT_EQ(NXV12S64, getLCMType(NXV3S64, NXV4S64));
378055ac72eSMichael Maitland   EXPECT_EQ(NXV12P0, getLCMType(NXV3P0, NXV4P0));
379055ac72eSMichael Maitland 
380055ac72eSMichael Maitland   // Scalable, Scalar
381055ac72eSMichael Maitland 
382055ac72eSMichael Maitland   EXPECT_EQ(NXV1S1, getLCMType(NXV1S1, S1));
383055ac72eSMichael Maitland   EXPECT_EQ(NXV32S1, getLCMType(NXV1S1, S32));
384055ac72eSMichael Maitland   EXPECT_EQ(NXV1S32, getLCMType(NXV1S32, S1));
385055ac72eSMichael Maitland   EXPECT_EQ(NXV1S32, getLCMType(NXV1S32, S32));
386055ac72eSMichael Maitland   EXPECT_EQ(NXV2S32, getLCMType(NXV1S32, S64));
387055ac72eSMichael Maitland   EXPECT_EQ(NXV2S32, getLCMType(NXV2S32, S1));
388055ac72eSMichael Maitland   EXPECT_EQ(NXV2S32, getLCMType(NXV2S32, S32));
389055ac72eSMichael Maitland   EXPECT_EQ(NXV2S32, getLCMType(NXV2S32, S64));
390055ac72eSMichael Maitland 
391055ac72eSMichael Maitland   EXPECT_EQ(NXV1S1, getLCMType(S1, NXV1S1));
392055ac72eSMichael Maitland   EXPECT_EQ(NXV1S32, getLCMType(S32, NXV1S1));
393055ac72eSMichael Maitland   EXPECT_EQ(NXV32S1, getLCMType(S1, NXV1S32));
394055ac72eSMichael Maitland   EXPECT_EQ(NXV1S32, getLCMType(S32, NXV1S32));
395055ac72eSMichael Maitland   EXPECT_EQ(NXV1S64, getLCMType(S64, NXV1S32));
396055ac72eSMichael Maitland   EXPECT_EQ(NXV64S1, getLCMType(S1, NXV2S32));
397055ac72eSMichael Maitland   EXPECT_EQ(NXV2S32, getLCMType(S32, NXV2S32));
398055ac72eSMichael Maitland   EXPECT_EQ(NXV1S64, getLCMType(S64, NXV2S32));
3994fb2116eSMatt Arsenault }
4004fb2116eSMatt Arsenault 
401704b2e16SJessica Paquette TEST_F(AArch64GISelMITest, ConstFalseTest) {
402704b2e16SJessica Paquette   setUp();
403704b2e16SJessica Paquette   if (!TM)
4047fc87159SPaul Robinson     GTEST_SKIP();
405704b2e16SJessica Paquette   const auto &TLI = *B.getMF().getSubtarget().getTargetLowering();
406704b2e16SJessica Paquette   bool BooleanChoices[2] = {true, false};
407704b2e16SJessica Paquette 
408704b2e16SJessica Paquette   // AArch64 uses ZeroOrOneBooleanContent for scalars, and
409704b2e16SJessica Paquette   // ZeroOrNegativeOneBooleanContent for vectors.
410704b2e16SJessica Paquette   for (auto IsVec : BooleanChoices) {
411704b2e16SJessica Paquette     for (auto IsFP : BooleanChoices) {
412704b2e16SJessica Paquette       EXPECT_TRUE(isConstFalseVal(TLI, 0, IsVec, IsFP));
413704b2e16SJessica Paquette       EXPECT_FALSE(isConstFalseVal(TLI, 1, IsVec, IsFP));
414704b2e16SJessica Paquette 
415704b2e16SJessica Paquette       // This would be true with UndefinedBooleanContent.
416704b2e16SJessica Paquette       EXPECT_FALSE(isConstFalseVal(TLI, 2, IsVec, IsFP));
417704b2e16SJessica Paquette     }
418704b2e16SJessica Paquette   }
419704b2e16SJessica Paquette }
420*c21a3776SVikash Gupta 
421*c21a3776SVikash Gupta TEST_F(AMDGPUGISelMITest, isConstantOrConstantSplatVectorFP) {
422*c21a3776SVikash Gupta   StringRef MIRString =
423*c21a3776SVikash Gupta       "  %cst0:_(s32) = G_FCONSTANT float 2.000000e+00\n"
424*c21a3776SVikash Gupta       "  %cst1:_(s32) = G_FCONSTANT float 0.0\n"
425*c21a3776SVikash Gupta       "  %cst2:_(s64) = G_FCONSTANT double 3.000000e-02\n"
426*c21a3776SVikash Gupta       "  %cst3:_(s32) = G_CONSTANT i32 2\n"
427*c21a3776SVikash Gupta       "  %cst4:_(<2 x s32>) = G_BUILD_VECTOR %cst0(s32), %cst0(s32)\n"
428*c21a3776SVikash Gupta       "  %cst5:_(<2 x s32>) = G_BUILD_VECTOR %cst1(s32), %cst0(s32)\n"
429*c21a3776SVikash Gupta       "  %cst6:_(<2 x s64>) = G_BUILD_VECTOR %cst2(s64), %cst2(s64)\n"
430*c21a3776SVikash Gupta       "  %cst7:_(<2 x s32>) = G_BUILD_VECTOR %cst3(s32), %cst3:_(s32)\n"
431*c21a3776SVikash Gupta       "  %cst8:_(<4 x s32>) = G_CONCAT_VECTORS %cst4:_(<2 x s32>), %cst4:_(<2 "
432*c21a3776SVikash Gupta       "x s32>)\n"
433*c21a3776SVikash Gupta       "  %cst9:_(<4 x s64>) = G_CONCAT_VECTORS %cst6:_(<2 x s64>), %cst6:_(<2 "
434*c21a3776SVikash Gupta       "x s64>)\n"
435*c21a3776SVikash Gupta       "  %cst10:_(<4 x s32>) = G_CONCAT_VECTORS %cst4:_(<2 x s32>), %cst5:_(<2 "
436*c21a3776SVikash Gupta       "x s32>)\n"
437*c21a3776SVikash Gupta       "  %cst11:_(<4 x s32>) = G_CONCAT_VECTORS %cst7:_(<2 x s32>), %cst7:_(<2 "
438*c21a3776SVikash Gupta       "x s32>)\n"
439*c21a3776SVikash Gupta       "  %cst12:_(s32) = G_IMPLICIT_DEF \n"
440*c21a3776SVikash Gupta       "  %cst13:_(<2 x s32>) = G_BUILD_VECTOR %cst12(s32), %cst12(s32)\n"
441*c21a3776SVikash Gupta       "  %cst14:_(<2 x s32>) = G_BUILD_VECTOR %cst0(s32), %cst12(s32)\n"
442*c21a3776SVikash Gupta       "  %cst15:_(<4 x s32>) = G_CONCAT_VECTORS %cst4:_(<2 x s32>), "
443*c21a3776SVikash Gupta       "%cst14:_(<2 "
444*c21a3776SVikash Gupta       "x s32>)\n";
445*c21a3776SVikash Gupta 
446*c21a3776SVikash Gupta   SmallVector<MachineInstr *, 16> MIList;
447*c21a3776SVikash Gupta 
448*c21a3776SVikash Gupta   setUp(MIRString);
449*c21a3776SVikash Gupta   if (!TM)
450*c21a3776SVikash Gupta     GTEST_SKIP();
451*c21a3776SVikash Gupta 
452*c21a3776SVikash Gupta   collectNonCopyMI(MIList, MF);
453*c21a3776SVikash Gupta 
454*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[0], *MRI).has_value());
455*c21a3776SVikash Gupta   auto val = isConstantOrConstantSplatVectorFP(*MIList[0], *MRI).value();
456*c21a3776SVikash Gupta   EXPECT_EQ(2.0, val.convertToFloat());
457*c21a3776SVikash Gupta 
458*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[1], *MRI).has_value());
459*c21a3776SVikash Gupta   val = isConstantOrConstantSplatVectorFP(*MIList[1], *MRI).value();
460*c21a3776SVikash Gupta   EXPECT_EQ(0.0, val.convertToFloat());
461*c21a3776SVikash Gupta 
462*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[2], *MRI).has_value());
463*c21a3776SVikash Gupta   val = isConstantOrConstantSplatVectorFP(*MIList[2], *MRI).value();
464*c21a3776SVikash Gupta   EXPECT_EQ(0.03, val.convertToDouble());
465*c21a3776SVikash Gupta 
466*c21a3776SVikash Gupta   EXPECT_FALSE(isConstantOrConstantSplatVectorFP(*MIList[3], *MRI).has_value());
467*c21a3776SVikash Gupta 
468*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[4], *MRI).has_value());
469*c21a3776SVikash Gupta   val = isConstantOrConstantSplatVectorFP(*MIList[4], *MRI).value();
470*c21a3776SVikash Gupta   EXPECT_EQ(2.0, val.convertToFloat());
471*c21a3776SVikash Gupta 
472*c21a3776SVikash Gupta   EXPECT_FALSE(isConstantOrConstantSplatVectorFP(*MIList[5], *MRI).has_value());
473*c21a3776SVikash Gupta 
474*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[6], *MRI).has_value());
475*c21a3776SVikash Gupta   val = isConstantOrConstantSplatVectorFP(*MIList[6], *MRI).value();
476*c21a3776SVikash Gupta   EXPECT_EQ(0.03, val.convertToDouble());
477*c21a3776SVikash Gupta 
478*c21a3776SVikash Gupta   EXPECT_FALSE(isConstantOrConstantSplatVectorFP(*MIList[7], *MRI).has_value());
479*c21a3776SVikash Gupta 
480*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[8], *MRI).has_value());
481*c21a3776SVikash Gupta   val = isConstantOrConstantSplatVectorFP(*MIList[8], *MRI).value();
482*c21a3776SVikash Gupta   EXPECT_EQ(2.0, val.convertToFloat());
483*c21a3776SVikash Gupta 
484*c21a3776SVikash Gupta   EXPECT_TRUE(isConstantOrConstantSplatVectorFP(*MIList[9], *MRI).has_value());
485*c21a3776SVikash Gupta   val = isConstantOrConstantSplatVectorFP(*MIList[9], *MRI).value();
486*c21a3776SVikash Gupta   EXPECT_EQ(0.03, val.convertToDouble());
487*c21a3776SVikash Gupta 
488*c21a3776SVikash Gupta   EXPECT_FALSE(
489*c21a3776SVikash Gupta       isConstantOrConstantSplatVectorFP(*MIList[10], *MRI).has_value());
490*c21a3776SVikash Gupta 
491*c21a3776SVikash Gupta   EXPECT_FALSE(
492*c21a3776SVikash Gupta       isConstantOrConstantSplatVectorFP(*MIList[11], *MRI).has_value());
493*c21a3776SVikash Gupta 
494*c21a3776SVikash Gupta   EXPECT_FALSE(
495*c21a3776SVikash Gupta       isConstantOrConstantSplatVectorFP(*MIList[12], *MRI).has_value());
496*c21a3776SVikash Gupta 
497*c21a3776SVikash Gupta   EXPECT_FALSE(
498*c21a3776SVikash Gupta       isConstantOrConstantSplatVectorFP(*MIList[13], *MRI).has_value());
499*c21a3776SVikash Gupta 
500*c21a3776SVikash Gupta   EXPECT_FALSE(
501*c21a3776SVikash Gupta       isConstantOrConstantSplatVectorFP(*MIList[14], *MRI).has_value());
502*c21a3776SVikash Gupta 
503*c21a3776SVikash Gupta   EXPECT_FALSE(
504*c21a3776SVikash Gupta       isConstantOrConstantSplatVectorFP(*MIList[15], *MRI).has_value());
505*c21a3776SVikash Gupta }
5064fb2116eSMatt Arsenault }
507