@@ -165,32 +165,47 @@ define void @test_shrink_zext_in_preheader(ptr noalias %src, ptr noalias %dst, i
165
165
; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <16 x i32> poison, i32 [[A]], i64 0
166
166
; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <16 x i32> [[BROADCAST_SPLATINSERT]], <16 x i32> poison, <16 x i32> zeroinitializer
167
167
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <16 x i16> undef, i16 [[B]], i64 0
168
- ; CHECK-NEXT: [[TMP1 :%.*]] = shufflevector <16 x i16> [[TMP0]], <16 x i16> poison, <16 x i32> zeroinitializer
168
+ ; CHECK-NEXT: [[BROADCAST_SPLAT2 :%.*]] = shufflevector <16 x i16> [[TMP0]], <16 x i16> poison, <16 x i32> zeroinitializer
169
169
; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
170
170
; CHECK: vector.body:
171
171
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
172
- ; CHECK-NEXT: [[TMP2:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
173
- ; CHECK-NEXT: [[TMP3:%.*]] = mul <16 x i16> [[TMP1]], [[TMP2]]
174
- ; CHECK-NEXT: [[TMP4:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
175
- ; CHECK-NEXT: [[TMP5:%.*]] = mul <16 x i16> [[TMP1]], [[TMP4]]
176
- ; CHECK-NEXT: [[TMP6:%.*]] = lshr <16 x i16> [[TMP3]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
177
- ; CHECK-NEXT: [[TMP7:%.*]] = lshr <16 x i16> [[TMP5]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
172
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
173
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul <16 x i16> [[BROADCAST_SPLAT2]], [[TMP1]]
174
+ ; CHECK-NEXT: [[TMP3:%.*]] = trunc <16 x i32> [[BROADCAST_SPLAT]] to <16 x i16>
175
+ ; CHECK-NEXT: [[TMP4:%.*]] = mul <16 x i16> [[BROADCAST_SPLAT2]], [[TMP3]]
176
+ ; CHECK-NEXT: [[TMP5:%.*]] = lshr <16 x i16> [[TMP2]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
177
+ ; CHECK-NEXT: [[TMP6:%.*]] = lshr <16 x i16> [[TMP4]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
178
+ ; CHECK-NEXT: [[TMP7:%.*]] = trunc <16 x i16> [[TMP5]] to <16 x i8>
178
179
; CHECK-NEXT: [[TMP8:%.*]] = trunc <16 x i16> [[TMP6]] to <16 x i8>
179
- ; CHECK-NEXT: [[TMP9:%.*]] = trunc <16 x i16> [[TMP7]] to <16 x i8>
180
- ; CHECK-NEXT: [[TMP10:%.*]] = sext i32 [[INDEX]] to i64
181
- ; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP10]]
180
+ ; CHECK-NEXT: [[TMP9:%.*]] = sext i32 [[INDEX]] to i64
181
+ ; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP9]]
182
+ ; CHECK-NEXT: store <16 x i8> [[TMP7]], ptr [[TMP10]], align 1
183
+ ; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds i8, ptr [[TMP10]], i64 16
182
184
; CHECK-NEXT: store <16 x i8> [[TMP8]], ptr [[TMP11]], align 1
183
- ; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[TMP11]], i64 16
184
- ; CHECK-NEXT: store <16 x i8> [[TMP9]], ptr [[TMP12]], align 1
185
185
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 32
186
+ ; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
187
+ ; CHECK-NEXT: br i1 [[TMP12]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]
186
188
; CHECK: middle.block:
187
189
; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
188
190
; CHECK: vec.epilog.iter.check:
189
191
; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
190
192
; CHECK: vec.epilog.ph:
191
- ; CHECK-NEXT: [[TMP14 :%.*]] = insertelement <8 x i16> undef, i16 [[B]], i64 0
193
+ ; CHECK-NEXT: [[TMP13 :%.*]] = insertelement <8 x i16> undef, i16 [[B]], i64 0
192
194
; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
193
195
; CHECK: vec.epilog.vector.body:
196
+ ; CHECK-NEXT: [[INDEX4:%.*]] = phi i32 [ 992, [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT9:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
197
+ ; CHECK-NEXT: [[TMP14:%.*]] = trunc i32 [[A]] to i16
198
+ ; CHECK-NEXT: [[TMP15:%.*]] = insertelement <8 x i16> undef, i16 [[TMP14]], i64 0
199
+ ; CHECK-NEXT: [[TMP16:%.*]] = mul <8 x i16> [[TMP15]], [[TMP13]]
200
+ ; CHECK-NEXT: [[TMP17:%.*]] = lshr <8 x i16> [[TMP16]], <i16 8, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0>
201
+ ; CHECK-NEXT: [[TMP18:%.*]] = trunc <8 x i16> [[TMP17]] to <8 x i8>
202
+ ; CHECK-NEXT: [[TMP19:%.*]] = shufflevector <8 x i8> [[TMP18]], <8 x i8> poison, <8 x i32> zeroinitializer
203
+ ; CHECK-NEXT: [[TMP20:%.*]] = sext i32 [[INDEX4]] to i64
204
+ ; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP20]]
205
+ ; CHECK-NEXT: store <8 x i8> [[TMP19]], ptr [[TMP21]], align 1
206
+ ; CHECK-NEXT: [[INDEX_NEXT9]] = add nuw i32 [[INDEX4]], 8
207
+ ; CHECK-NEXT: [[TMP22:%.*]] = icmp eq i32 [[INDEX_NEXT9]], 1000
208
+ ; CHECK-NEXT: br i1 [[TMP22]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
194
209
; CHECK: vec.epilog.middle.block:
195
210
; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
196
211
; CHECK: vec.epilog.scalar.ph:
@@ -221,3 +236,79 @@ loop:
221
236
exit:
222
237
ret void
223
238
}
239
+
240
+ define void @test_shrink_select (ptr noalias %src , ptr noalias %dst , i32 %A , i1 %c ) {
241
+ ; CHECK-LABEL: define void @test_shrink_select
242
+ ; CHECK-SAME: (ptr noalias [[SRC:%.*]], ptr noalias [[DST:%.*]], i32 [[A:%.*]], i1 [[C:%.*]]) {
243
+ ; CHECK-NEXT: iter.check:
244
+ ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH:%.*]], label [[VECTOR_MAIN_LOOP_ITER_CHECK:%.*]]
245
+ ; CHECK: vector.main.loop.iter.check:
246
+ ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_PH:%.*]], label [[VECTOR_PH:%.*]]
247
+ ; CHECK: vector.ph:
248
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
249
+ ; CHECK: vector.body:
250
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
251
+ ; CHECK-NEXT: [[TMP0:%.*]] = trunc i32 [[A]] to i16
252
+ ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <16 x i16> undef, i16 [[TMP0]], i64 0
253
+ ; CHECK-NEXT: [[TMP2:%.*]] = mul <16 x i16> [[TMP1]], <i16 99, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison>
254
+ ; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <16 x i16> [[TMP2]], <16 x i16> poison, <16 x i32> zeroinitializer
255
+ ; CHECK-NEXT: [[TMP4:%.*]] = lshr <16 x i16> [[TMP3]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
256
+ ; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[C]], <16 x i16> [[TMP4]], <16 x i16> [[TMP3]]
257
+ ; CHECK-NEXT: [[TMP6:%.*]] = trunc <16 x i16> [[TMP5]] to <16 x i8>
258
+ ; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[INDEX]] to i64
259
+ ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP7]]
260
+ ; CHECK-NEXT: store <16 x i8> [[TMP6]], ptr [[TMP8]], align 1
261
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 16
262
+ ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[INDEX_NEXT]], 992
263
+ ; CHECK-NEXT: br i1 [[TMP9]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
264
+ ; CHECK: middle.block:
265
+ ; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[VEC_EPILOG_ITER_CHECK:%.*]]
266
+ ; CHECK: vec.epilog.iter.check:
267
+ ; CHECK-NEXT: br i1 false, label [[VEC_EPILOG_SCALAR_PH]], label [[VEC_EPILOG_PH]]
268
+ ; CHECK: vec.epilog.ph:
269
+ ; CHECK-NEXT: br label [[VEC_EPILOG_VECTOR_BODY:%.*]]
270
+ ; CHECK: vec.epilog.vector.body:
271
+ ; CHECK-NEXT: [[INDEX2:%.*]] = phi i32 [ 992, [[VEC_EPILOG_PH]] ], [ [[INDEX_NEXT5:%.*]], [[VEC_EPILOG_VECTOR_BODY]] ]
272
+ ; CHECK-NEXT: [[TMP10:%.*]] = trunc i32 [[A]] to i16
273
+ ; CHECK-NEXT: [[TMP11:%.*]] = insertelement <8 x i16> undef, i16 [[TMP10]], i64 0
274
+ ; CHECK-NEXT: [[TMP12:%.*]] = mul <8 x i16> [[TMP11]], <i16 99, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison, i16 poison>
275
+ ; CHECK-NEXT: [[TMP13:%.*]] = shufflevector <8 x i16> [[TMP12]], <8 x i16> poison, <8 x i32> zeroinitializer
276
+ ; CHECK-NEXT: [[TMP14:%.*]] = lshr <8 x i16> [[TMP13]], <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
277
+ ; CHECK-NEXT: [[TMP15:%.*]] = select i1 [[C]], <8 x i16> [[TMP14]], <8 x i16> [[TMP13]]
278
+ ; CHECK-NEXT: [[TMP16:%.*]] = trunc <8 x i16> [[TMP15]] to <8 x i8>
279
+ ; CHECK-NEXT: [[TMP17:%.*]] = sext i32 [[INDEX2]] to i64
280
+ ; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[TMP17]]
281
+ ; CHECK-NEXT: store <8 x i8> [[TMP16]], ptr [[TMP18]], align 1
282
+ ; CHECK-NEXT: [[INDEX_NEXT5]] = add nuw i32 [[INDEX2]], 8
283
+ ; CHECK-NEXT: [[TMP19:%.*]] = icmp eq i32 [[INDEX_NEXT5]], 1000
284
+ ; CHECK-NEXT: br i1 [[TMP19]], label [[VEC_EPILOG_MIDDLE_BLOCK:%.*]], label [[VEC_EPILOG_VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]
285
+ ; CHECK: vec.epilog.middle.block:
286
+ ; CHECK-NEXT: br i1 true, label [[EXIT]], label [[VEC_EPILOG_SCALAR_PH]]
287
+ ; CHECK: vec.epilog.scalar.ph:
288
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
289
+ ; CHECK: loop:
290
+ ; CHECK-NEXT: br i1 poison, label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP10:![0-9]+]]
291
+ ; CHECK: exit:
292
+ ; CHECK-NEXT: ret void
293
+ ;
294
+ entry:
295
+ br label %loop
296
+
297
+ loop:
298
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
299
+ %gep.src = getelementptr inbounds i16 , ptr %src , i32 %iv
300
+ %l = load i16 , ptr %gep.src
301
+ %conv4111 = zext i16 %l to i32
302
+ %mul = mul i32 %A , 99
303
+ %shr = lshr i32 %mul , 8
304
+ %sel = select i1 %c , i32 %shr , i32 %mul
305
+ %conv5 = trunc i32 %sel to i8
306
+ %gep.dst = getelementptr inbounds i8 , ptr %dst , i32 %iv
307
+ store i8 %conv5 , ptr %gep.dst , align 1
308
+ %iv.next = add i32 %iv , 1
309
+ %exitcond.not = icmp eq i32 %iv.next , 1000
310
+ br i1 %exitcond.not , label %exit , label %loop
311
+
312
+ exit:
313
+ ret void
314
+ }
0 commit comments