@@ -232,3 +232,40 @@ loop:
232
232
exit:
233
233
ret void
234
234
}
235
+
236
+ define i16 @reduction_with_casts () {
237
+ ; CHECK-LABEL: define i16 @reduction_with_casts() {
238
+ ; CHECK: vector.body:
239
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ 0, [[VECTOR_PH:%.+]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY:%.+]] ]
240
+ ; CHECK-NEXT: [[VEC_PHI:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP2:%.*]], [[VECTOR_BODY]] ]
241
+ ; CHECK-NEXT: [[VEC_PHI1:%.*]] = phi i32 [ 0, [[VECTOR_PH]] ], [ [[TMP3:%.*]], [[VECTOR_BODY]] ]
242
+ ; CHECK-NEXT: [[TMP0:%.*]] = and i32 [[VEC_PHI]], 65535
243
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[VEC_PHI1]], 65535
244
+ ; CHECK-NEXT: [[TMP2]] = add i32 [[TMP0]], 1
245
+ ; CHECK-NEXT: [[TMP3]] = add i32 [[TMP1]], 1
246
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
247
+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 9998
248
+ ; CHECK-NEXT: br i1 [[TMP4]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]]
249
+ ; CHECK: middle.block:
250
+ ; CHECK-NEXT: [[BIN_RDX:%.*]] = add i32 [[TMP3]], [[TMP2]]
251
+ ; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label %scalar.ph
252
+ ;
253
+ entry:
254
+ br label %loop
255
+
256
+ loop:
257
+ %count.0.in1 = phi i32 [ 0 , %entry ], [ %add , %loop ]
258
+ %iv = phi i16 [ 1 , %entry ], [ %iv.next , %loop ]
259
+ %conv1 = and i32 %count.0.in1 , 65535
260
+ %add = add nuw nsw i32 %conv1 , 1
261
+ %iv.next = add i16 %iv , 1
262
+ %cmp = icmp eq i16 %iv.next , 10000
263
+ br i1 %cmp , label %exit , label %loop
264
+
265
+ exit:
266
+ %add.lcssa = phi i32 [ %add , %loop ]
267
+ %count.0 = trunc i32 %add.lcssa to i16
268
+ ret i16 %count.0
269
+ }
270
+ ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
271
+ ; DBG: {{.*}}
0 commit comments