| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -run-pass=legalizer %s -o - | FileCheck -check-prefix=GFX9 %s |
| |
| # The G_ZEXT and G_SHL will be scalarized, introducing a |
| # G_UNMERGE_VALUES of G_BUILD_VECTOR. The artifact combiner should |
| # eliminate the pair. |
| --- |
| name: revisit_build_vector_unmerge_user |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1 |
| |
| ; GFX9-LABEL: name: revisit_build_vector_unmerge_user |
| ; GFX9: liveins: $vgpr0_vgpr1 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 2 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) |
| ; GFX9-NEXT: [[ZEXT:%[0-9]+]]:_(s64) = G_ZEXT [[UV]](s32) |
| ; GFX9-NEXT: [[ZEXT1:%[0-9]+]]:_(s64) = G_ZEXT [[UV1]](s32) |
| ; GFX9-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[ZEXT]], [[C]](s32) |
| ; GFX9-NEXT: [[SHL1:%[0-9]+]]:_(s64) = G_SHL [[ZEXT1]], [[C]](s32) |
| ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s64>) = G_BUILD_VECTOR [[SHL]](s64), [[SHL1]](s64) |
| ; GFX9-NEXT: $vgpr0_vgpr1_vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s64>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(s32) = G_CONSTANT i32 2 |
| %2:_(<2 x s32>) = G_BUILD_VECTOR %1, %1 |
| %3:_(<2 x s64>) = G_ZEXT %0 |
| %4:_(<2 x s64>) = G_SHL %3, %2 |
| $vgpr0_vgpr1_vgpr2_vgpr3 = COPY %4 |
| ... |
| |
| --- |
| name: copy_scalar |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| |
| ; GFX9-LABEL: name: copy_scalar |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](s64) |
| %0:_(s64) = COPY $vgpr0_vgpr1 |
| %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(s64) |
| %3:_(s64) = G_MERGE_VALUES %1, %2 |
| $vgpr2_vgpr3= COPY %3 |
| ... |
| |
| --- |
| name: copy_vector_using_elements |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| |
| ; GFX9-LABEL: name: copy_vector_using_elements |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](<2 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %3:_(<2 x s32>) = G_BUILD_VECTOR %1, %2 |
| $vgpr2_vgpr3= COPY %3 |
| ... |
| |
| --- |
| name: copy_vector_using_subvectors |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| |
| ; GFX9-LABEL: name: copy_vector_using_subvectors |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](<4 x s16>) |
| %0:_(<4 x s16>) = COPY $vgpr0_vgpr1 |
| %1:_(<2 x s16>), %2:_(<2 x s16>) = G_UNMERGE_VALUES %0(<4 x s16>) |
| %3:_(<4 x s16>) = G_CONCAT_VECTORS %1, %2 |
| $vgpr2_vgpr3= COPY %3 |
| ... |
| |
| --- |
| name: shuffle_vector_elements |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| |
| ; GFX9-LABEL: name: shuffle_vector_elements |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) |
| ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV1]](s32), [[UV]](s32) |
| ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %3:_(<2 x s32>) = G_BUILD_VECTOR %2, %1 |
| $vgpr2_vgpr3= COPY %3 |
| ... |
| |
| --- |
| name: insert_element |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3_vgpr4 |
| |
| ; GFX9-LABEL: name: insert_element |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2, $vgpr3_vgpr4 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr2 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) |
| ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[COPY1]](s32) |
| ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[BUILD_VECTOR]](<2 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(s32) = COPY $vgpr2 |
| %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %4:_(<2 x s32>) = G_BUILD_VECTOR %2, %1 |
| $vgpr2_vgpr3= COPY %4 |
| ... |
| |
| --- |
| name: unmerge_to_sub_vectors |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 |
| |
| ; GFX9-LABEL: name: unmerge_to_sub_vectors |
| ; GFX9: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(<2 x s32>), [[UV1:%[0-9]+]]:_(<2 x s32>) = G_UNMERGE_VALUES [[COPY]](<4 x s32>) |
| ; GFX9-NEXT: $vgpr4_vgpr5 = COPY [[UV]](<2 x s32>) |
| ; GFX9-NEXT: $vgpr6_vgpr7 = COPY [[UV1]](<2 x s32>) |
| %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 |
| %1:_(s32), %2:_(s32), %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(<4 x s32>) |
| %5:_(<2 x s32>) = G_BUILD_VECTOR %1, %2 |
| %6:_(<2 x s32>) = G_BUILD_VECTOR %3, %4 |
| $vgpr4_vgpr5= COPY %5 |
| $vgpr6_vgpr7= COPY %6 |
| ... |
| |
| --- |
| name: cant_unmerge_to_sub_vectors |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 |
| |
| ; GFX9-LABEL: name: cant_unmerge_to_sub_vectors |
| ; GFX9: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s32>) |
| ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[UV3]](s32) |
| ; GFX9-NEXT: [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV1]](s32), [[UV2]](s32) |
| ; GFX9-NEXT: $vgpr4_vgpr5 = COPY [[BUILD_VECTOR]](<2 x s32>) |
| ; GFX9-NEXT: $vgpr6_vgpr7 = COPY [[BUILD_VECTOR1]](<2 x s32>) |
| %0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 |
| %1:_(s32), %2:_(s32), %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(<4 x s32>) |
| %5:_(<2 x s32>) = G_BUILD_VECTOR %1, %4 |
| %6:_(<2 x s32>) = G_BUILD_VECTOR %2, %3 |
| $vgpr4_vgpr5= COPY %5 |
| $vgpr6_vgpr7= COPY %6 |
| ... |
| |
| --- |
| name: concat |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 |
| |
| ; GFX9-LABEL: name: concat |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| ; GFX9-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[COPY1]](<2 x s32>) |
| ; GFX9-NEXT: $vgpr4_vgpr5_vgpr6_vgpr7 = COPY [[CONCAT_VECTORS]](<4 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>) |
| %6:_(<4 x s32>) = G_BUILD_VECTOR %2, %3, %4, %5 |
| $vgpr4_vgpr5_vgpr6_vgpr7= COPY %6 |
| ... |
| |
| --- |
| name: concat_same_vector |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3_vgpr4_vgpr5 |
| |
| ; GFX9-LABEL: name: concat_same_vector |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3_vgpr4_vgpr5 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[CONCAT_VECTORS:%[0-9]+]]:_(<4 x s32>) = G_CONCAT_VECTORS [[COPY]](<2 x s32>), [[COPY]](<2 x s32>) |
| ; GFX9-NEXT: $vgpr2_vgpr3_vgpr4_vgpr5 = COPY [[CONCAT_VECTORS]](<4 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %3:_(<4 x s32>) = G_BUILD_VECTOR %1, %2, %1, %2 |
| $vgpr2_vgpr3_vgpr4_vgpr5= COPY %3 |
| ... |
| |
| --- |
| name: shuffle_not_concat |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 |
| |
| ; GFX9-LABEL: name: shuffle_not_concat |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) |
| ; GFX9-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) |
| ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[UV2]](s32), [[UV]](s32), [[UV1]](s32), [[UV3]](s32) |
| ; GFX9-NEXT: $vgpr4_vgpr5_vgpr6_vgpr7 = COPY [[BUILD_VECTOR]](<4 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| %2:_(s32), %3:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %4:_(s32), %5:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>) |
| %6:_(<4 x s32>) = G_BUILD_VECTOR %4, %2, %3, %5 |
| $vgpr4_vgpr5_vgpr6_vgpr7= COPY %6 |
| ... |
| |
| --- |
| name: not_a_concat |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 |
| |
| ; GFX9-LABEL: name: not_a_concat |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| ; GFX9-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr4 |
| ; GFX9-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>) |
| ; GFX9-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY1]](<2 x s32>) |
| ; GFX9-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<5 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[UV1]](s32), [[UV2]](s32), [[UV3]](s32), [[COPY2]](s32) |
| ; GFX9-NEXT: $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9 = COPY [[BUILD_VECTOR]](<5 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(<2 x s32>) = COPY $vgpr2_vgpr3 |
| %2:_(s32) = COPY $vgpr4 |
| %3:_(s32), %4:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %5:_(s32), %6:_(s32) = G_UNMERGE_VALUES %1(<2 x s32>) |
| %7:_(<5 x s32>) = G_BUILD_VECTOR %3, %4, %5, %6, %2 |
| $vgpr5_vgpr6_vgpr7_vgpr8_vgpr9= COPY %7 |
| ... |
| |
| --- |
| name: value_finder_look_through_copy |
| body: | |
| bb.0: |
| liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| |
| ; GFX9-LABEL: name: value_finder_look_through_copy |
| ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 |
| ; GFX9-NEXT: {{ $}} |
| ; GFX9-NEXT: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| ; GFX9-NEXT: $vgpr2_vgpr3 = COPY [[COPY]](<2 x s32>) |
| %0:_(<2 x s32>) = COPY $vgpr0_vgpr1 |
| %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0(<2 x s32>) |
| %3:_(s32) = COPY %1 |
| %4:_(<2 x s32>) = G_BUILD_VECTOR %3, %2 |
| $vgpr2_vgpr3= COPY %4 |
| ... |