[llvm] [GlobalISel] Combine merge-unmerge with mixed scalar and vector types (PR #213086)

Madhur Kumar via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 4 05:38:07 PDT 2026


================
@@ -1611,3 +1611,180 @@ body: |
     $vgpr0 = COPY %4
     $vgpr1 = COPY %5
 ...
+
+# Vector to integer unmerge + merge combine tests.
+# G_UNMERGE_VALUES of a vector feeding G_MERGE_VALUES into an integer
+# should fold to direct G_UNMERGE_VALUES of the source vector.
+
+---
+name: vector_to_integer_merge_values
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: vector_to_integer_merge_values
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(i32), [[UV1:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<4 x i16>)
+    ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(i32), [[UV3:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<4 x i16>)
+    ; CHECK-NEXT: $vgpr0 = COPY [[UV]](i32)
+    ; CHECK-NEXT: $vgpr1 = COPY [[UV3]](i32)
+    %0:_(<4 x i16>) = COPY $vgpr0_vgpr1
+    %1:_(i16), %2:_(i16), %3:_(i16), %4:_(i16) = G_UNMERGE_VALUES %0:_(<4 x i16>)
+    %5:_(i32) = G_MERGE_VALUES %1:_(i16), %2:_(i16)
+    %6:_(i32) = G_MERGE_VALUES %3:_(i16), %4:_(i16)
+    $vgpr0 = COPY %5:_(i32)
+    $vgpr1 = COPY %6:_(i32)
+...
+---
+name: vector_to_integer_build_vector
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: vector_to_integer_build_vector
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x i16>), [[UV1:%[0-9]+]]:_(<2 x i16>) = G_UNMERGE_VALUES [[COPY]](<4 x i16>)
+    ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x i16>), [[UV3:%[0-9]+]]:_(<2 x i16>) = G_UNMERGE_VALUES [[COPY]](<4 x i16>)
+    ; CHECK-NEXT: $vgpr0 = COPY [[UV]](<2 x i16>)
+    ; CHECK-NEXT: $vgpr1 = COPY [[UV3]](<2 x i16>)
+    %0:_(<4 x i16>) = COPY $vgpr0_vgpr1
+    %1:_(i16), %2:_(i16), %3:_(i16), %4:_(i16) = G_UNMERGE_VALUES %0:_(<4 x i16>)
+    %5:_(<2 x i16>) = G_BUILD_VECTOR %1:_(i16), %2:_(i16)
+    %6:_(<2 x i16>) = G_BUILD_VECTOR %3:_(i16), %4:_(i16)
+    $vgpr0 = COPY %5:_(<2 x i16>)
+    $vgpr1 = COPY %6:_(<2 x i16>)
+...
+---
+name: integer_to_vector_no_fold
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: integer_to_vector_no_fold
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i64) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(i32), [[UV1:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](i64)
+    ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x i32>) = G_BUILD_VECTOR [[UV]](i32), [[UV1]](i32)
+    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[BUILD_VECTOR]](<2 x i32>)
+    %0:_(i64) = COPY $vgpr0_vgpr1
+    %1:_(i32), %2:_(i32) = G_UNMERGE_VALUES %0:_(i64)
+    %3:_(<2 x i32>) = G_BUILD_VECTOR %1:_(i32), %2:_(i32)
+    $vgpr0_vgpr1 = COPY %3:_(<2 x i32>)
+...
+---
+name: equal_size_no_fold
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: equal_size_no_fold
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<2 x i32>) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(i32), [[UV1:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<2 x i32>)
+    ; CHECK-NEXT: [[MV:%[0-9]+]]:_(i64) = G_MERGE_VALUES [[UV]](i32), [[UV1]](i32)
+    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](i64)
+    %0:_(<2 x i32>) = COPY $vgpr0_vgpr1
+    %1:_(i32), %2:_(i32) = G_UNMERGE_VALUES %0:_(<2 x i32>)
+    %3:_(i64) = G_MERGE_VALUES %1:_(i32), %2:_(i32)
+    $vgpr0_vgpr1 = COPY %3:_(i64)
+...
+---
+name: vector_to_integer_eight_i16
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
+
+    ; CHECK-LABEL: name: vector_to_integer_eight_i16
+    ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x i16>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(i32), [[UV1:%[0-9]+]]:_(i32), [[UV2:%[0-9]+]]:_(i32), [[UV3:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<8 x i16>)
+    ; CHECK-NEXT: [[UV4:%[0-9]+]]:_(i32), [[UV5:%[0-9]+]]:_(i32), [[UV6:%[0-9]+]]:_(i32), [[UV7:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<8 x i16>)
+    ; CHECK-NEXT: [[UV8:%[0-9]+]]:_(i32), [[UV9:%[0-9]+]]:_(i32), [[UV10:%[0-9]+]]:_(i32), [[UV11:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<8 x i16>)
+    ; CHECK-NEXT: [[UV12:%[0-9]+]]:_(i32), [[UV13:%[0-9]+]]:_(i32), [[UV14:%[0-9]+]]:_(i32), [[UV15:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<8 x i16>)
+    ; CHECK-NEXT: $vgpr0 = COPY [[UV]](i32)
+    ; CHECK-NEXT: $vgpr1 = COPY [[UV5]](i32)
+    ; CHECK-NEXT: $vgpr2 = COPY [[UV10]](i32)
+    ; CHECK-NEXT: $vgpr3 = COPY [[UV15]](i32)
+    %0:_(<8 x i16>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
+    %1:_(i16), %2:_(i16), %3:_(i16), %4:_(i16), %5:_(i16), %6:_(i16), %7:_(i16), %8:_(i16) = G_UNMERGE_VALUES %0:_(<8 x i16>)
+    %9:_(i32) = G_MERGE_VALUES %1:_(i16), %2:_(i16)
+    %10:_(i32) = G_MERGE_VALUES %3:_(i16), %4:_(i16)
+    %11:_(i32) = G_MERGE_VALUES %5:_(i16), %6:_(i16)
+    %12:_(i32) = G_MERGE_VALUES %7:_(i16), %8:_(i16)
+    $vgpr0 = COPY %9:_(i32)
+    $vgpr1 = COPY %10:_(i32)
+    $vgpr2 = COPY %11:_(i32)
+    $vgpr3 = COPY %12:_(i32)
+...
+---
+name: non_zero_start_index
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1
+
+    ; CHECK-LABEL: name: non_zero_start_index
+    ; CHECK: liveins: $vgpr0_vgpr1
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $vgpr0_vgpr1
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(i32), [[UV1:%[0-9]+]]:_(i32) = G_UNMERGE_VALUES [[COPY]](<4 x i16>)
+    ; CHECK-NEXT: $vgpr0 = COPY [[UV1]](i32)
+    %0:_(<4 x i16>) = COPY $vgpr0_vgpr1
+    %1:_(i16), %2:_(i16), %3:_(i16), %4:_(i16) = G_UNMERGE_VALUES %0:_(<4 x i16>)
+    %5:_(i32) = G_MERGE_VALUES %3:_(i16), %4:_(i16)
+    $vgpr0 = COPY %5:_(i32)
+...
+
+# Integer to vector unmerge + build_vector combine tests.
+# G_UNMERGE_VALUES of an integer feeding G_BUILD_VECTOR into a vector should
+# fold to direct G_UNMERGE_VALUES of the source integer.
+
+---
+name: integer_to_vector_build_vector
+body:             |
+  bb.0.entry:
+    liveins: $vgpr0_vgpr1_vgpr2_vgpr3
+
+    ; CHECK-LABEL: name: integer_to_vector_build_vector
+    ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
+    ; CHECK-NEXT: {{  $}}
+    ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
+    ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x i32>), [[UV1:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY]](i128)
+    ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x i32>), [[UV3:%[0-9]+]]:_(<2 x i32>) = G_UNMERGE_VALUES [[COPY]](i128)
+    ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[UV]](<2 x i32>)
+    ; CHECK-NEXT: $vgpr2_vgpr3 = COPY [[UV3]](<2 x i32>)
+    %0:_(i128) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
+    %1:_(i32), %2:_(i32), %3:_(i32), %4:_(i32) = G_UNMERGE_VALUES %0:_(i128)
+    %5:_(<2 x i32>) = G_BUILD_VECTOR %1:_(i32), %2:_(i32)
+    %6:_(<2 x i32>) = G_BUILD_VECTOR %3:_(i32), %4:_(i32)
----------------
MadhurKumar004 wrote:

Yes, because of -O0 flag. But works as intended. 

https://github.com/llvm/llvm-project/pull/213086


More information about the llvm-commits mailing list