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