[llvm] [GlobalISel] LegalizationArtifactCombiner for merge-unmerge->unmerge where src and dst of result would be different scalar/vector types (PR #213086)
Madhur Kumar via llvm-commits
llvm-commits at lists.llvm.org
Sun Aug 2 06:49:33 PDT 2026
https://github.com/MadhurKumar004 updated https://github.com/llvm/llvm-project/pull/213086
>From 9acb80897cae7051b54b733debd1853b2b43c757 Mon Sep 17 00:00:00 2001
From: Madhur Kumar <madhurkumar004 at gmail.com>
Date: Thu, 30 Jul 2026 22:44:50 +0530
Subject: [PATCH 1/2] [AMDGPU] Test for merge-unmerge->unmerge
---
.../artifact-combiner-unmerge-values.mir | 166 ++++++++++++++++++
1 file changed, 166 insertions(+)
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
index 9f0ef53b922a0..12b51106d4ef0 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
@@ -1611,3 +1611,169 @@ body: |
$vgpr0 = COPY %4
$vgpr1 = COPY %5
...
+
+# Vector to scalar unmerge + merge combine tests.
+# G_UNMERGE_VALUES of a vector feeding G_MERGE_VALUES into a scalar
+# should fold to direct G_UNMERGE_VALUES of the source vector.
+
+---
+name: vector_to_scalar_merge_values
+body: |
+ bb.0.entry:
+ liveins: $vgpr0_vgpr1
+
+ ; CHECK-LABEL: name: vector_to_scalar_merge_values
+ ; CHECK: liveins: $vgpr0_vgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[UV]](<2 x s16>)
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(i32) = G_CONSTANT i32 16
+ ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST]], [[C]](i32)
+ ; CHECK-NEXT: [[BITCAST1:%[0-9]+]]:_(i32) = G_BITCAST [[UV1]](<2 x s16>)
+ ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST1]], [[C]](i32)
+ ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 65535
+ ; CHECK-NEXT: [[AND:%[0-9]+]]:_(i32) = G_AND [[BITCAST]], [[C1]]
+ ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i32) = G_SHL [[LSHR]], [[C]](i32)
+ ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
+ ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(i32) = G_AND [[BITCAST1]], [[C1]]
+ ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(i32) = G_SHL [[LSHR1]], [[C]](i32)
+ ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND1]], [[SHL1]]
+ ; CHECK-NEXT: $vgpr0 = COPY [[OR]](s32)
+ ; CHECK-NEXT: $vgpr1 = COPY [[OR1]](s32)
+ %0:_(<4 x s16>) = COPY $vgpr0_vgpr1
+ %1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16) = G_UNMERGE_VALUES %0:_(<4 x s16>)
+ %5:_(s32) = G_MERGE_VALUES %1:_(s16), %2:_(s16)
+ %6:_(s32) = G_MERGE_VALUES %3:_(s16), %4:_(s16)
+ $vgpr0 = COPY %5:_(s32)
+ $vgpr1 = COPY %6:_(s32)
+...
+---
+name: vector_to_scalar_build_vector
+body: |
+ bb.0.entry:
+ liveins: $vgpr0_vgpr1
+
+ ; CHECK-LABEL: name: vector_to_scalar_build_vector
+ ; CHECK: liveins: $vgpr0_vgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(<2 x s16>), [[UV3:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: $vgpr0 = COPY [[UV]](<2 x s16>)
+ ; CHECK-NEXT: $vgpr1 = COPY [[UV3]](<2 x s16>)
+ %0:_(<4 x s16>) = COPY $vgpr0_vgpr1
+ %1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16) = G_UNMERGE_VALUES %0:_(<4 x s16>)
+ %5:_(<2 x s16>) = G_BUILD_VECTOR %1:_(s16), %2:_(s16)
+ %6:_(<2 x s16>) = G_BUILD_VECTOR %3:_(s16), %4:_(s16)
+ $vgpr0 = COPY %5:_(<2 x s16>)
+ $vgpr1 = COPY %6:_(<2 x s16>)
+...
+---
+name: scalar_to_vector_no_fold
+body: |
+ bb.0.entry:
+ liveins: $vgpr0_vgpr1
+
+ ; CHECK-LABEL: name: scalar_to_vector_no_fold
+ ; CHECK: liveins: $vgpr0_vgpr1
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](s64)
+ ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[UV]](s32), [[UV1]](s32)
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[BUILD_VECTOR]](<2 x s32>)
+ %0:_(s64) = COPY $vgpr0_vgpr1
+ %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0:_(s64)
+ %3:_(<2 x s32>) = G_BUILD_VECTOR %1:_(s32), %2:_(s32)
+ $vgpr0_vgpr1 = COPY %3:_(<2 x s32>)
+...
+---
+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 s32>) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<2 x s32>)
+ ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV]](s32), [[UV1]](s32)
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64)
+ %0:_(<2 x s32>) = COPY $vgpr0_vgpr1
+ %1:_(s32), %2:_(s32) = G_UNMERGE_VALUES %0:_(<2 x s32>)
+ %3:_(s64) = G_MERGE_VALUES %1:_(s32), %2:_(s32)
+ $vgpr0_vgpr1 = COPY %3:_(s64)
+...
+---
+name: vector_to_scalar_eight_s16
+body: |
+ bb.0.entry:
+ liveins: $vgpr0_vgpr1_vgpr2_vgpr3
+
+ ; CHECK-LABEL: name: vector_to_scalar_eight_s16
+ ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>), [[UV2:%[0-9]+]]:_(<2 x s16>), [[UV3:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
+ ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[UV]](<2 x s16>)
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(i32) = G_CONSTANT i32 16
+ ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST]], [[C]](i32)
+ ; CHECK-NEXT: [[BITCAST1:%[0-9]+]]:_(i32) = G_BITCAST [[UV1]](<2 x s16>)
+ ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST1]], [[C]](i32)
+ ; CHECK-NEXT: [[BITCAST2:%[0-9]+]]:_(i32) = G_BITCAST [[UV2]](<2 x s16>)
+ ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST2]], [[C]](i32)
+ ; CHECK-NEXT: [[BITCAST3:%[0-9]+]]:_(i32) = G_BITCAST [[UV3]](<2 x s16>)
+ ; CHECK-NEXT: [[LSHR3:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST3]], [[C]](i32)
+ ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 65535
+ ; CHECK-NEXT: [[AND:%[0-9]+]]:_(i32) = G_AND [[BITCAST]], [[C1]]
+ ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i32) = G_SHL [[LSHR]], [[C]](i32)
+ ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
+ ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(i32) = G_AND [[BITCAST1]], [[C1]]
+ ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(i32) = G_SHL [[LSHR1]], [[C]](i32)
+ ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND1]], [[SHL1]]
+ ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(i32) = G_AND [[BITCAST2]], [[C1]]
+ ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(i32) = G_SHL [[LSHR2]], [[C]](i32)
+ ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL2]]
+ ; CHECK-NEXT: [[AND3:%[0-9]+]]:_(i32) = G_AND [[BITCAST3]], [[C1]]
+ ; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(i32) = G_SHL [[LSHR3]], [[C]](i32)
+ ; CHECK-NEXT: [[OR3:%[0-9]+]]:_(s32) = G_OR [[AND3]], [[SHL3]]
+ ; CHECK-NEXT: $vgpr0 = COPY [[OR]](s32)
+ ; CHECK-NEXT: $vgpr1 = COPY [[OR1]](s32)
+ ; CHECK-NEXT: $vgpr2 = COPY [[OR2]](s32)
+ ; CHECK-NEXT: $vgpr3 = COPY [[OR3]](s32)
+ %0:_(<8 x s16>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
+ %1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16), %5:_(s16), %6:_(s16), %7:_(s16), %8:_(s16) = G_UNMERGE_VALUES %0:_(<8 x s16>)
+ %9:_(s32) = G_MERGE_VALUES %1:_(s16), %2:_(s16)
+ %10:_(s32) = G_MERGE_VALUES %3:_(s16), %4:_(s16)
+ %11:_(s32) = G_MERGE_VALUES %5:_(s16), %6:_(s16)
+ %12:_(s32) = G_MERGE_VALUES %7:_(s16), %8:_(s16)
+ $vgpr0 = COPY %9:_(s32)
+ $vgpr1 = COPY %10:_(s32)
+ $vgpr2 = COPY %11:_(s32)
+ $vgpr3 = COPY %12:_(s32)
+...
+---
+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 s16>) = COPY $vgpr0_vgpr1
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[UV1]](<2 x s16>)
+ ; CHECK-NEXT: [[C:%[0-9]+]]:_(i32) = G_CONSTANT i32 16
+ ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST]], [[C]](i32)
+ ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 65535
+ ; CHECK-NEXT: [[AND:%[0-9]+]]:_(i32) = G_AND [[BITCAST]], [[C1]]
+ ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i32) = G_SHL [[LSHR]], [[C]](i32)
+ ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
+ ; CHECK-NEXT: $vgpr0 = COPY [[OR]](s32)
+ %0:_(<4 x s16>) = COPY $vgpr0_vgpr1
+ %1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16) = G_UNMERGE_VALUES %0:_(<4 x s16>)
+ %5:_(s32) = G_MERGE_VALUES %3:_(s16), %4:_(s16)
+ $vgpr0 = COPY %5:_(s32)
+...
>From ebb7c6d43423c54c6de50a5da72a1b7ccd5c61ce Mon Sep 17 00:00:00 2001
From: Madhur Kumar <madhurkumar004 at gmail.com>
Date: Thu, 30 Jul 2026 23:06:14 +0530
Subject: [PATCH 2/2] [GlobalISel] LegalizationArtifactCombiner for
merge-unmerge->unmerge but src and dst of result would be different
scalar/vector types
---
.../GlobalISel/LegalizationArtifactCombiner.h | 15 ++++-
llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll | 21 ++----
.../artifact-combiner-unmerge-values.mir | 65 ++++---------------
.../AMDGPU/GlobalISel/legalize-extract.mir | 20 +++---
.../GlobalISel/llvm.amdgcn.intersect_ray.ll | 52 +++++----------
llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll | 19 ++----
.../GlobalISel/true16-merge-values-s16.ll | 6 --
.../AMDGPU/llvm.amdgcn.intersect_ray.ll | 52 +++++----------
8 files changed, 79 insertions(+), 171 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h
index d8d7ccc0bd7a7..b7a75dd7576c2 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h
@@ -1006,7 +1006,8 @@ class LegalizationArtifactCombiner {
}
// Recognize UnmergeSrc that can be unmerged to DstTy directly.
- // Types have to be either both vector or both non-vector types.
+ // Types have to be either both vector or both non-vector types, or
+ // UnmergeSrcTy is vector and DstTy is scalar.
// In case of vector types, the scalar elements need to match.
// Merge-like opcodes are combined one at the time. First one creates new
// unmerge, following should use the same unmerge (builder performs CSE).
@@ -1016,14 +1017,22 @@ class LegalizationArtifactCombiner {
// %AnotherDst:_(DstTy) = G_merge_like_opcode %2:_(EltTy), %3
//
// %Dst:_(DstTy), %AnotherDst = G_UNMERGE_VALUES %UnmergeSrc
- if (((!DstTy.isVector() && !UnmergeSrcTy.isVector()) ||
- (DstTy.isVector() && UnmergeSrcTy.isVector() &&
+ if ((!DstTy.isVector() ||
+ (UnmergeSrcTy.isVector() &&
DstTy.getScalarType() == UnmergeSrcTy.getScalarType())) &&
(Elt0UnmergeIdx % NumMIElts == 0) &&
+ (DstTy.getSizeInBits() < UnmergeSrcTy.getSizeInBits()) &&
getCoverTy(UnmergeSrcTy, DstTy) == UnmergeSrcTy) {
if (!isSequenceFromUnmerge(MI, 0, Unmerge, Elt0UnmergeIdx, NumMIElts,
EltSize, false))
return false;
+ if (!DstTy.isVector() && UnmergeSrcTy.isVector()) {
+ LegalizeActionStep ActionStep = LI.getAction(
+ {TargetOpcode::G_UNMERGE_VALUES, {DstTy, UnmergeSrcTy}});
+ if (ActionStep.Action != LegalizeAction::Legal) {
+ return false;
+ }
+ }
MIB.setInstrAndDebugLoc(MI);
auto NewUnmerge = MIB.buildUnmerge(DstTy, Unmerge->getSourceReg());
unsigned DstIdx = (Elt0UnmergeIdx * EltSize) / DstTy.getSizeInBits();
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll
index d553f16d49013..239dfa9698192 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/andn2.ll
@@ -750,8 +750,6 @@ define amdgpu_ps i48 @s_andn2_v3i16(<3 x i16> inreg %src0, <3 x i16> inreg %src1
; GFX11-TRUE16-NEXT: s_mov_b64 s[0:1], -1
; GFX11-TRUE16-NEXT: s_xor_b64 s[0:1], s[4:5], s[0:1]
; GFX11-TRUE16-NEXT: s_and_b64 s[0:1], s[2:3], s[0:1]
-; GFX11-TRUE16-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s0, s0, s2
; GFX11-TRUE16-NEXT: ; return to shader part epilog
;
; GFX11-FAKE16-LABEL: s_andn2_v3i16:
@@ -824,8 +822,6 @@ define amdgpu_ps i48 @s_andn2_v3i16_commute(<3 x i16> inreg %src0, <3 x i16> inr
; GFX11-TRUE16-NEXT: s_mov_b64 s[0:1], -1
; GFX11-TRUE16-NEXT: s_xor_b64 s[0:1], s[4:5], s[0:1]
; GFX11-TRUE16-NEXT: s_and_b64 s[0:1], s[0:1], s[2:3]
-; GFX11-TRUE16-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s0, s0, s2
; GFX11-TRUE16-NEXT: ; return to shader part epilog
;
; GFX11-FAKE16-LABEL: s_andn2_v3i16_commute:
@@ -913,10 +909,7 @@ define amdgpu_ps { i48, i48 } @s_andn2_v3i16_multi_use(<3 x i16> inreg %src0, <3
; GFX11-TRUE16-NEXT: s_mov_b64 s[0:1], -1
; GFX11-TRUE16-NEXT: s_xor_b64 s[4:5], s[4:5], s[0:1]
; GFX11-TRUE16-NEXT: s_and_b64 s[0:1], s[2:3], s[4:5]
-; GFX11-TRUE16-NEXT: s_lshr_b32 s3, s4, 16
-; GFX11-TRUE16-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s0, s0, s2
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s2, s4, s3
+; GFX11-TRUE16-NEXT: s_mov_b32 s2, s4
; GFX11-TRUE16-NEXT: s_mov_b32 s3, s5
; GFX11-TRUE16-NEXT: ; return to shader part epilog
;
@@ -953,20 +946,16 @@ define <3 x i16> @v_andn2_v3i16(<3 x i16> %src0, <3 x i16> %src1) {
; GFX6-NEXT: v_lshrrev_b32_e32 v4, 16, v0
; GFX6-NEXT: v_and_b32_e32 v2, 0xffff, v2
; GFX6-NEXT: v_lshlrev_b32_e32 v5, 16, v5
+; GFX6-NEXT: v_and_b32_e32 v3, 0xffff, v3
; GFX6-NEXT: v_or_b32_e32 v2, v2, v5
+; GFX6-NEXT: v_xor_b32_e32 v3, 0xfff5, v3
; GFX6-NEXT: v_and_b32_e32 v0, 0xffff, v0
; GFX6-NEXT: v_lshlrev_b32_e32 v4, 16, v4
+; GFX6-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX6-NEXT: v_xor_b32_e32 v2, -1, v2
; GFX6-NEXT: v_or_b32_e32 v0, v0, v4
-; GFX6-NEXT: v_and_b32_e32 v3, 0xffff, v3
-; GFX6-NEXT: v_and_b32_e32 v0, v0, v2
-; GFX6-NEXT: v_xor_b32_e32 v3, 0xfff5, v3
-; GFX6-NEXT: v_and_b32_e32 v1, 0xffff, v1
-; GFX6-NEXT: v_lshrrev_b32_e32 v2, 16, v0
; GFX6-NEXT: v_and_b32_e32 v1, v1, v3
-; GFX6-NEXT: v_and_b32_e32 v0, 0xffff, v0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v2
-; GFX6-NEXT: v_or_b32_e32 v0, v0, v2
+; GFX6-NEXT: v_and_b32_e32 v0, v0, v2
; GFX6-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX6-NEXT: s_setpc_b64 s[30:31]
;
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
index 12b51106d4ef0..b49d2abeb39c9 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/artifact-combiner-unmerge-values.mir
@@ -1626,21 +1626,10 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
- ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[UV]](<2 x s16>)
- ; CHECK-NEXT: [[C:%[0-9]+]]:_(i32) = G_CONSTANT i32 16
- ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST]], [[C]](i32)
- ; CHECK-NEXT: [[BITCAST1:%[0-9]+]]:_(i32) = G_BITCAST [[UV1]](<2 x s16>)
- ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST1]], [[C]](i32)
- ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 65535
- ; CHECK-NEXT: [[AND:%[0-9]+]]:_(i32) = G_AND [[BITCAST]], [[C1]]
- ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i32) = G_SHL [[LSHR]], [[C]](i32)
- ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
- ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(i32) = G_AND [[BITCAST1]], [[C1]]
- ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(i32) = G_SHL [[LSHR1]], [[C]](i32)
- ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND1]], [[SHL1]]
- ; CHECK-NEXT: $vgpr0 = COPY [[OR]](s32)
- ; CHECK-NEXT: $vgpr1 = COPY [[OR1]](s32)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32)
+ ; CHECK-NEXT: $vgpr1 = COPY [[UV3]](s32)
%0:_(<4 x s16>) = COPY $vgpr0_vgpr1
%1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16) = G_UNMERGE_VALUES %0:_(<4 x s16>)
%5:_(s32) = G_MERGE_VALUES %1:_(s16), %2:_(s16)
@@ -1715,33 +1704,14 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>), [[UV2:%[0-9]+]]:_(<2 x s16>), [[UV3:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
- ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[UV]](<2 x s16>)
- ; CHECK-NEXT: [[C:%[0-9]+]]:_(i32) = G_CONSTANT i32 16
- ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST]], [[C]](i32)
- ; CHECK-NEXT: [[BITCAST1:%[0-9]+]]:_(i32) = G_BITCAST [[UV1]](<2 x s16>)
- ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST1]], [[C]](i32)
- ; CHECK-NEXT: [[BITCAST2:%[0-9]+]]:_(i32) = G_BITCAST [[UV2]](<2 x s16>)
- ; CHECK-NEXT: [[LSHR2:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST2]], [[C]](i32)
- ; CHECK-NEXT: [[BITCAST3:%[0-9]+]]:_(i32) = G_BITCAST [[UV3]](<2 x s16>)
- ; CHECK-NEXT: [[LSHR3:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST3]], [[C]](i32)
- ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 65535
- ; CHECK-NEXT: [[AND:%[0-9]+]]:_(i32) = G_AND [[BITCAST]], [[C1]]
- ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i32) = G_SHL [[LSHR]], [[C]](i32)
- ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
- ; CHECK-NEXT: [[AND1:%[0-9]+]]:_(i32) = G_AND [[BITCAST1]], [[C1]]
- ; CHECK-NEXT: [[SHL1:%[0-9]+]]:_(i32) = G_SHL [[LSHR1]], [[C]](i32)
- ; CHECK-NEXT: [[OR1:%[0-9]+]]:_(s32) = G_OR [[AND1]], [[SHL1]]
- ; CHECK-NEXT: [[AND2:%[0-9]+]]:_(i32) = G_AND [[BITCAST2]], [[C1]]
- ; CHECK-NEXT: [[SHL2:%[0-9]+]]:_(i32) = G_SHL [[LSHR2]], [[C]](i32)
- ; CHECK-NEXT: [[OR2:%[0-9]+]]:_(s32) = G_OR [[AND2]], [[SHL2]]
- ; CHECK-NEXT: [[AND3:%[0-9]+]]:_(i32) = G_AND [[BITCAST3]], [[C1]]
- ; CHECK-NEXT: [[SHL3:%[0-9]+]]:_(i32) = G_SHL [[LSHR3]], [[C]](i32)
- ; CHECK-NEXT: [[OR3:%[0-9]+]]:_(s32) = G_OR [[AND3]], [[SHL3]]
- ; CHECK-NEXT: $vgpr0 = COPY [[OR]](s32)
- ; CHECK-NEXT: $vgpr1 = COPY [[OR1]](s32)
- ; CHECK-NEXT: $vgpr2 = COPY [[OR2]](s32)
- ; CHECK-NEXT: $vgpr3 = COPY [[OR3]](s32)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
+ ; CHECK-NEXT: [[UV4:%[0-9]+]]:_(s32), [[UV5:%[0-9]+]]:_(s32), [[UV6:%[0-9]+]]:_(s32), [[UV7:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
+ ; CHECK-NEXT: [[UV8:%[0-9]+]]:_(s32), [[UV9:%[0-9]+]]:_(s32), [[UV10:%[0-9]+]]:_(s32), [[UV11:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
+ ; CHECK-NEXT: [[UV12:%[0-9]+]]:_(s32), [[UV13:%[0-9]+]]:_(s32), [[UV14:%[0-9]+]]:_(s32), [[UV15:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<8 x s16>)
+ ; CHECK-NEXT: $vgpr0 = COPY [[UV]](s32)
+ ; CHECK-NEXT: $vgpr1 = COPY [[UV5]](s32)
+ ; CHECK-NEXT: $vgpr2 = COPY [[UV10]](s32)
+ ; CHECK-NEXT: $vgpr3 = COPY [[UV15]](s32)
%0:_(<8 x s16>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
%1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16), %5:_(s16), %6:_(s16), %7:_(s16), %8:_(s16) = G_UNMERGE_VALUES %0:_(<8 x s16>)
%9:_(s32) = G_MERGE_VALUES %1:_(s16), %2:_(s16)
@@ -1763,15 +1733,8 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s16>) = COPY $vgpr0_vgpr1
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(<2 x s16>), [[UV1:%[0-9]+]]:_(<2 x s16>) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
- ; CHECK-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[UV1]](<2 x s16>)
- ; CHECK-NEXT: [[C:%[0-9]+]]:_(i32) = G_CONSTANT i32 16
- ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(i32) = G_LSHR [[BITCAST]], [[C]](i32)
- ; CHECK-NEXT: [[C1:%[0-9]+]]:_(i32) = G_CONSTANT i32 65535
- ; CHECK-NEXT: [[AND:%[0-9]+]]:_(i32) = G_AND [[BITCAST]], [[C1]]
- ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(i32) = G_SHL [[LSHR]], [[C]](i32)
- ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s32) = G_OR [[AND]], [[SHL]]
- ; CHECK-NEXT: $vgpr0 = COPY [[OR]](s32)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s16>)
+ ; CHECK-NEXT: $vgpr0 = COPY [[UV1]](s32)
%0:_(<4 x s16>) = COPY $vgpr0_vgpr1
%1:_(s16), %2:_(s16), %3:_(s16), %4:_(s16) = G_UNMERGE_VALUES %0:_(<4 x s16>)
%5:_(s32) = G_MERGE_VALUES %3:_(s16), %4:_(s16)
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract.mir
index ef6699139ca7d..f4b3947616e0e 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract.mir
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-extract.mir
@@ -414,9 +414,8 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
- ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV]](s32), [[UV1]](s32)
- ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[UV]](s64)
%0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
%1:_(s64) = G_EXTRACT %0, 0
$vgpr0_vgpr1 = COPY %1
@@ -450,9 +449,8 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
- ; CHECK-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[UV2]](s32), [[UV3]](s32)
- ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](s64)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s64), [[UV1:%[0-9]+]]:_(s64) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[UV1]](s64)
%0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
%1:_(s64) = G_EXTRACT %0, 64
$vgpr0_vgpr1 = COPY %1
@@ -467,9 +465,8 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
- ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[UV]](s32), [[UV1]](s32)
- ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](p0)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(p0), [[UV1:%[0-9]+]]:_(p0) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[UV]](p0)
%0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
%1:_(p0) = G_EXTRACT %0, 0
$vgpr0_vgpr1 = COPY %1
@@ -503,9 +500,8 @@ body: |
; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
- ; CHECK-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32), [[UV2:%[0-9]+]]:_(s32), [[UV3:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
- ; CHECK-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[UV2]](s32), [[UV3]](s32)
- ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[MV]](p0)
+ ; CHECK-NEXT: [[UV:%[0-9]+]]:_(p0), [[UV1:%[0-9]+]]:_(p0) = G_UNMERGE_VALUES [[COPY]](<4 x s32>)
+ ; CHECK-NEXT: $vgpr0_vgpr1 = COPY [[UV1]](p0)
%0:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3
%1:_(p0) = G_EXTRACT %0, 64
$vgpr0_vgpr1 = COPY %1
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.amdgcn.intersect_ray.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.amdgcn.intersect_ray.ll
index 1d0ae809d3707..9bf7f0288cf30 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.amdgcn.intersect_ray.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/llvm.amdgcn.intersect_ray.ll
@@ -51,14 +51,11 @@ define amdgpu_ps <4 x float> @image_bvh_intersect_ray_flat(i32 %node_ptr, float
define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> inreg %tdescr) {
; GFX10-LABEL: image_bvh_intersect_ray_a16:
; GFX10: ; %bb.0:
-; GFX10-NEXT: v_lshrrev_b32_e32 v9, 16, v5
-; GFX10-NEXT: v_and_b32_e32 v10, 0xffff, v7
+; GFX10-NEXT: v_and_b32_e32 v9, 0xffff, v7
; GFX10-NEXT: v_and_b32_e32 v8, 0xffff, v8
; GFX10-NEXT: v_lshlrev_b32_e32 v9, 16, v9
-; GFX10-NEXT: v_lshlrev_b32_e32 v10, 16, v10
; GFX10-NEXT: v_alignbit_b32 v7, v8, v7, 16
-; GFX10-NEXT: v_and_or_b32 v5, 0xffff, v5, v9
-; GFX10-NEXT: v_and_or_b32 v6, 0xffff, v6, v10
+; GFX10-NEXT: v_and_or_b32 v6, 0xffff, v6, v9
; GFX10-NEXT: image_bvh_intersect_ray v[0:3], v[0:7], s[0:3] a16
; GFX10-NEXT: s_waitcnt vmcnt(0)
; GFX10-NEXT: ; return to shader part epilog
@@ -126,14 +123,11 @@ define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_flat(<2 x i32> %node_ptr
define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> inreg %tdescr) {
; GFX10-LABEL: image_bvh64_intersect_ray_a16:
; GFX10: ; %bb.0:
-; GFX10-NEXT: v_lshrrev_b32_e32 v10, 16, v6
-; GFX10-NEXT: v_and_b32_e32 v11, 0xffff, v8
+; GFX10-NEXT: v_and_b32_e32 v10, 0xffff, v8
; GFX10-NEXT: v_and_b32_e32 v9, 0xffff, v9
; GFX10-NEXT: v_lshlrev_b32_e32 v10, 16, v10
-; GFX10-NEXT: v_lshlrev_b32_e32 v11, 16, v11
; GFX10-NEXT: v_alignbit_b32 v8, v9, v8, 16
-; GFX10-NEXT: v_and_or_b32 v6, 0xffff, v6, v10
-; GFX10-NEXT: v_and_or_b32 v7, 0xffff, v7, v11
+; GFX10-NEXT: v_and_or_b32 v7, 0xffff, v7, v10
; GFX10-NEXT: image_bvh64_intersect_ray v[0:3], v[0:8], s[0:3] a16
; GFX10-NEXT: s_waitcnt vmcnt(0)
; GFX10-NEXT: ; return to shader part epilog
@@ -279,19 +273,17 @@ define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16_vgpr_descr(i32 %node_p
; GFX1030-LABEL: image_bvh_intersect_ray_a16_vgpr_descr:
; GFX1030: ; %bb.0:
; GFX1030-NEXT: v_mov_b32_e32 v13, v0
+; GFX1030-NEXT: v_and_b32_e32 v0, 0xffff, v7
; GFX1030-NEXT: v_mov_b32_e32 v14, v1
-; GFX1030-NEXT: v_lshrrev_b32_e32 v0, 16, v5
-; GFX1030-NEXT: v_and_b32_e32 v1, 0xffff, v7
+; GFX1030-NEXT: v_and_b32_e32 v1, 0xffff, v8
; GFX1030-NEXT: v_mov_b32_e32 v15, v2
-; GFX1030-NEXT: v_and_b32_e32 v2, 0xffff, v8
; GFX1030-NEXT: v_mov_b32_e32 v16, v3
; GFX1030-NEXT: v_lshlrev_b32_e32 v0, 16, v0
-; GFX1030-NEXT: v_lshlrev_b32_e32 v1, 16, v1
; GFX1030-NEXT: v_mov_b32_e32 v17, v4
-; GFX1030-NEXT: v_alignbit_b32 v20, v2, v7, 16
+; GFX1030-NEXT: v_mov_b32_e32 v18, v5
+; GFX1030-NEXT: v_alignbit_b32 v20, v1, v7, 16
; GFX1030-NEXT: s_mov_b32 s1, exec_lo
-; GFX1030-NEXT: v_and_or_b32 v18, 0xffff, v5, v0
-; GFX1030-NEXT: v_and_or_b32 v19, 0xffff, v6, v1
+; GFX1030-NEXT: v_and_or_b32 v19, 0xffff, v6, v0
; GFX1030-NEXT: .LBB7_1: ; =>This Inner Loop Header: Depth=1
; GFX1030-NEXT: v_readfirstlane_b32 s4, v9
; GFX1030-NEXT: v_readfirstlane_b32 s5, v10
@@ -321,15 +313,12 @@ define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16_vgpr_descr(i32 %node_p
;
; GFX1013-LABEL: image_bvh_intersect_ray_a16_vgpr_descr:
; GFX1013: ; %bb.0:
-; GFX1013-NEXT: v_lshrrev_b32_e32 v13, 16, v5
-; GFX1013-NEXT: v_and_b32_e32 v14, 0xffff, v7
+; GFX1013-NEXT: v_and_b32_e32 v13, 0xffff, v7
; GFX1013-NEXT: v_and_b32_e32 v8, 0xffff, v8
; GFX1013-NEXT: s_mov_b32 s1, exec_lo
; GFX1013-NEXT: v_lshlrev_b32_e32 v13, 16, v13
-; GFX1013-NEXT: v_lshlrev_b32_e32 v14, 16, v14
; GFX1013-NEXT: v_alignbit_b32 v7, v8, v7, 16
-; GFX1013-NEXT: v_and_or_b32 v5, 0xffff, v5, v13
-; GFX1013-NEXT: v_and_or_b32 v6, 0xffff, v6, v14
+; GFX1013-NEXT: v_and_or_b32 v6, 0xffff, v6, v13
; GFX1013-NEXT: .LBB7_1: ; =>This Inner Loop Header: Depth=1
; GFX1013-NEXT: v_readfirstlane_b32 s4, v9
; GFX1013-NEXT: v_readfirstlane_b32 s5, v10
@@ -546,19 +535,17 @@ define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16_vgpr_descr(i64 %node
; GFX1030-LABEL: image_bvh64_intersect_ray_a16_vgpr_descr:
; GFX1030: ; %bb.0:
; GFX1030-NEXT: v_mov_b32_e32 v14, v0
+; GFX1030-NEXT: v_and_b32_e32 v0, 0xffff, v8
; GFX1030-NEXT: v_mov_b32_e32 v15, v1
-; GFX1030-NEXT: v_lshrrev_b32_e32 v0, 16, v6
-; GFX1030-NEXT: v_and_b32_e32 v1, 0xffff, v8
+; GFX1030-NEXT: v_and_b32_e32 v1, 0xffff, v9
; GFX1030-NEXT: v_mov_b32_e32 v16, v2
-; GFX1030-NEXT: v_and_b32_e32 v2, 0xffff, v9
; GFX1030-NEXT: v_mov_b32_e32 v17, v3
; GFX1030-NEXT: v_lshlrev_b32_e32 v0, 16, v0
-; GFX1030-NEXT: v_lshlrev_b32_e32 v1, 16, v1
; GFX1030-NEXT: v_mov_b32_e32 v18, v4
; GFX1030-NEXT: v_mov_b32_e32 v19, v5
-; GFX1030-NEXT: v_alignbit_b32 v22, v2, v8, 16
-; GFX1030-NEXT: v_and_or_b32 v20, 0xffff, v6, v0
-; GFX1030-NEXT: v_and_or_b32 v21, 0xffff, v7, v1
+; GFX1030-NEXT: v_mov_b32_e32 v20, v6
+; GFX1030-NEXT: v_alignbit_b32 v22, v1, v8, 16
+; GFX1030-NEXT: v_and_or_b32 v21, 0xffff, v7, v0
; GFX1030-NEXT: s_mov_b32 s1, exec_lo
; GFX1030-NEXT: .LBB9_1: ; =>This Inner Loop Header: Depth=1
; GFX1030-NEXT: v_readfirstlane_b32 s4, v10
@@ -590,15 +577,12 @@ define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16_vgpr_descr(i64 %node
;
; GFX1013-LABEL: image_bvh64_intersect_ray_a16_vgpr_descr:
; GFX1013: ; %bb.0:
-; GFX1013-NEXT: v_lshrrev_b32_e32 v14, 16, v6
-; GFX1013-NEXT: v_and_b32_e32 v15, 0xffff, v8
+; GFX1013-NEXT: v_and_b32_e32 v14, 0xffff, v8
; GFX1013-NEXT: v_and_b32_e32 v9, 0xffff, v9
; GFX1013-NEXT: s_mov_b32 s1, exec_lo
; GFX1013-NEXT: v_lshlrev_b32_e32 v14, 16, v14
-; GFX1013-NEXT: v_lshlrev_b32_e32 v15, 16, v15
; GFX1013-NEXT: v_alignbit_b32 v8, v9, v8, 16
-; GFX1013-NEXT: v_and_or_b32 v6, 0xffff, v6, v14
-; GFX1013-NEXT: v_and_or_b32 v7, 0xffff, v7, v15
+; GFX1013-NEXT: v_and_or_b32 v7, 0xffff, v7, v14
; GFX1013-NEXT: .LBB9_1: ; =>This Inner Loop Header: Depth=1
; GFX1013-NEXT: v_readfirstlane_b32 s4, v10
; GFX1013-NEXT: v_readfirstlane_b32 s5, v11
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll
index c226f7f9289ee..f5bf57222710c 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/orn2.ll
@@ -749,8 +749,6 @@ define amdgpu_ps i48 @s_orn2_v3i16(<3 x i16> inreg %src0, <3 x i16> inreg %src1)
; GFX11-TRUE16-NEXT: s_mov_b64 s[0:1], -1
; GFX11-TRUE16-NEXT: s_xor_b64 s[0:1], s[4:5], s[0:1]
; GFX11-TRUE16-NEXT: s_or_b64 s[0:1], s[2:3], s[0:1]
-; GFX11-TRUE16-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s0, s0, s2
; GFX11-TRUE16-NEXT: ; return to shader part epilog
;
; GFX11-FAKE16-LABEL: s_orn2_v3i16:
@@ -823,8 +821,6 @@ define amdgpu_ps i48 @s_orn2_v3i16_commute(<3 x i16> inreg %src0, <3 x i16> inre
; GFX11-TRUE16-NEXT: s_mov_b64 s[0:1], -1
; GFX11-TRUE16-NEXT: s_xor_b64 s[0:1], s[4:5], s[0:1]
; GFX11-TRUE16-NEXT: s_or_b64 s[0:1], s[0:1], s[2:3]
-; GFX11-TRUE16-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s0, s0, s2
; GFX11-TRUE16-NEXT: ; return to shader part epilog
;
; GFX11-FAKE16-LABEL: s_orn2_v3i16_commute:
@@ -912,10 +908,7 @@ define amdgpu_ps { i48, i48 } @s_orn2_v3i16_multi_use(<3 x i16> inreg %src0, <3
; GFX11-TRUE16-NEXT: s_mov_b64 s[0:1], -1
; GFX11-TRUE16-NEXT: s_xor_b64 s[4:5], s[4:5], s[0:1]
; GFX11-TRUE16-NEXT: s_or_b64 s[0:1], s[2:3], s[4:5]
-; GFX11-TRUE16-NEXT: s_lshr_b32 s3, s4, 16
-; GFX11-TRUE16-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s0, s0, s2
-; GFX11-TRUE16-NEXT: s_pack_ll_b32_b16 s2, s4, s3
+; GFX11-TRUE16-NEXT: s_mov_b32 s2, s4
; GFX11-TRUE16-NEXT: s_mov_b32 s3, s5
; GFX11-TRUE16-NEXT: ; return to shader part epilog
;
@@ -952,19 +945,15 @@ define <3 x i16> @v_orn2_v3i16(<3 x i16> %src0, <3 x i16> %src1) {
; GFX6-NEXT: v_lshrrev_b32_e32 v4, 16, v0
; GFX6-NEXT: v_and_b32_e32 v2, 0xffff, v2
; GFX6-NEXT: v_lshlrev_b32_e32 v5, 16, v5
+; GFX6-NEXT: v_and_b32_e32 v3, 0xffff, v3
; GFX6-NEXT: v_or_b32_e32 v2, v2, v5
+; GFX6-NEXT: v_xor_b32_e32 v3, 0xfff5, v3
; GFX6-NEXT: v_and_b32_e32 v0, 0xffff, v0
; GFX6-NEXT: v_lshlrev_b32_e32 v4, 16, v4
+; GFX6-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX6-NEXT: v_xor_b32_e32 v2, -1, v2
; GFX6-NEXT: v_or_b32_e32 v0, v0, v4
-; GFX6-NEXT: v_and_b32_e32 v3, 0xffff, v3
-; GFX6-NEXT: v_or_b32_e32 v0, v0, v2
-; GFX6-NEXT: v_xor_b32_e32 v3, 0xfff5, v3
-; GFX6-NEXT: v_and_b32_e32 v1, 0xffff, v1
-; GFX6-NEXT: v_lshrrev_b32_e32 v2, 16, v0
; GFX6-NEXT: v_or_b32_e32 v1, v1, v3
-; GFX6-NEXT: v_and_b32_e32 v0, 0xffff, v0
-; GFX6-NEXT: v_lshlrev_b32_e32 v2, 16, v2
; GFX6-NEXT: v_or_b32_e32 v0, v0, v2
; GFX6-NEXT: v_and_b32_e32 v1, 0xffff, v1
; GFX6-NEXT: s_setpc_b64 s[30:31]
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/true16-merge-values-s16.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/true16-merge-values-s16.ll
index 43351a8217879..3f98ce371f3fc 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/true16-merge-values-s16.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/true16-merge-values-s16.ll
@@ -9,9 +9,6 @@ define amdgpu_ps i48 @test_merge_values_sgpr(<3 x i16> inreg %src0, <3 x i16> in
; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
; GFX11-NEXT: s_xor_b64 s[0:1], s[4:5], s[0:1]
; GFX11-NEXT: s_and_b64 s[0:1], s[2:3], s[0:1]
-; GFX11-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
-; GFX11-NEXT: s_lshr_b32 s2, s0, 16
-; GFX11-NEXT: s_pack_ll_b32_b16 s0, s0, s2
; GFX11-NEXT: ; return to shader part epilog
;
; GFX12-LABEL: test_merge_values_sgpr:
@@ -20,9 +17,6 @@ define amdgpu_ps i48 @test_merge_values_sgpr(<3 x i16> inreg %src0, <3 x i16> in
; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
; GFX12-NEXT: s_xor_b64 s[0:1], s[4:5], s[0:1]
; GFX12-NEXT: s_and_b64 s[0:1], s[2:3], s[0:1]
-; GFX12-NEXT: s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(SALU_CYCLE_1)
-; GFX12-NEXT: s_lshr_b32 s2, s0, 16
-; GFX12-NEXT: s_pack_ll_b32_b16 s0, s0, s2
; GFX12-NEXT: ; return to shader part epilog
%not.src1 = xor <3 x i16> %src1, <i16 -1, i16 -1, i16 -1>
%and = and <3 x i16> %src0, %not.src1
diff --git a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.intersect_ray.ll b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.intersect_ray.ll
index d8117b76fb576..f0431639a5c11 100644
--- a/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.intersect_ray.ll
+++ b/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.intersect_ray.ll
@@ -227,17 +227,14 @@ define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16(i32 inreg %node_ptr, f
; GFX1013-GISEL-LABEL: image_bvh_intersect_ray_a16:
; GFX1013-GISEL: ; %bb.0: ; %main_body
; GFX1013-GISEL-NEXT: s_and_b32 s8, s8, 0xffff
-; GFX1013-GISEL-NEXT: s_mov_b32 s16, s9
+; GFX1013-GISEL-NEXT: s_and_b32 s6, s6, 0xffff
; GFX1013-GISEL-NEXT: v_alignbit_b32 v0, s8, s7, 16
-; GFX1013-GISEL-NEXT: s_lshr_b32 s9, s5, 16
-; GFX1013-GISEL-NEXT: s_and_b32 s5, s5, 0xffff
-; GFX1013-GISEL-NEXT: s_lshl_b32 s8, s9, 16
-; GFX1013-GISEL-NEXT: s_and_b32 s9, s7, 0xffff
+; GFX1013-GISEL-NEXT: s_and_b32 s8, s7, 0xffff
+; GFX1013-GISEL-NEXT: s_mov_b32 s16, s9
+; GFX1013-GISEL-NEXT: s_lshl_b32 s8, s8, 16
+; GFX1013-GISEL-NEXT: s_mov_b32 s17, s10
; GFX1013-GISEL-NEXT: v_readfirstlane_b32 s7, v0
-; GFX1013-GISEL-NEXT: s_and_b32 s6, s6, 0xffff
-; GFX1013-GISEL-NEXT: s_lshl_b32 s9, s9, 16
-; GFX1013-GISEL-NEXT: s_or_b32 s5, s5, s8
-; GFX1013-GISEL-NEXT: s_or_b32 s6, s6, s9
+; GFX1013-GISEL-NEXT: s_or_b32 s6, s6, s8
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v0, s0
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v1, s1
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v2, s2
@@ -246,7 +243,6 @@ define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16(i32 inreg %node_ptr, f
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v5, s5
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v6, s6
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v7, s7
-; GFX1013-GISEL-NEXT: s_mov_b32 s17, s10
; GFX1013-GISEL-NEXT: s_mov_b32 s18, s11
; GFX1013-GISEL-NEXT: s_mov_b32 s19, s12
; GFX1013-GISEL-NEXT: image_bvh_intersect_ray v[0:3], v[0:7], s[16:19] a16
@@ -264,16 +260,12 @@ define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16(i32 inreg %node_ptr, f
; GFX1030-GISEL-LABEL: image_bvh_intersect_ray_a16:
; GFX1030-GISEL: ; %bb.0: ; %main_body
; GFX1030-GISEL-NEXT: s_mov_b32 s16, s9
-; GFX1030-GISEL-NEXT: s_lshr_b32 s9, s5, 16
-; GFX1030-GISEL-NEXT: s_and_b32 s5, s5, 0xffff
-; GFX1030-GISEL-NEXT: s_lshl_b32 s9, s9, 16
-; GFX1030-GISEL-NEXT: s_and_b32 s6, s6, 0xffff
-; GFX1030-GISEL-NEXT: s_or_b32 s5, s5, s9
; GFX1030-GISEL-NEXT: s_and_b32 s9, s7, 0xffff
-; GFX1030-GISEL-NEXT: s_and_b32 s8, s8, 0xffff
+; GFX1030-GISEL-NEXT: s_and_b32 s6, s6, 0xffff
; GFX1030-GISEL-NEXT: s_lshl_b32 s9, s9, 16
-; GFX1030-GISEL-NEXT: v_alignbit_b32 v7, s8, s7, 16
+; GFX1030-GISEL-NEXT: s_and_b32 s8, s8, 0xffff
; GFX1030-GISEL-NEXT: s_or_b32 s6, s6, s9
+; GFX1030-GISEL-NEXT: v_alignbit_b32 v7, s8, s7, 16
; GFX1030-GISEL-NEXT: v_mov_b32_e32 v0, s0
; GFX1030-GISEL-NEXT: v_mov_b32_e32 v1, s1
; GFX1030-GISEL-NEXT: v_mov_b32_e32 v2, s2
@@ -529,17 +521,14 @@ define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16(i64 inreg %node_ptr,
; GFX1013-GISEL-LABEL: image_bvh64_intersect_ray_a16:
; GFX1013-GISEL: ; %bb.0: ; %main_body
; GFX1013-GISEL-NEXT: s_and_b32 s9, s9, 0xffff
-; GFX1013-GISEL-NEXT: s_mov_b32 s16, s10
+; GFX1013-GISEL-NEXT: s_and_b32 s7, s7, 0xffff
; GFX1013-GISEL-NEXT: v_alignbit_b32 v0, s9, s8, 16
-; GFX1013-GISEL-NEXT: s_lshr_b32 s10, s6, 16
-; GFX1013-GISEL-NEXT: s_and_b32 s6, s6, 0xffff
-; GFX1013-GISEL-NEXT: s_lshl_b32 s9, s10, 16
-; GFX1013-GISEL-NEXT: s_and_b32 s10, s8, 0xffff
+; GFX1013-GISEL-NEXT: s_and_b32 s9, s8, 0xffff
+; GFX1013-GISEL-NEXT: s_mov_b32 s16, s10
+; GFX1013-GISEL-NEXT: s_lshl_b32 s9, s9, 16
+; GFX1013-GISEL-NEXT: s_mov_b32 s17, s11
; GFX1013-GISEL-NEXT: v_readfirstlane_b32 s8, v0
-; GFX1013-GISEL-NEXT: s_and_b32 s7, s7, 0xffff
-; GFX1013-GISEL-NEXT: s_lshl_b32 s10, s10, 16
-; GFX1013-GISEL-NEXT: s_or_b32 s6, s6, s9
-; GFX1013-GISEL-NEXT: s_or_b32 s7, s7, s10
+; GFX1013-GISEL-NEXT: s_or_b32 s7, s7, s9
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v0, s0
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v1, s1
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v2, s2
@@ -549,7 +538,6 @@ define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16(i64 inreg %node_ptr,
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v6, s6
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v7, s7
; GFX1013-GISEL-NEXT: v_mov_b32_e32 v8, s8
-; GFX1013-GISEL-NEXT: s_mov_b32 s17, s11
; GFX1013-GISEL-NEXT: s_mov_b32 s18, s12
; GFX1013-GISEL-NEXT: s_mov_b32 s19, s13
; GFX1013-GISEL-NEXT: image_bvh64_intersect_ray v[0:3], v[0:8], s[16:19] a16
@@ -567,16 +555,12 @@ define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16(i64 inreg %node_ptr,
; GFX1030-GISEL-LABEL: image_bvh64_intersect_ray_a16:
; GFX1030-GISEL: ; %bb.0: ; %main_body
; GFX1030-GISEL-NEXT: s_mov_b32 s16, s10
-; GFX1030-GISEL-NEXT: s_lshr_b32 s10, s6, 16
-; GFX1030-GISEL-NEXT: s_and_b32 s6, s6, 0xffff
-; GFX1030-GISEL-NEXT: s_lshl_b32 s10, s10, 16
-; GFX1030-GISEL-NEXT: s_and_b32 s7, s7, 0xffff
-; GFX1030-GISEL-NEXT: s_or_b32 s6, s6, s10
; GFX1030-GISEL-NEXT: s_and_b32 s10, s8, 0xffff
-; GFX1030-GISEL-NEXT: s_and_b32 s9, s9, 0xffff
+; GFX1030-GISEL-NEXT: s_and_b32 s7, s7, 0xffff
; GFX1030-GISEL-NEXT: s_lshl_b32 s10, s10, 16
-; GFX1030-GISEL-NEXT: v_alignbit_b32 v8, s9, s8, 16
+; GFX1030-GISEL-NEXT: s_and_b32 s9, s9, 0xffff
; GFX1030-GISEL-NEXT: s_or_b32 s7, s7, s10
+; GFX1030-GISEL-NEXT: v_alignbit_b32 v8, s9, s8, 16
; GFX1030-GISEL-NEXT: v_mov_b32_e32 v0, s0
; GFX1030-GISEL-NEXT: v_mov_b32_e32 v1, s1
; GFX1030-GISEL-NEXT: v_mov_b32_e32 v2, s2
More information about the llvm-commits
mailing list