[llvm] 25bcc8c - [GlobalISel][Legalizer] Fix minScalarEltSameAsIf to handle p0 element types.

Amara Emerson via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 12 16:01:46 PDT 2022


Author: Amara Emerson
Date: 2022-09-13T00:01:37+01:00
New Revision: 25bcc8c7974e80d6d39ccd359c9b5beb09fa7694

URL: https://github.com/llvm/llvm-project/commit/25bcc8c7974e80d6d39ccd359c9b5beb09fa7694
DIFF: https://github.com/llvm/llvm-project/commit/25bcc8c7974e80d6d39ccd359c9b5beb09fa7694.diff

LOG: [GlobalISel][Legalizer] Fix minScalarEltSameAsIf to handle p0 element types.

The mutation the action generates tries to change the input type into the
element type of larger vector type. This doesn't work if the larger element
type is a vector of pointers since it creates an illegal mutation between
scalar and pointer types.

Differential Revision: https://reviews.llvm.org/D133671

Added: 
    

Modified: 
    llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
    llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
index c0cad8ff675dc..090388d107ed2 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
@@ -1040,6 +1040,8 @@ class LegalizeRuleSet {
         },
         [=](const LegalityQuery &Query) {
           LLT T = Query.Types[LargeTypeIdx];
+          if (T.isVector() && T.getElementType().isPointer())
+            T = T.changeElementType(LLT::scalar(T.getScalarSizeInBits()));
           return std::make_pair(TypeIdx, T);
         });
   }

diff  --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
index 0cce67411e220..5ff5a07902471 100644
--- a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
@@ -241,6 +241,7 @@ TEST(LegalizerInfoTest, RuleSets) {
   const LLT v2s64 = LLT::fixed_vector(2, 64);
 
   const LLT p0 = LLT::pointer(0, 32);
+  const LLT v2p0 = LLT::fixed_vector(2, p0);
   const LLT v3p0 = LLT::fixed_vector(3, p0);
   const LLT v4p0 = LLT::fixed_vector(4, p0);
 
@@ -427,6 +428,21 @@ TEST(LegalizerInfoTest, RuleSets) {
     EXPECT_ACTION(FewerElements, 0, s16,
                   LegalityQuery(G_ADD, {LLT::scalable_vector(8, 16)}));
   }
+
+  // Test minScalarEltSameAsIf
+  {
+    LegalizerInfo LI;
+    auto &LegacyInfo = LI.getLegacyLegalizerInfo();
+
+    LI.getActionDefinitionsBuilder(G_SELECT).minScalarEltSameAsIf(
+        all(isVector(0), isVector(1)), 1, 0);
+    LegacyInfo.computeTables();
+    LLT p1 = LLT::pointer(1, 32);
+    LLT v2p1 = LLT::fixed_vector(2, p1);
+
+    EXPECT_ACTION(WidenScalar, 1, v2s32, LegalityQuery(G_SELECT, {v2p0, v2s1}));
+    EXPECT_ACTION(WidenScalar, 1, v2s32, LegalityQuery(G_SELECT, {v2p1, v2s1}));
+  }
 }
 
 TEST(LegalizerInfoTest, MMOAlignment) {


        


More information about the llvm-commits mailing list