[llvm] [GlobalISel][AArch64] Legalize PHIs with vectors smaller than 64-bits (PR #207356)

Ömer Sinan Ağacan via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 3 01:58:14 PDT 2026


https://github.com/osa1 created https://github.com/llvm/llvm-project/pull/207356

New negalization rule added as the last to not change legalization of small vectors in existing tests.

>From 7081cc73d924684bfdd12905600b3b45ff50c80f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=96mer=20Sinan=20A=C4=9Facan?= <omeragacan at gmail.com>
Date: Fri, 3 Jul 2026 09:12:55 +0100
Subject: [PATCH] [GlobalISel][AArch64] Legalize PHIs with vectors smaller than
 64-bits

New negalization rule added as the last to not change legalization of
small vectors in existing tests.
---
 .../AArch64/GISel/AArch64LegalizerInfo.cpp    |  3 +-
 .../AArch64/GlobalISel/legalize-phi.mir       | 61 +++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 1d08ce1312263..01268ce5c0b4a 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -158,7 +158,8 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
       .clampNumElements(0, v4s16, v8s16)
       .clampNumElements(0, v2s32, v4s32)
       .clampMaxNumElements(0, s64, 2)
-      .clampMaxNumElements(0, p0, 2);
+      .clampMaxNumElements(0, p0, 2)
+      .widenVectorEltsToVectorMinSize(0, 64);
 
   getActionDefinitionsBuilder(G_INSERT)
       .legalIf(all(typeInSet(0, {s32, s64, p0}), typeInSet(1, {s8, s16, s32}),
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-phi.mir b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-phi.mir
index a94d8cf3094f8..1831fb315328c 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/legalize-phi.mir
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/legalize-phi.mir
@@ -946,3 +946,64 @@ body:             |
     $q0 = COPY %unmerge_1(<2 x p0>)
     $q1 = COPY %unmerge_2(<2 x p0>)
     RET_ReallyLR implicit $q0, implicit $q1
+...
+---
+name:            v4s1
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-LABEL: name: v4s1
+  ; CHECK: bb.0.entry:
+  ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
+  ; CHECK-NEXT:   liveins: $d0, $w0
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(i32) = COPY $w0
+  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(<4 x i16>) = COPY $d0
+  ; CHECK-NEXT:   [[C:%[0-9]+]]:_(i8) = G_CONSTANT i8 0
+  ; CHECK-NEXT:   [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 1
+  ; CHECK-NEXT:   [[XOR:%[0-9]+]]:_(i32) = G_XOR [[COPY]], [[C1]]
+  ; CHECK-NEXT:   [[AND:%[0-9]+]]:_(i32) = G_AND [[XOR]], [[C1]]
+  ; CHECK-NEXT:   G_BRCOND [[AND]](i32), %bb.2
+  ; CHECK-NEXT:   G_BR %bb.1
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.1:
+  ; CHECK-NEXT:   [[PHI:%[0-9]+]]:_(<4 x i16>) = G_PHI %46(<4 x i16>), %bb.2, [[COPY1]](<4 x i16>), %bb.0
+  ; CHECK-NEXT:   $d0 = COPY [[PHI]](<4 x i16>)
+  ; CHECK-NEXT:   RET_ReallyLR implicit $d0
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT: bb.2:
+  ; CHECK-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-NEXT: {{  $}}
+  ; CHECK-NEXT:   [[DEF:%[0-9]+]]:_(i8) = G_IMPLICIT_DEF
+  ; CHECK-NEXT:   [[BUILD_VECTOR:%[0-9]+]]:_(<8 x i8>) = G_BUILD_VECTOR [[C]](i8), [[C]](i8), [[C]](i8), [[C]](i8), [[DEF]](i8), [[DEF]](i8), [[DEF]](i8), [[DEF]](i8)
+  ; CHECK-NEXT:   [[ANYEXT:%[0-9]+]]:_(<8 x i16>) = G_ANYEXT [[BUILD_VECTOR]](<8 x i8>)
+  ; CHECK-NEXT:   [[UV:%[0-9]+]]:_(<4 x i16>), [[UV1:%[0-9]+]]:_(<4 x i16>) = G_UNMERGE_VALUES [[ANYEXT]](<8 x i16>)
+  ; CHECK-NEXT:   G_BR %bb.1
+  bb.1.entry:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+    liveins: $d0, $w0
+
+    %3:_(i32) = COPY $w0
+    %2:_(i8) = G_TRUNC %3(i32)
+    %4:_(<4 x i16>) = COPY $d0
+    %1:_(<4 x i1>) = G_TRUNC %4(<4 x i16>)
+    %5:_(i8) = G_ASSERT_ZEXT %2, 1
+    %0:_(i1) = G_TRUNC %5(i8)
+    %8:_(i1) = G_CONSTANT i1 false
+    %7:_(<4 x i1>) = G_BUILD_VECTOR %8(i1), %8(i1), %8(i1), %8(i1)
+    %11:_(i1) = G_CONSTANT i1 true
+    %12:_(i1) = G_XOR %0, %11
+    G_BRCOND %12(i1), %bb.3
+    G_BR %bb.2
+
+  bb.2:
+    %9:_(<4 x i1>) = G_PHI %7(<4 x i1>), %bb.3, %1(<4 x i1>), %bb.1
+    %10:_(<4 x i16>) = G_ANYEXT %9(<4 x i1>)
+    $d0 = COPY %10(<4 x i16>)
+    RET_ReallyLR implicit $d0
+
+  bb.3:
+    successors: %bb.2(0x80000000)
+
+    G_BR %bb.2
+...



More information about the llvm-commits mailing list