Skip to content

Commit 1704d82

Browse files
committed
[GISel] Fix ShuffleVector assert
Fixes issue: #139752 When G_SHUFFLE_VECTOR has only 1 element then it is possible the vector is decayed into a scalar.
1 parent a7aca81 commit 1704d82

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,8 +420,12 @@ void CombinerHelper::applyCombineShuffleToBuildVector(MachineInstr &MI) const {
420420
else
421421
Extracts.push_back(Unmerge2.getReg(Val - Width));
422422
}
423-
424-
Builder.buildBuildVector(MI.getOperand(0).getReg(), Extracts);
423+
assert(Extracts.size() > 0 && "Expected at least one element in the shuffle");
424+
if (Extracts.size() == 1) {
425+
Builder.buildCopy(MI.getOperand(0).getReg(), Extracts[0]);
426+
} else {
427+
Builder.buildBuildVector(MI.getOperand(0).getReg(), Extracts);
428+
}
425429
MI.eraseFromParent();
426430
}
427431

llvm/test/CodeGen/AMDGPU/GlobalISel/prelegalizer-combiner-shuffle.mir

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,27 @@ body: |
135135
SI_RETURN
136136
...
137137

138+
139+
---
140+
name: shuffle_vector_to_copy
141+
tracksRegLiveness: true
142+
body: |
143+
bb.0:
144+
liveins: $vgpr0, $vgpr1
145+
; CHECK-LABEL: name: shuffle_vector_to_copy
146+
; CHECK: liveins: $vgpr0, $vgpr1
147+
; CHECK-NEXT: {{ $}}
148+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p3) = COPY $vgpr0
149+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p3) = COPY $vgpr1
150+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(<8 x s16>) = G_LOAD [[COPY]](p3) :: (load (<8 x s16>), align 8, addrspace 3)
151+
; CHECK-NEXT: [[UV:%[0-9]+]]:_(s16), [[UV1:%[0-9]+]]:_(s16), [[UV2:%[0-9]+]]:_(s16), [[UV3:%[0-9]+]]:_(s16), [[UV4:%[0-9]+]]:_(s16), [[UV5:%[0-9]+]]:_(s16), [[UV6:%[0-9]+]]:_(s16), [[UV7:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[LOAD]](<8 x s16>)
152+
; CHECK-NEXT: G_STORE [[UV4]](s16), [[COPY1]](p3) :: (store (s16), addrspace 3)
153+
; CHECK-NEXT: SI_RETURN
154+
%0:_(p3) = COPY $vgpr0
155+
%1:_(p3) = COPY $vgpr1
156+
%12:_(<8 x s16>) = G_IMPLICIT_DEF
157+
%10:_(<8 x s16>) = G_LOAD %0(p3) :: (load (<8 x s16>), align 8, addrspace 3)
158+
%11:_(s16) = G_SHUFFLE_VECTOR %10(<8 x s16>), %12, shufflemask(4)
159+
G_STORE %11(s16), %1(p3) :: (store (s16), addrspace 3)
160+
SI_RETURN
161+
...

0 commit comments

Comments
 (0)