[llvm] [GlobalISel] Compare element sizes in minScalarSameAs/maxScalarSameAs (PR #223945)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 16 01:11:02 PDT 2026


https://github.com/pkuyo updated https://github.com/llvm/llvm-project/pull/223945

>From 980f9751ffaf3e8db7299cdb428f8605abc921a9 Mon Sep 17 00:00:00 2001
From: Pkuyo <miku_mi at foxmail.com>
Date: Tue, 15 Sep 2026 23:53:33 -0700
Subject: [PATCH 1/2] [GlobalISel] Compare element sizes in
 minScalarSameAs/maxScalarSameAs

---
 .../llvm/CodeGen/GlobalISel/LegalizerInfo.h   |  4 +-
 .../X86/GlobalISel/legalize-ctpop-vec.mir     | 70 +++++++++++++++++++
 .../CodeGen/GlobalISel/LegalizerInfoTest.cpp  | 24 +++++++
 3 files changed, 96 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/X86/GlobalISel/legalize-ctpop-vec.mir

diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
index cbfe8146a70f8..7f835ebc6bbdc 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizerInfo.h
@@ -1165,7 +1165,7 @@ class LegalizeRuleSet {
         LegalizeAction::WidenScalar,
         [=](const LegalityQuery &Query) {
           return Query.Types[LargeTypeIdx].getScalarSizeInBits() >
-                 Query.Types[TypeIdx].getSizeInBits();
+                 Query.Types[TypeIdx].getScalarSizeInBits();
         },
         LegalizeMutations::changeElementSizeTo(TypeIdx, LargeTypeIdx));
   }
@@ -1177,7 +1177,7 @@ class LegalizeRuleSet {
         LegalizeAction::NarrowScalar,
         [=](const LegalityQuery &Query) {
           return Query.Types[NarrowTypeIdx].getScalarSizeInBits() <
-                 Query.Types[TypeIdx].getSizeInBits();
+                 Query.Types[TypeIdx].getScalarSizeInBits();
         },
         LegalizeMutations::changeElementSizeTo(TypeIdx, NarrowTypeIdx));
   }
diff --git a/llvm/test/CodeGen/X86/GlobalISel/legalize-ctpop-vec.mir b/llvm/test/CodeGen/X86/GlobalISel/legalize-ctpop-vec.mir
new file mode 100644
index 0000000000000..913a420922ba7
--- /dev/null
+++ b/llvm/test/CodeGen/X86/GlobalISel/legalize-ctpop-vec.mir
@@ -0,0 +1,70 @@
+# RUN: llc -mtriple=x86_64-linux-gnu -run-pass=legalizer -global-isel-abort=2 -pass-remarks-missed='gisel*' %s -o - 2>%t | FileCheck %s
+# RUN: FileCheck -check-prefix=ILLEGAL %s < %t
+
+# Regression test for #220802
+
+# ILLEGAL: remark: <unknown>:0:0: unable to legalize instruction: %1:_(<4 x s32>) = G_CTPOP %0:_(<4 x s32>) (in function: test_ctpop_v4i32)
+# ILLEGAL: remark: <unknown>:0:0: unable to legalize instruction: %1:_(<4 x s32>) = G_CTLZ %0:_(<4 x s32>) (in function: test_ctlz_v4i32)
+# ILLEGAL: remark: <unknown>:0:0: unable to legalize instruction: %1:_(<4 x s32>) = G_CTTZ_ZERO_POISON %0:_(<4 x s32>) (in function: test_cttz_zero_poison_v4i32)
+# ILLEGAL: remark: <unknown>:0:0: unable to legalize instruction: %1:_(<4 x s32>) = G_CTTZ %0:_(<4 x s32>) (in function: test_cttz_v4i32)
+
+---
+name:            test_ctpop_v4i32
+tracksRegLiveness: true
+body:             |
+  bb.1:
+    ; CHECK-LABEL: name: test_ctpop_v4i32
+    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
+    ; CHECK-NEXT: [[CTPOP:%[0-9]+]]:_(<4 x s32>) = G_CTPOP [[DEF]](<4 x s32>)
+    ; CHECK-NEXT: $xmm0 = COPY [[CTPOP]](<4 x s32>)
+    ; CHECK-NEXT: RET 0, implicit $xmm0
+    %0:_(<4 x s32>) = G_IMPLICIT_DEF
+    %1:_(<4 x s32>) = G_CTPOP %0
+    $xmm0 = COPY %1(<4 x s32>)
+    RET 0, implicit $xmm0
+...
+---
+name:            test_ctlz_v4i32
+tracksRegLiveness: true
+body:             |
+  bb.1:
+    ; CHECK-LABEL: name: test_ctlz_v4i32
+    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
+    ; CHECK-NEXT: [[CTLZ:%[0-9]+]]:_(<4 x s32>) = G_CTLZ [[DEF]](<4 x s32>)
+    ; CHECK-NEXT: $xmm0 = COPY [[CTLZ]](<4 x s32>)
+    ; CHECK-NEXT: RET 0, implicit $xmm0
+    %0:_(<4 x s32>) = G_IMPLICIT_DEF
+    %1:_(<4 x s32>) = G_CTLZ %0
+    $xmm0 = COPY %1(<4 x s32>)
+    RET 0, implicit $xmm0
+...
+---
+name:            test_cttz_zero_poison_v4i32
+tracksRegLiveness: true
+body:             |
+  bb.1:
+    ; CHECK-LABEL: name: test_cttz_zero_poison_v4i32
+    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
+    ; CHECK-NEXT: [[CTTZ_ZERO_POISON:%[0-9]+]]:_(<4 x s32>) = G_CTTZ_ZERO_POISON [[DEF]](<4 x s32>)
+    ; CHECK-NEXT: $xmm0 = COPY [[CTTZ_ZERO_POISON]](<4 x s32>)
+    ; CHECK-NEXT: RET 0, implicit $xmm0
+    %0:_(<4 x s32>) = G_IMPLICIT_DEF
+    %1:_(<4 x s32>) = G_CTTZ_ZERO_POISON %0
+    $xmm0 = COPY %1(<4 x s32>)
+    RET 0, implicit $xmm0
+...
+---
+name:            test_cttz_v4i32
+tracksRegLiveness: true
+body:             |
+  bb.1:
+    ; CHECK-LABEL: name: test_cttz_v4i32
+    ; CHECK: [[DEF:%[0-9]+]]:_(<4 x s32>) = G_IMPLICIT_DEF
+    ; CHECK-NEXT: [[CTTZ:%[0-9]+]]:_(<4 x s32>) = G_CTTZ [[DEF]](<4 x s32>)
+    ; CHECK-NEXT: $xmm0 = COPY [[CTTZ]](<4 x s32>)
+    ; CHECK-NEXT: RET 0, implicit $xmm0
+    %0:_(<4 x s32>) = G_IMPLICIT_DEF
+    %1:_(<4 x s32>) = G_CTTZ %0
+    $xmm0 = COPY %1(<4 x s32>)
+    RET 0, implicit $xmm0
+...
diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
index 8b75ca8ee4a1d..0ef6532c629e3 100644
--- a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
@@ -273,6 +273,30 @@ TEST(LegalizerInfoTest, RuleSets) {
     EXPECT_ACTION(WidenScalar, 1, v2s32, LegalityQuery(G_SELECT, {v2p1, v2s1}));
   }
 
