[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