[llvm] [GlobalISel] Reject scalar sources in vector truncate combine (PR #228121)

Maksim Shelegov via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 1 09:02:44 PDT 2026


https://github.com/mshelego created https://github.com/llvm/llvm-project/pull/228121

G_UNMERGE_VALUES can have a scalar source. Calling getNumElements() on
its LLT asserts, so reject scalar sources before checking the element
count. Add a scalar regression and keep coverage for the vector combine.

>From aee62844de7461f8a99bec94adcb19c2d303059b Mon Sep 17 00:00:00 2001
From: "Shelegov, Maksim" <maksim.shelegov at intel.com>
Date: Thu, 1 Oct 2026 17:10:57 +0200
Subject: [PATCH] [GlobalISel] Reject scalar sources in vector truncate combine

G_UNMERGE_VALUES can have a scalar source. Calling getNumElements() on
its LLT asserts, so reject scalar sources before checking the element
count. Add a scalar regression and keep coverage for the vector combine.
---
 .../lib/CodeGen/GlobalISel/CombinerHelper.cpp |  3 ++
 ...legalizer-combiner-use-vector-truncate.mir | 45 +++++++++++++++++++
 2 files changed, 48 insertions(+)
 create mode 100644 llvm/test/CodeGen/AMDGPU/GlobalISel/prelegalizer-combiner-use-vector-truncate.mir

diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 849e145ed2de4..5e4efabf01c97 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -3566,6 +3566,9 @@ bool CombinerHelper::matchUseVectorTruncate(MachineInstr &MI,
   // Check the size of unmerge source
   MatchInfo = UnmergeMI->getSourceReg();
   LLT UnmergeSrcTy = MRI.getType(MatchInfo);
+  if (!UnmergeSrcTy.isVector())
+    return false;
+
   if (!DstTy.getElementCount().isKnownMultipleOf(UnmergeSrcTy.getNumElements()))
     return false;
 
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/prelegalizer-combiner-use-vector-truncate.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/prelegalizer-combiner-use-vector-truncate.mir
new file mode 100644
index 0000000000000..4e1e52b8e0afa
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/prelegalizer-combiner-use-vector-truncate.mir
@@ -0,0 +1,45 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=amdgpu9.00-amd-amdhsa -run-pass=amdgpu-prelegalizer-combiner -verify-machineinstrs -o - %s | FileCheck %s
+
+---
+name: scalar_unmerge_trunc_build_vector
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+    ; CHECK-LABEL: name: scalar_unmerge_trunc_build_vector
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %src:_(s64) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: %lo:_(s32), %hi:_(s32) = G_UNMERGE_VALUES %src(s64)
+    ; CHECK-NEXT: %t0:_(s16) = G_TRUNC %lo(s32)
+    ; CHECK-NEXT: %t1:_(s16) = G_TRUNC %hi(s32)
+    ; CHECK-NEXT: %bv:_(<2 x s16>) = G_BUILD_VECTOR %t0(s16), %t1(s16)
+    ; CHECK-NEXT: $vgpr0 = COPY %bv(<2 x s16>)
+    %src:_(s64) = COPY $vgpr0_vgpr1
+    %lo:_(s32), %hi:_(s32) = G_UNMERGE_VALUES %src(s64)
+    %t0:_(s16) = G_TRUNC %lo(s32)
+    %t1:_(s16) = G_TRUNC %hi(s32)
+    %bv:_(<2 x s16>) = G_BUILD_VECTOR %t0(s16), %t1(s16)
+    $vgpr0 = COPY %bv(<2 x s16>)
+...
+
+---
+name: vector_unmerge_trunc_build_vector
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: $vgpr0_vgpr1
+    ; CHECK-LABEL: name: vector_unmerge_trunc_build_vector
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: %src:_(<2 x s32>) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: %bv:_(<2 x s16>) = G_TRUNC %src(<2 x s32>)
+    ; CHECK-NEXT: $vgpr0 = COPY %bv(<2 x s16>)
+    %src:_(<2 x s32>) = COPY $vgpr0_vgpr1
+    %lo:_(s32), %hi:_(s32) = G_UNMERGE_VALUES %src(<2 x s32>)
+    %t0:_(s16) = G_TRUNC %lo(s32)
+    %t1:_(s16) = G_TRUNC %hi(s32)
+    %bv:_(<2 x s16>) = G_BUILD_VECTOR %t0(s16), %t1(s16)
+    $vgpr0 = COPY %bv(<2 x s16>)
+...



More information about the llvm-commits mailing list