@@ -248,22 +248,29 @@ for.end: ; preds = %for.body
248248;
249249@cm_array = external global [2592 x i16 ], align 1
250250
251- define void @pr43371 () optsize {
251+ define void @pr43371 (i16 %val ) optsize {
252252;
253253; CHECK-LABEL: define void @pr43371(
254- ; CHECK-SAME: ) #[[ATTR0]] {
254+ ; CHECK-SAME: i16 [[VAL:%.*]] ) #[[ATTR0]] {
255255; CHECK-NEXT: [[ENTRY:.*:]]
256256; CHECK-NEXT: br label %[[VECTOR_PH:.*]]
257257; CHECK: [[VECTOR_PH]]:
258+ ; CHECK-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i16> poison, i16 [[VAL]], i64 0
259+ ; CHECK-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i16> [[BROADCAST_SPLATINSERT]], <2 x i16> poison, <2 x i32> zeroinitializer
258260; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
259261; CHECK: [[VECTOR_BODY]]:
260262; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
261- ; CHECK-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
262- ; CHECK-NEXT: [[TMP0:%.*]] = add i16 3, [[OFFSET_IDX]]
263- ; CHECK-NEXT: [[TMP4:%.*]] = zext i16 [[TMP0]] to i32
263+ ; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i16> [ <i16 0, i16 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
264+ ; CHECK-NEXT: [[TMP0:%.*]] = add <2 x i16> [[BROADCAST_SPLAT]], [[VEC_IND]]
265+ ; CHECK-NEXT: [[TMP1:%.*]] = zext <2 x i16> [[TMP0]] to <2 x i32>
266+ ; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i32> [[TMP1]], i32 0
267+ ; CHECK-NEXT: [[TMP3:%.*]] = extractelement <2 x i32> [[TMP1]], i32 1
264268; CHECK-NEXT: [[TMP5:%.*]] = getelementptr [2592 x i16], ptr @cm_array, i32 0, i32 [[TMP4]]
265- ; CHECK-NEXT: store <2 x i16> zeroinitializer, ptr [[TMP5]], align 1
269+ ; CHECK-NEXT: [[TMP7:%.*]] = getelementptr [2592 x i16], ptr @cm_array, i32 0, i32 [[TMP3]]
270+ ; CHECK-NEXT: store i16 0, ptr [[TMP5]], align 1
271+ ; CHECK-NEXT: store i16 0, ptr [[TMP7]], align 1
266272; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
273+ ; CHECK-NEXT: [[VEC_IND_NEXT]] = add <2 x i16> [[VEC_IND]], splat (i16 2)
267274; CHECK-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 756
268275; CHECK-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
269276; CHECK: [[MIDDLE_BLOCK]]:
@@ -272,19 +279,26 @@ define void @pr43371() optsize {
272279; CHECK-NEXT: unreachable
273280;
274281; PGSO-LABEL: define void @pr43371(
275- ; PGSO-SAME: ) #[[ATTR0]] {
282+ ; PGSO-SAME: i16 [[VAL:%.*]] ) #[[ATTR0]] {
276283; PGSO-NEXT: [[ENTRY:.*:]]
277284; PGSO-NEXT: br label %[[VECTOR_PH:.*]]
278285; PGSO: [[VECTOR_PH]]:
286+ ; PGSO-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i16> poison, i16 [[VAL]], i64 0
287+ ; PGSO-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i16> [[BROADCAST_SPLATINSERT]], <2 x i16> poison, <2 x i32> zeroinitializer
279288; PGSO-NEXT: br label %[[VECTOR_BODY:.*]]
280289; PGSO: [[VECTOR_BODY]]:
281290; PGSO-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
282- ; PGSO-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
283- ; PGSO-NEXT: [[TMP0:%.*]] = add i16 3, [[OFFSET_IDX]]
284- ; PGSO-NEXT: [[TMP4:%.*]] = zext i16 [[TMP0]] to i32
291+ ; PGSO-NEXT: [[VEC_IND:%.*]] = phi <2 x i16> [ <i16 0, i16 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
292+ ; PGSO-NEXT: [[TMP0:%.*]] = add <2 x i16> [[BROADCAST_SPLAT]], [[VEC_IND]]
293+ ; PGSO-NEXT: [[TMP1:%.*]] = zext <2 x i16> [[TMP0]] to <2 x i32>
294+ ; PGSO-NEXT: [[TMP4:%.*]] = extractelement <2 x i32> [[TMP1]], i32 0
295+ ; PGSO-NEXT: [[TMP3:%.*]] = extractelement <2 x i32> [[TMP1]], i32 1
285296; PGSO-NEXT: [[TMP5:%.*]] = getelementptr [2592 x i16], ptr @cm_array, i32 0, i32 [[TMP4]]
286- ; PGSO-NEXT: store <2 x i16> zeroinitializer, ptr [[TMP5]], align 1
297+ ; PGSO-NEXT: [[TMP7:%.*]] = getelementptr [2592 x i16], ptr @cm_array, i32 0, i32 [[TMP3]]
298+ ; PGSO-NEXT: store i16 0, ptr [[TMP5]], align 1
299+ ; PGSO-NEXT: store i16 0, ptr [[TMP7]], align 1
287300; PGSO-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
301+ ; PGSO-NEXT: [[VEC_IND_NEXT]] = add <2 x i16> [[VEC_IND]], splat (i16 2)
288302; PGSO-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 756
289303; PGSO-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP15:![0-9]+]]
290304; PGSO: [[MIDDLE_BLOCK]]:
@@ -293,19 +307,26 @@ define void @pr43371() optsize {
293307; PGSO-NEXT: unreachable
294308;
295309; NPGSO-LABEL: define void @pr43371(
296- ; NPGSO-SAME: ) #[[ATTR0]] {
310+ ; NPGSO-SAME: i16 [[VAL:%.*]] ) #[[ATTR0]] {
297311; NPGSO-NEXT: [[ENTRY:.*:]]
298312; NPGSO-NEXT: br label %[[VECTOR_PH:.*]]
299313; NPGSO: [[VECTOR_PH]]:
314+ ; NPGSO-NEXT: [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i16> poison, i16 [[VAL]], i64 0
315+ ; NPGSO-NEXT: [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i16> [[BROADCAST_SPLATINSERT]], <2 x i16> poison, <2 x i32> zeroinitializer
300316; NPGSO-NEXT: br label %[[VECTOR_BODY:.*]]
301317; NPGSO: [[VECTOR_BODY]]:
302318; NPGSO-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
303- ; NPGSO-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
304- ; NPGSO-NEXT: [[TMP0:%.*]] = add i16 3, [[OFFSET_IDX]]
305- ; NPGSO-NEXT: [[TMP4:%.*]] = zext i16 [[TMP0]] to i32
319+ ; NPGSO-NEXT: [[VEC_IND:%.*]] = phi <2 x i16> [ <i16 0, i16 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
320+ ; NPGSO-NEXT: [[TMP0:%.*]] = add <2 x i16> [[BROADCAST_SPLAT]], [[VEC_IND]]
321+ ; NPGSO-NEXT: [[TMP1:%.*]] = zext <2 x i16> [[TMP0]] to <2 x i32>
322+ ; NPGSO-NEXT: [[TMP4:%.*]] = extractelement <2 x i32> [[TMP1]], i32 0
323+ ; NPGSO-NEXT: [[TMP3:%.*]] = extractelement <2 x i32> [[TMP1]], i32 1
306324; NPGSO-NEXT: [[TMP5:%.*]] = getelementptr [2592 x i16], ptr @cm_array, i32 0, i32 [[TMP4]]
307- ; NPGSO-NEXT: store <2 x i16> zeroinitializer, ptr [[TMP5]], align 1
325+ ; NPGSO-NEXT: [[TMP7:%.*]] = getelementptr [2592 x i16], ptr @cm_array, i32 0, i32 [[TMP3]]
326+ ; NPGSO-NEXT: store i16 0, ptr [[TMP5]], align 1
327+ ; NPGSO-NEXT: store i16 0, ptr [[TMP7]], align 1
308328; NPGSO-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
329+ ; NPGSO-NEXT: [[VEC_IND_NEXT]] = add <2 x i16> [[VEC_IND]], splat (i16 2)
309330; NPGSO-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 756
310331; NPGSO-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]
311332; NPGSO: [[MIDDLE_BLOCK]]:
@@ -325,7 +346,7 @@ for.cond.cleanup28:
325346
326347for.body29:
327348 %i24.0170 = phi i16 [ 0 , %entry ], [ %inc37 , %for.body29 ]
328- %add33 = add i16 3 , %i24.0170
349+ %add33 = add i16 %val , %i24.0170
329350 %idxprom34 = zext i16 %add33 to i32
330351 %arrayidx35 = getelementptr [2592 x i16 ], ptr @cm_array , i32 0 , i32 %idxprom34
331352 store i16 0 , ptr %arrayidx35 , align 1
0 commit comments