@@ -417,6 +417,42 @@ for.body: ; preds = %for.body.lr.ph, %fo
417
417
}
418
418
419
419
define i32 @foo6 (ptr %input , i32 %length , ptr %in ) {
420
+ ; CHECK-LABEL: @foo6(
421
+ ; CHECK-NEXT: entry:
422
+ ; CHECK-NEXT: [[STRIDE:%.*]] = getelementptr inbounds [[STRUCT_IMAGE:%.*]], ptr [[INPUT:%.*]], i64 0, i32 1
423
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[STRIDE]], align 4
424
+ ; CHECK-NEXT: [[CMP17:%.*]] = icmp sgt i32 [[LENGTH:%.*]], 1
425
+ ; CHECK-NEXT: br i1 [[CMP17]], label [[FOR_BODY_LR_PH:%.*]], label [[FOR_COND_CLEANUP:%.*]]
426
+ ; CHECK: for.body.lr.ph:
427
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
428
+ ; CHECK-NEXT: [[WIDE_TRIP_COUNT:%.*]] = zext i32 [[LENGTH]] to i64
429
+ ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
430
+ ; CHECK: for.cond.cleanup.loopexit:
431
+ ; CHECK-NEXT: [[TMP2:%.*]] = phi i32 [ [[TMP12:%.*]], [[FOR_BODY]] ]
432
+ ; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
433
+ ; CHECK: for.cond.cleanup:
434
+ ; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[TMP2]], [[FOR_COND_CLEANUP_LOOPEXIT:%.*]] ]
435
+ ; CHECK-NEXT: ret i32 [[TMP3]]
436
+ ; CHECK: for.body:
437
+ ; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], [[FOR_BODY]] ], [ 1, [[FOR_BODY_LR_PH]] ]
438
+ ; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
439
+ ; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[LENGTH]], [[TMP0]]
440
+ ; CHECK-NEXT: [[TMP5:%.*]] = zext i32 [[TMP4]] to i64
441
+ ; CHECK-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], [[INDVARS_IV_NEXT]]
442
+ ; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr [[IN:%.*]], i64 [[TMP6]]
443
+ ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[ADD_PTR]], align 4
444
+ ; CHECK-NEXT: [[TMP8:%.*]] = mul nuw i64 [[TMP1]], [[INDVARS_IV_NEXT]]
445
+ ; CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds i32, ptr [[IN]], i64 [[TMP8]]
446
+ ; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ADD_PTR1]], align 4
447
+ ; CHECK-NEXT: [[OR:%.*]] = or i32 [[LENGTH]], [[TMP9]]
448
+ ; CHECK-NEXT: [[TMP10:%.*]] = zext i32 [[OR]] to i64
449
+ ; CHECK-NEXT: [[TMP11:%.*]] = sub nuw i64 [[TMP10]], [[INDVARS_IV_NEXT]]
450
+ ; CHECK-NEXT: [[PTR_OR:%.*]] = getelementptr inbounds i32, ptr [[IN]], i64 [[TMP11]]
451
+ ; CHECK-NEXT: [[VAL_OR:%.*]] = load i32, ptr [[PTR_OR]], align 4
452
+ ; CHECK-NEXT: [[TMP12]] = add i32 [[TMP7]], [[VAL_OR]]
453
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[WIDE_TRIP_COUNT]]
454
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP_LOOPEXIT]]
455
+ ;
420
456
entry:
421
457
%stride = getelementptr inbounds %struct.image , ptr %input , i64 0 , i32 1
422
458
%0 = load i32 , ptr %stride , align 4
@@ -436,12 +472,6 @@ for.cond.cleanup: ; preds = %for.cond.cleanup.lo
436
472
437
473
; Extend foo4 so that any loop variants (%3 and %or) with mul/sub/add then extend will not
438
474
; need a trunc instruction
439
- ; CHECK: for.body:
440
- ; CHECK-NOT: trunc
441
- ; CHECK: [[TMP0:%.*]] = and i32 %length, %0
442
- ; CHECK-NEXT: zext i32 [[TMP0]] to i64
443
- ; CHECK: [[TMP1:%.*]] = or i32 %length, [[TMP2:%.*]]
444
- ; CHECK-NEXT: zext i32 [[TMP1]] to i64
445
475
for.body: ; preds = %for.body.lr.ph, %for.body
446
476
%x.018 = phi i32 [ 1 , %for.body.lr.ph ], [ %add , %for.body ]
447
477
%add = add nuw nsw i32 %x.018 , 1
0 commit comments