[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