[llvm] [AArch64][GlobalISel] Add widenScalarOrEltToNextPow2OrMinSize for small element vector CTPOP (PR #189397)

David Green via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 30 07:48:22 PDT 2026


https://github.com/davemgreen created https://github.com/llvm/llvm-project/pull/189397

This widens small ctpoop to at least i8, preventing types like v8i4 from falling back.

>From e942981bf69ba2386530e3fb48044d1c5a9a84cc Mon Sep 17 00:00:00 2001
From: David Green <david.green at arm.com>
Date: Mon, 30 Mar 2026 15:47:03 +0100
Subject: [PATCH] [AArch64][GlobalISel] Add widenScalarOrEltToNextPow2OrMinSize
 for small element vector CTPOP

This widens small ctpoop to at least i8, preventing types like v8i4 from
falling back.
---
 .../lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp |  1 +
 llvm/test/CodeGen/AArch64/ctpop.ll                    | 11 +++++++++++
 2 files changed, 12 insertions(+)

diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 61ba8960d526b..1e769ef0c4d72 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -330,6 +330,7 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
                   {v2s64, v2s64}})
       .clampScalar(0, s32, s128)
       .widenScalarToNextPow2(0)
+      .widenScalarOrEltToNextPow2OrMinSize(0, 8)
       .minScalarEltSameAsIf(always, 1, 0)
       .maxScalarEltSameAsIf(always, 1, 0)
       .clampNumElements(0, v8s8, v16s8)
diff --git a/llvm/test/CodeGen/AArch64/ctpop.ll b/llvm/test/CodeGen/AArch64/ctpop.ll
index 24fff7506731f..9e7e5888fa6e6 100644
--- a/llvm/test/CodeGen/AArch64/ctpop.ll
+++ b/llvm/test/CodeGen/AArch64/ctpop.ll
@@ -502,6 +502,17 @@ entry:
   ret <4 x i128> %s
 }
 
+define <8 x i4> @v8i4(<8 x i4> %a) {
+; CHECK-LABEL: v8i4:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    movi v1.8b, #15
+; CHECK-NEXT:    and v0.8b, v0.8b, v1.8b
+; CHECK-NEXT:    cnt v0.8b, v0.8b
+; CHECK-NEXT:    ret
+  %r = call <8 x i4> @llvm.ctpop(<8 x i4> %a)
+  ret <8 x i4> %r
+}
+
 define i8 @i8(i8 %x) {
 ; CHECK-SD-LABEL: i8:
 ; CHECK-SD:       // %bb.0: // %entry



More information about the llvm-commits mailing list