xref: /llvm-project/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp (revision 91be65be656072a68b51a8c4e7bb751ea475d896)
169fa84a6STim Northover //===- llvm/unittest/CodeGen/GlobalISel/LegalizerInfoTest.cpp -------------===//
269fa84a6STim Northover //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
669fa84a6STim Northover //
769fa84a6STim Northover //===----------------------------------------------------------------------===//
869fa84a6STim Northover 
969fa84a6STim Northover #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
10b3bde2eaSDavid Blaikie #include "llvm/CodeGen/TargetOpcodes.h"
11b3e86709SMatt Arsenault #include "GISelMITest.h"
1269fa84a6STim Northover #include "gtest/gtest.h"
1369fa84a6STim Northover 
1469fa84a6STim Northover using namespace llvm;
159ade5592SDaniel Sanders using namespace LegalizeActions;
1669fa84a6STim Northover 
1769fa84a6STim Northover // Define a couple of pretty printers to help debugging when things go wrong.
1869fa84a6STim Northover namespace llvm {
1969fa84a6STim Northover std::ostream &
209ade5592SDaniel Sanders operator<<(std::ostream &OS, const LegalizeAction Act) {
2169fa84a6STim Northover   switch (Act) {
229ade5592SDaniel Sanders   case Lower: OS << "Lower"; break;
239ade5592SDaniel Sanders   case Legal: OS << "Legal"; break;
249ade5592SDaniel Sanders   case NarrowScalar: OS << "NarrowScalar"; break;
259ade5592SDaniel Sanders   case WidenScalar:  OS << "WidenScalar"; break;
269ade5592SDaniel Sanders   case FewerElements:  OS << "FewerElements"; break;
279ade5592SDaniel Sanders   case MoreElements:  OS << "MoreElements"; break;
289ade5592SDaniel Sanders   case Libcall: OS << "Libcall"; break;
299ade5592SDaniel Sanders   case Custom: OS << "Custom"; break;
309ade5592SDaniel Sanders   case Unsupported: OS << "Unsupported"; break;
31760e113aSDaniel Sanders   case NotFound: OS << "NotFound"; break;
3279cb839fSDaniel Sanders   case UseLegacyRules: OS << "UseLegacyRules"; break;
3369fa84a6STim Northover   }
3469fa84a6STim Northover   return OS;
3569fa84a6STim Northover }
3669fa84a6STim Northover 
3707238286SMatt Arsenault std::ostream &operator<<(std::ostream &OS, const llvm::LegalizeActionStep Ty) {
3807238286SMatt Arsenault   OS << "LegalizeActionStep(" << Ty.Action << ", " << Ty.TypeIdx << ", "
3907238286SMatt Arsenault      << Ty.NewType << ')';
4007238286SMatt Arsenault   return OS;
4107238286SMatt Arsenault }
4269fa84a6STim Northover }
4369fa84a6STim Northover 
4469fa84a6STim Northover namespace {
4569fa84a6STim Northover 
4669fa84a6STim Northover 
4769fa84a6STim Northover TEST(LegalizerInfoTest, ScalarRISC) {
4869fa84a6STim Northover   using namespace TargetOpcode;
4969fa84a6STim Northover   LegalizerInfo L;
5069fa84a6STim Northover   // Typical RISCy set of operations based on AArch64.
51d5b7a00fSKristof Beyls   for (unsigned Op : {G_ADD, G_SUB}) {
52af9814a1SKristof Beyls     for (unsigned Size : {32, 64})
539ade5592SDaniel Sanders       L.setAction({Op, 0, LLT::scalar(Size)}, Legal);
54af9814a1SKristof Beyls     L.setLegalizeScalarToDifferentSizeStrategy(
55af9814a1SKristof Beyls         Op, 0, LegalizerInfo::widenToLargerTypesAndNarrowToLargest);
56af9814a1SKristof Beyls   }
57af9814a1SKristof Beyls 
5869fa84a6STim Northover   L.computeTables();
5969fa84a6STim Northover 
60d5b7a00fSKristof Beyls   for (unsigned opcode : {G_ADD, G_SUB}) {
6169fa84a6STim Northover     // Check we infer the correct types and actually do what we're told.
62b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(8)}}),
6379cb839fSDaniel Sanders               LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
64b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(16)}}),
6579cb839fSDaniel Sanders               LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
66b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(32)}}),
6779cb839fSDaniel Sanders               LegalizeActionStep(Legal, 0, LLT{}));
68b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(64)}}),
6979cb839fSDaniel Sanders               LegalizeActionStep(Legal, 0, LLT{}));
7069fa84a6STim Northover 
7169fa84a6STim Northover     // Make sure the default for over-sized types applies.
72b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(128)}}),
7379cb839fSDaniel Sanders               LegalizeActionStep(NarrowScalar, 0, LLT::scalar(64)));
74af9814a1SKristof Beyls     // Make sure we also handle unusual sizes
75b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(1)}}),
7679cb839fSDaniel Sanders               LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
77b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(31)}}),
7879cb839fSDaniel Sanders               LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
79b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(33)}}),
8079cb839fSDaniel Sanders               LegalizeActionStep(WidenScalar, 0, LLT::scalar(64)));
81b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(63)}}),
8279cb839fSDaniel Sanders               LegalizeActionStep(WidenScalar, 0, LLT::scalar(64)));
83b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({opcode, {LLT::scalar(65)}}),
8479cb839fSDaniel Sanders               LegalizeActionStep(NarrowScalar, 0, LLT::scalar(64)));
85af9814a1SKristof Beyls   }
8669fa84a6STim Northover }
8769fa84a6STim Northover 
8869fa84a6STim Northover TEST(LegalizerInfoTest, VectorRISC) {
8969fa84a6STim Northover   using namespace TargetOpcode;
9069fa84a6STim Northover   LegalizerInfo L;
9169fa84a6STim Northover   // Typical RISCy set of operations based on ARM.
929ade5592SDaniel Sanders   L.setAction({G_ADD, LLT::vector(8, 8)}, Legal);
939ade5592SDaniel Sanders   L.setAction({G_ADD, LLT::vector(16, 8)}, Legal);
949ade5592SDaniel Sanders   L.setAction({G_ADD, LLT::vector(4, 16)}, Legal);
959ade5592SDaniel Sanders   L.setAction({G_ADD, LLT::vector(8, 16)}, Legal);
969ade5592SDaniel Sanders   L.setAction({G_ADD, LLT::vector(2, 32)}, Legal);
979ade5592SDaniel Sanders   L.setAction({G_ADD, LLT::vector(4, 32)}, Legal);
98af9814a1SKristof Beyls 
99af9814a1SKristof Beyls   L.setLegalizeVectorElementToDifferentSizeStrategy(
100af9814a1SKristof Beyls       G_ADD, 0, LegalizerInfo::widenToLargerTypesUnsupportedOtherwise);
101af9814a1SKristof Beyls 
1029ade5592SDaniel Sanders   L.setAction({G_ADD, 0, LLT::scalar(32)}, Legal);
103af9814a1SKristof Beyls 
10469fa84a6STim Northover   L.computeTables();
10569fa84a6STim Northover 
10669fa84a6STim Northover   // Check we infer the correct types and actually do what we're told for some
10769fa84a6STim Northover   // simple cases.
108b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(8, 8)}}),
10979cb839fSDaniel Sanders             LegalizeActionStep(Legal, 0, LLT{}));
110b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(8, 7)}}),
11179cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::vector(8, 8)));
112b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(2, 8)}}),
11379cb839fSDaniel Sanders             LegalizeActionStep(MoreElements, 0, LLT::vector(8, 8)));
114b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(8, 32)}}),
11579cb839fSDaniel Sanders             LegalizeActionStep(FewerElements, 0, LLT::vector(4, 32)));
116af9814a1SKristof Beyls   // Check a few non-power-of-2 sizes:
117b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(3, 3)}}),
11879cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::vector(3, 8)));
119b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(3, 8)}}),
12079cb839fSDaniel Sanders             LegalizeActionStep(MoreElements, 0, LLT::vector(8, 8)));
12169fa84a6STim Northover }
12269fa84a6STim Northover 
12369fa84a6STim Northover TEST(LegalizerInfoTest, MultipleTypes) {
12469fa84a6STim Northover   using namespace TargetOpcode;
12569fa84a6STim Northover   LegalizerInfo L;
12669fa84a6STim Northover   LLT p0 = LLT::pointer(0, 64);
12769fa84a6STim Northover   LLT s64 = LLT::scalar(64);
12869fa84a6STim Northover 
12969fa84a6STim Northover   // Typical RISCy set of operations based on AArch64.
1309ade5592SDaniel Sanders   L.setAction({G_PTRTOINT, 0, s64}, Legal);
1319ade5592SDaniel Sanders   L.setAction({G_PTRTOINT, 1, p0}, Legal);
13269fa84a6STim Northover 
133af9814a1SKristof Beyls   L.setLegalizeScalarToDifferentSizeStrategy(
134af9814a1SKristof Beyls       G_PTRTOINT, 0, LegalizerInfo::widenToLargerTypesAndNarrowToLargest);
135af9814a1SKristof Beyls 
13669fa84a6STim Northover   L.computeTables();
13769fa84a6STim Northover 
13869fa84a6STim Northover   // Check we infer the correct types and actually do what we're told.
139b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_PTRTOINT, {s64, p0}}),
14079cb839fSDaniel Sanders             LegalizeActionStep(Legal, 0, LLT{}));
141262ed0ecSDaniel Sanders 
142af9814a1SKristof Beyls   // Make sure we also handle unusual sizes
143b3e86709SMatt Arsenault   EXPECT_EQ(
144262ed0ecSDaniel Sanders       L.getAction({G_PTRTOINT, {LLT::scalar(65), s64}}),
14579cb839fSDaniel Sanders       LegalizeActionStep(NarrowScalar, 0, s64));
146b3e86709SMatt Arsenault   EXPECT_EQ(
1479ade5592SDaniel Sanders       L.getAction({G_PTRTOINT, {s64, LLT::pointer(0, 32)}}),
14879cb839fSDaniel Sanders       LegalizeActionStep(Unsupported, 1, LLT::pointer(0, 32)));
14969fa84a6STim Northover }
150b539ea53SKristof Beyls 
151b539ea53SKristof Beyls TEST(LegalizerInfoTest, MultipleSteps) {
152b539ea53SKristof Beyls   using namespace TargetOpcode;
153b539ea53SKristof Beyls   LegalizerInfo L;
154b539ea53SKristof Beyls   LLT s32 = LLT::scalar(32);
155b539ea53SKristof Beyls   LLT s64 = LLT::scalar(64);
156b539ea53SKristof Beyls 
157af9814a1SKristof Beyls   L.setLegalizeScalarToDifferentSizeStrategy(
158af9814a1SKristof Beyls       G_UREM, 0, LegalizerInfo::widenToLargerTypesUnsupportedOtherwise);
1599ade5592SDaniel Sanders   L.setAction({G_UREM, 0, s32}, Lower);
1609ade5592SDaniel Sanders   L.setAction({G_UREM, 0, s64}, Lower);
161b539ea53SKristof Beyls 
162b539ea53SKristof Beyls   L.computeTables();
163b539ea53SKristof Beyls 
164b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(16)}}),
16579cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
166b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(32)}}),
16779cb839fSDaniel Sanders             LegalizeActionStep(Lower, 0, LLT::scalar(32)));
168b539ea53SKristof Beyls }
169af9814a1SKristof Beyls 
170af9814a1SKristof Beyls TEST(LegalizerInfoTest, SizeChangeStrategy) {
171af9814a1SKristof Beyls   using namespace TargetOpcode;
172af9814a1SKristof Beyls   LegalizerInfo L;
173af9814a1SKristof Beyls   for (unsigned Size : {1, 8, 16, 32})
1749ade5592SDaniel Sanders     L.setAction({G_UREM, 0, LLT::scalar(Size)}, Legal);
175af9814a1SKristof Beyls 
176af9814a1SKristof Beyls   L.setLegalizeScalarToDifferentSizeStrategy(
177af9814a1SKristof Beyls       G_UREM, 0, LegalizerInfo::widenToLargerTypesUnsupportedOtherwise);
178af9814a1SKristof Beyls   L.computeTables();
179af9814a1SKristof Beyls 
180af9814a1SKristof Beyls   // Check we infer the correct types and actually do what we're told.
181af9814a1SKristof Beyls   for (unsigned Size : {1, 8, 16, 32}) {
182b3e86709SMatt Arsenault     EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(Size)}}),
18379cb839fSDaniel Sanders               LegalizeActionStep(Legal, 0, LLT{}));
184af9814a1SKristof Beyls   }
185b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(2)}}),
18679cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::scalar(8)));
187b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(7)}}),
18879cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::scalar(8)));
189b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(9)}}),
19079cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::scalar(16)));
191b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(17)}}),
19279cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
193b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(31)}}),
19479cb839fSDaniel Sanders             LegalizeActionStep(WidenScalar, 0, LLT::scalar(32)));
195b3e86709SMatt Arsenault   EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(33)}}),
19679cb839fSDaniel Sanders             LegalizeActionStep(Unsupported, 0, LLT::scalar(33)));
197af9814a1SKristof Beyls }
19869fa84a6STim Northover }
19907238286SMatt Arsenault 
20007238286SMatt Arsenault #define EXPECT_ACTION(Action, Index, Type, Query)                              \
20107238286SMatt Arsenault   do {                                                                         \
20207238286SMatt Arsenault     auto A = LI.getAction(Query);                                              \
20307238286SMatt Arsenault     EXPECT_EQ(LegalizeActionStep(Action, Index, Type), A) << A;                \
20407238286SMatt Arsenault   } while (0)
20507238286SMatt Arsenault 
20607238286SMatt Arsenault TEST(LegalizerInfoTest, RuleSets) {
20707238286SMatt Arsenault   using namespace TargetOpcode;
20807238286SMatt Arsenault 
209*91be65beSMatt Arsenault   const LLT s5 = LLT::scalar(5);
210*91be65beSMatt Arsenault   const LLT s8 = LLT::scalar(8);
211*91be65beSMatt Arsenault   const LLT s16 = LLT::scalar(16);
21207238286SMatt Arsenault   const LLT s32 = LLT::scalar(32);
213*91be65beSMatt Arsenault   const LLT s33 = LLT::scalar(33);
214*91be65beSMatt Arsenault   const LLT s64 = LLT::scalar(64);
21507238286SMatt Arsenault 
216*91be65beSMatt Arsenault   const LLT v2s5 = LLT::vector(2, 5);
217*91be65beSMatt Arsenault   const LLT v2s8 = LLT::vector(2, 8);
218*91be65beSMatt Arsenault   const LLT v2s16 = LLT::vector(2, 16);
21907238286SMatt Arsenault   const LLT v2s32 = LLT::vector(2, 32);
22007238286SMatt Arsenault   const LLT v3s32 = LLT::vector(3, 32);
22107238286SMatt Arsenault   const LLT v4s32 = LLT::vector(4, 32);
222*91be65beSMatt Arsenault   const LLT v2s33 = LLT::vector(2, 33);
223*91be65beSMatt Arsenault   const LLT v2s64 = LLT::vector(2, 64);
22407238286SMatt Arsenault 
22507238286SMatt Arsenault   const LLT p0 = LLT::pointer(0, 32);
22607238286SMatt Arsenault   const LLT v3p0 = LLT::vector(3, p0);
22707238286SMatt Arsenault   const LLT v4p0 = LLT::vector(4, p0);
22807238286SMatt Arsenault 
22907238286SMatt Arsenault   {
23007238286SMatt Arsenault     LegalizerInfo LI;
23107238286SMatt Arsenault 
23207238286SMatt Arsenault     LI.getActionDefinitionsBuilder(G_IMPLICIT_DEF)
23307238286SMatt Arsenault       .legalFor({v4s32, v4p0})
23407238286SMatt Arsenault       .moreElementsToNextPow2(0);
23507238286SMatt Arsenault     LI.computeTables();
23607238286SMatt Arsenault 
23707238286SMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_IMPLICIT_DEF, {s32}));
23807238286SMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_IMPLICIT_DEF, {v2s32}));
23907238286SMatt Arsenault     EXPECT_ACTION(MoreElements, 0, v4p0, LegalityQuery(G_IMPLICIT_DEF, {v3p0}));
24007238286SMatt Arsenault     EXPECT_ACTION(MoreElements, 0, v4s32, LegalityQuery(G_IMPLICIT_DEF, {v3s32}));
24107238286SMatt Arsenault   }
242*91be65beSMatt Arsenault 
243*91be65beSMatt Arsenault   // Test minScalarOrElt
244*91be65beSMatt Arsenault   {
245*91be65beSMatt Arsenault     LegalizerInfo LI;
246*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_OR)
247*91be65beSMatt Arsenault       .legalFor({s32})
248*91be65beSMatt Arsenault       .minScalarOrElt(0, s32);
249*91be65beSMatt Arsenault     LI.computeTables();
250*91be65beSMatt Arsenault 
251*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_OR, {s16}));
252*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, v2s32, LegalityQuery(G_OR, {v2s16}));
253*91be65beSMatt Arsenault   }
254*91be65beSMatt Arsenault 
255*91be65beSMatt Arsenault   // Test maxScalarOrELt
256*91be65beSMatt Arsenault   {
257*91be65beSMatt Arsenault     LegalizerInfo LI;
258*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_AND)
259*91be65beSMatt Arsenault       .legalFor({s16})
260*91be65beSMatt Arsenault       .maxScalarOrElt(0, s16);
261*91be65beSMatt Arsenault     LI.computeTables();
262*91be65beSMatt Arsenault 
263*91be65beSMatt Arsenault     EXPECT_ACTION(NarrowScalar, 0, s16, LegalityQuery(G_AND, {s32}));
264*91be65beSMatt Arsenault     EXPECT_ACTION(NarrowScalar, 0, v2s16, LegalityQuery(G_AND, {v2s32}));
265*91be65beSMatt Arsenault   }
266*91be65beSMatt Arsenault 
267*91be65beSMatt Arsenault   // Test clampScalarOrElt
268*91be65beSMatt Arsenault   {
269*91be65beSMatt Arsenault     LegalizerInfo LI;
270*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_XOR)
271*91be65beSMatt Arsenault       .legalFor({s16})
272*91be65beSMatt Arsenault       .clampScalarOrElt(0, s16, s32);
273*91be65beSMatt Arsenault     LI.computeTables();
274*91be65beSMatt Arsenault 
275*91be65beSMatt Arsenault     EXPECT_ACTION(NarrowScalar, 0, s32, LegalityQuery(G_XOR, {s64}));
276*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s16, LegalityQuery(G_XOR, {s8}));
277*91be65beSMatt Arsenault 
278*91be65beSMatt Arsenault     // Make sure the number of elements is preserved.
279*91be65beSMatt Arsenault     EXPECT_ACTION(NarrowScalar, 0, v2s32, LegalityQuery(G_XOR, {v2s64}));
280*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, v2s16, LegalityQuery(G_XOR, {v2s8}));
281*91be65beSMatt Arsenault   }
282*91be65beSMatt Arsenault 
283*91be65beSMatt Arsenault   // Test minScalar
284*91be65beSMatt Arsenault   {
285*91be65beSMatt Arsenault     LegalizerInfo LI;
286*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_OR)
287*91be65beSMatt Arsenault       .legalFor({s32})
288*91be65beSMatt Arsenault       .minScalar(0, s32);
289*91be65beSMatt Arsenault     LI.computeTables();
290*91be65beSMatt Arsenault 
291*91be65beSMatt Arsenault     // Only handle scalars, ignore vectors.
292*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_OR, {s16}));
293*91be65beSMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_OR, {v2s16}));
294*91be65beSMatt Arsenault   }
295*91be65beSMatt Arsenault 
296*91be65beSMatt Arsenault   // Test maxScalar
297*91be65beSMatt Arsenault   {
298*91be65beSMatt Arsenault     LegalizerInfo LI;
299*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_AND)
300*91be65beSMatt Arsenault       .legalFor({s16})
301*91be65beSMatt Arsenault       .maxScalar(0, s16);
302*91be65beSMatt Arsenault     LI.computeTables();
303*91be65beSMatt Arsenault 
304*91be65beSMatt Arsenault     // Only handle scalars, ignore vectors.
305*91be65beSMatt Arsenault     EXPECT_ACTION(NarrowScalar, 0, s16, LegalityQuery(G_AND, {s32}));
306*91be65beSMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_AND, {v2s32}));
307*91be65beSMatt Arsenault   }
308*91be65beSMatt Arsenault 
309*91be65beSMatt Arsenault   // Test clampScalar
310*91be65beSMatt Arsenault   {
311*91be65beSMatt Arsenault     LegalizerInfo LI;
312*91be65beSMatt Arsenault 
313*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_XOR)
314*91be65beSMatt Arsenault       .legalFor({s16})
315*91be65beSMatt Arsenault       .clampScalar(0, s16, s32);
316*91be65beSMatt Arsenault     LI.computeTables();
317*91be65beSMatt Arsenault 
318*91be65beSMatt Arsenault     EXPECT_ACTION(NarrowScalar, 0, s32, LegalityQuery(G_XOR, {s64}));
319*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s16, LegalityQuery(G_XOR, {s8}));
320*91be65beSMatt Arsenault 
321*91be65beSMatt Arsenault     // Only handle scalars, ignore vectors.
322*91be65beSMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_XOR, {v2s64}));
323*91be65beSMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_XOR, {v2s8}));
324*91be65beSMatt Arsenault   }
325*91be65beSMatt Arsenault 
326*91be65beSMatt Arsenault   // Test widenScalarOrEltToNextPow2
327*91be65beSMatt Arsenault   {
328*91be65beSMatt Arsenault     LegalizerInfo LI;
329*91be65beSMatt Arsenault 
330*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_AND)
331*91be65beSMatt Arsenault       .legalFor({s32})
332*91be65beSMatt Arsenault       .widenScalarOrEltToNextPow2(0, 32);
333*91be65beSMatt Arsenault     LI.computeTables();
334*91be65beSMatt Arsenault 
335*91be65beSMatt Arsenault     // Handle scalars and vectors
336*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_AND, {s5}));
337*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, v2s32, LegalityQuery(G_AND, {v2s5}));
338*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s64, LegalityQuery(G_AND, {s33}));
339*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, v2s64, LegalityQuery(G_AND, {v2s33}));
340*91be65beSMatt Arsenault   }
341*91be65beSMatt Arsenault 
342*91be65beSMatt Arsenault   // Test widenScalarToNextPow2
343*91be65beSMatt Arsenault   {
344*91be65beSMatt Arsenault     LegalizerInfo LI;
345*91be65beSMatt Arsenault 
346*91be65beSMatt Arsenault     LI.getActionDefinitionsBuilder(G_AND)
347*91be65beSMatt Arsenault       .legalFor({s32})
348*91be65beSMatt Arsenault       .widenScalarToNextPow2(0, 32);
349*91be65beSMatt Arsenault     LI.computeTables();
350*91be65beSMatt Arsenault 
351*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_AND, {s5}));
352*91be65beSMatt Arsenault     EXPECT_ACTION(WidenScalar, 0, s64, LegalityQuery(G_AND, {s33}));
353*91be65beSMatt Arsenault 
354*91be65beSMatt Arsenault     // Do nothing for vectors.
355*91be65beSMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_AND, {v2s5}));
356*91be65beSMatt Arsenault     EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_AND, {v2s33}));
357*91be65beSMatt Arsenault   }
35807238286SMatt Arsenault }
359