Skip to content

Commit 1a276d1

Browse files
committed
GlobalISel: Implement widenScalar for G_INSERT_VECTOR_ELT
1 parent e8a0a09 commit 1a276d1

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,10 +1789,35 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
17891789
if (TypeIdx != 2)
17901790
return UnableToLegalize;
17911791
Observer.changingInstr(MI);
1792+
// TODO: Probably should be zext
17921793
widenScalarSrc(MI, WideTy, 2, TargetOpcode::G_SEXT);
17931794
Observer.changedInstr(MI);
17941795
return Legalized;
17951796
}
1797+
case TargetOpcode::G_INSERT_VECTOR_ELT: {
1798+
if (TypeIdx == 1) {
1799+
Observer.changingInstr(MI);
1800+
1801+
Register VecReg = MI.getOperand(1).getReg();
1802+
LLT VecTy = MRI.getType(VecReg);
1803+
LLT WideVecTy = LLT::vector(VecTy.getNumElements(), WideTy);
1804+
1805+
widenScalarSrc(MI, WideVecTy, 1, TargetOpcode::G_ANYEXT);
1806+
widenScalarSrc(MI, WideTy, 2, TargetOpcode::G_ANYEXT);
1807+
widenScalarDst(MI, WideVecTy, 0);
1808+
Observer.changedInstr(MI);
1809+
return Legalized;
1810+
}
1811+
1812+
if (TypeIdx == 2) {
1813+
Observer.changingInstr(MI);
1814+
// TODO: Probably should be zext
1815+
widenScalarSrc(MI, WideTy, 3, TargetOpcode::G_SEXT);
1816+
Observer.changedInstr(MI);
1817+
}
1818+
1819+
return Legalized;
1820+
}
17961821
case TargetOpcode::G_FADD:
17971822
case TargetOpcode::G_FMUL:
17981823
case TargetOpcode::G_FSUB:

llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-insert-vector-elt.mir

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,51 @@ body: |
115115
%3:_(<16 x s64>) = G_INSERT_VECTOR_ELT %1, %0, %2
116116
S_ENDPGM 0, implicit %3
117117
...
118+
119+
---
120+
name: insert_vector_elt_0_v2s32_s8
121+
122+
body: |
123+
bb.0:
124+
liveins: $vgpr0_vgpr1, $vgpr2
125+
126+
; CHECK-LABEL: name: insert_vector_elt_0_v2s32_s8
127+
; CHECK: [[COPY:%[0-9]+]]:_(<2 x s32>) = COPY $vgpr0_vgpr1
128+
; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr2
129+
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
130+
; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[C]](s32)
131+
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24
132+
; CHECK: [[SHL:%[0-9]+]]:_(s32) = G_SHL [[COPY2]], [[C1]](s32)
133+
; CHECK: [[ASHR:%[0-9]+]]:_(s32) = G_ASHR [[SHL]], [[C1]](s32)
134+
; CHECK: [[IVEC:%[0-9]+]]:_(<2 x s32>) = G_INSERT_VECTOR_ELT [[COPY]], [[COPY1]](s32), [[ASHR]](s32)
135+
; CHECK: $vgpr0_vgpr1 = COPY [[IVEC]](<2 x s32>)
136+
%0:_(<2 x s32>) = COPY $vgpr0_vgpr1
137+
%1:_(s32) = COPY $vgpr2
138+
%2:_(s8) = G_CONSTANT i8 0
139+
%3:_(<2 x s32>) = G_INSERT_VECTOR_ELT %0, %1, %2
140+
$vgpr0_vgpr1 = COPY %3
141+
...
142+
143+
---
144+
name: insert_vector_elt_0_v2i8_i32
145+
146+
body: |
147+
bb.0:
148+
liveins: $vgpr0
149+
150+
; CHECK-LABEL: name: insert_vector_elt_0_v2i8_i32
151+
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
152+
; CHECK: [[DEF:%[0-9]+]]:_(<2 x s32>) = G_IMPLICIT_DEF
153+
; CHECK: [[COPY1:%[0-9]+]]:_(<2 x s32>) = COPY [[DEF]](<2 x s32>)
154+
; CHECK: [[COPY2:%[0-9]+]]:_(s32) = COPY [[COPY]](s32)
155+
; CHECK: [[INSERT:%[0-9]+]]:_(<2 x s32>) = G_INSERT [[COPY1]], [[COPY2]](s32), 0
156+
; CHECK: [[COPY3:%[0-9]+]]:_(<2 x s32>) = COPY [[INSERT]](<2 x s32>)
157+
; CHECK: $vgpr0_vgpr1 = COPY [[COPY3]](<2 x s32>)
158+
%0:_(s32) = COPY $vgpr0
159+
%1:_(s8) = G_TRUNC %0
160+
%2:_(<2 x s8>) = G_IMPLICIT_DEF
161+
%3:_(s32) = G_CONSTANT i32 0
162+
%4:_(<2 x s8>) = G_INSERT_VECTOR_ELT %2, %1, %3
163+
%5:_(<2 x s32>) = G_ANYEXT %4
164+
$vgpr0_vgpr1 = COPY %5
165+
...

0 commit comments

Comments
 (0)