+  // Test maxScalarSameAs
+  {
+    LegalizerInfo LI;
+
+    LI.getActionDefinitionsBuilder(G_CTPOP).maxScalarSameAs(0, 1);
+
+    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_CTPOP, {v4s32, v4s32}));
+    EXPECT_ACTION(NarrowScalar, 0, v2s16,
+                  LegalityQuery(G_CTPOP, {v2s32, v2s16}));
+    EXPECT_ACTION(NarrowScalar, 0, s16, LegalityQuery(G_CTPOP, {s32, s16}));
+  }
+
+  // Test minScalarSameAs
+  {
+    LegalizerInfo LI;
+
+    LI.getActionDefinitionsBuilder(G_CTPOP).minScalarSameAs(0, 1);
+
+    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_CTPOP, {v4s32, v4s32}));
+    EXPECT_ACTION(WidenScalar, 0, v2s32,
+                  LegalityQuery(G_CTPOP, {v2s16, v2s32}));
+    EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_CTPOP, {s16, s32}));
+  }
+
   // Test immIs
   {
     LegalizerInfo LI;

>From 54dc1b2278a236d695fd0361d1ceee8e4cc0aea7 Mon Sep 17 00:00:00 2001
From: Pkuyo <miku_mi at foxmail.com>
Date: Wed, 16 Sep 2026 01:10:45 -0700
Subject: [PATCH 2/2] format fix

---
 llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
index 0ef6532c629e3..2d37b563b653c 100644
--- a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
@@ -279,7 +279,8 @@ TEST(LegalizerInfoTest, RuleSets) {
 
     LI.getActionDefinitionsBuilder(G_CTPOP).maxScalarSameAs(0, 1);
 
-    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_CTPOP, {v4s32, v4s32}));
+    EXPECT_ACTION(Unsupported, 0, LLT(),
+                  LegalityQuery(G_CTPOP, {v4s32, v4s32}));
     EXPECT_ACTION(NarrowScalar, 0, v2s16,
                   LegalityQuery(G_CTPOP, {v2s32, v2s16}));
     EXPECT_ACTION(NarrowScalar, 0, s16, LegalityQuery(G_CTPOP, {s32, s16}));
@@ -291,7 +292,8 @@ TEST(LegalizerInfoTest, RuleSets) {
 
     LI.getActionDefinitionsBuilder(G_CTPOP).minScalarSameAs(0, 1);
 
-    EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_CTPOP, {v4s32, v4s32}));
+    EXPECT_ACTION(Unsupported, 0, LLT(),
+                  LegalityQuery(G_CTPOP, {v4s32, v4s32}));
     EXPECT_ACTION(WidenScalar, 0, v2s32,
                   LegalityQuery(G_CTPOP, {v2s16, v2s32}));
     EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_CTPOP, {s16, s32}));



More information about the llvm-commits mailing list