1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
2
; RUN: opt < %s -S -passes='loop(indvars),loop-unroll' -verify-loop-info | FileCheck %s
3
3
;
4
+ target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
5
+
4
6
; Unit tests for loop unrolling using ScalarEvolution to compute trip counts.
5
7
;
6
8
; Indvars is run first to generate an "old" SCEV result. Some unit
@@ -66,30 +68,30 @@ define i64 @earlyLoopTest(ptr %base) nounwind {
66
68
; CHECK-NEXT: entry:
67
69
; CHECK-NEXT: br label [[LOOP:%.*]]
68
70
; CHECK: loop:
69
- ; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[BASE:%.*]], align 4
71
+ ; CHECK-NEXT: [[VAL:%.*]] = load i64, ptr [[BASE:%.*]], align 8
70
72
; CHECK-NEXT: br label [[TAIL:%.*]]
71
73
; CHECK: tail:
72
74
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i64 [[VAL]], 0
73
75
; CHECK-NEXT: br i1 [[CMP2]], label [[LOOP_1:%.*]], label [[EXIT2:%.*]]
74
76
; CHECK: loop.1:
75
77
; CHECK-NEXT: [[ADR_1:%.*]] = getelementptr i64, ptr [[BASE]], i64 1
76
- ; CHECK-NEXT: [[VAL_1:%.*]] = load i64, ptr [[ADR_1]], align 4
78
+ ; CHECK-NEXT: [[VAL_1:%.*]] = load i64, ptr [[ADR_1]], align 8
77
79
; CHECK-NEXT: [[S_NEXT_1:%.*]] = add i64 [[VAL]], [[VAL_1]]
78
80
; CHECK-NEXT: br label [[TAIL_1:%.*]]
79
81
; CHECK: tail.1:
80
82
; CHECK-NEXT: [[CMP2_1:%.*]] = icmp ne i64 [[VAL_1]], 0
81
83
; CHECK-NEXT: br i1 [[CMP2_1]], label [[LOOP_2:%.*]], label [[EXIT2]]
82
84
; CHECK: loop.2:
83
85
; CHECK-NEXT: [[ADR_2:%.*]] = getelementptr i64, ptr [[BASE]], i64 2
84
- ; CHECK-NEXT: [[VAL_2:%.*]] = load i64, ptr [[ADR_2]], align 4
86
+ ; CHECK-NEXT: [[VAL_2:%.*]] = load i64, ptr [[ADR_2]], align 8
85
87
; CHECK-NEXT: [[S_NEXT_2:%.*]] = add i64 [[S_NEXT_1]], [[VAL_2]]
86
88
; CHECK-NEXT: br label [[TAIL_2:%.*]]
87
89
; CHECK: tail.2:
88
90
; CHECK-NEXT: [[CMP2_2:%.*]] = icmp ne i64 [[VAL_2]], 0
89
91
; CHECK-NEXT: br i1 [[CMP2_2]], label [[LOOP_3:%.*]], label [[EXIT2]]
90
92
; CHECK: loop.3:
91
93
; CHECK-NEXT: [[ADR_3:%.*]] = getelementptr i64, ptr [[BASE]], i64 3
92
- ; CHECK-NEXT: [[VAL_3:%.*]] = load i64, ptr [[ADR_3]], align 4
94
+ ; CHECK-NEXT: [[VAL_3:%.*]] = load i64, ptr [[ADR_3]], align 8
93
95
; CHECK-NEXT: [[S_NEXT_3:%.*]] = add i64 [[S_NEXT_2]], [[VAL_3]]
94
96
; CHECK-NEXT: br i1 false, label [[TAIL_3:%.*]], label [[EXIT1:%.*]]
95
97
; CHECK: tail.3:
@@ -381,7 +383,7 @@ define i32 @test_pr56044(ptr %src, i32 %a) {
381
383
; CHECK: loop.2.peel:
382
384
; CHECK-NEXT: [[IV_2_NEXT_PEEL:%.*]] = add i32 0, [[ADD_2]]
383
385
; CHECK-NEXT: [[IV_1_NEXT_PEEL:%.*]] = add nuw nsw i32 0, 1
384
- ; CHECK-NEXT: [[EC_2_PEEL:%.*]] = icmp ult i32 [[IV_1_NEXT_PEEL]], 12345
386
+ ; CHECK-NEXT: [[EC_2_PEEL:%.*]] = icmp ne i32 [[IV_1_NEXT_PEEL]], 12345
385
387
; CHECK-NEXT: br i1 [[EC_2_PEEL]], label [[LOOP_2_PEEL_NEXT:%.*]], label [[EXIT:%.*]]
386
388
; CHECK: loop.2.peel.next:
387
389
; CHECK-NEXT: br label [[LOOP_2_PEEL_NEXT2:%.*]]
@@ -394,8 +396,8 @@ define i32 @test_pr56044(ptr %src, i32 %a) {
394
396
; CHECK-NEXT: [[IV_2:%.*]] = phi i32 [ [[IV_2_NEXT_PEEL]], [[MID_PEEL_NEWPH]] ], [ [[IV_2_NEXT:%.*]], [[LOOP_2]] ]
395
397
; CHECK-NEXT: [[IV_2_NEXT]] = add i32 2, [[IV_2]]
396
398
; CHECK-NEXT: [[IV_1_NEXT]] = add nuw nsw i32 [[IV_1]], 1
397
- ; CHECK-NEXT: [[EC_2 :%.*]] = icmp ult i32 [[IV_1_NEXT]], 12345
398
- ; CHECK-NEXT: br i1 [[EC_2 ]], label [[LOOP_2]], label [[EXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP2:![0-9]+]]
399
+ ; CHECK-NEXT: [[EXITCOND :%.*]] = icmp ne i32 [[IV_1_NEXT]], 12345
400
+ ; CHECK-NEXT: br i1 [[EXITCOND ]], label [[LOOP_2]], label [[EXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP2:![0-9]+]]
399
401
; CHECK: exit.loopexit:
400
402
; CHECK-NEXT: [[LCSSA_2_PH:%.*]] = phi i32 [ [[IV_2_NEXT]], [[LOOP_2]] ]
401
403
; CHECK-NEXT: br label [[EXIT]]
@@ -435,3 +437,65 @@ exit:
435
437
}
436
438
437
439
declare void @fn (i32 )
440
+
441
+
442
+ define void @peel_int_eq_condition (i32 %start ) {
443
+ ; CHECK-LABEL: @peel_int_eq_condition(
444
+ ; CHECK-NEXT: entry:
445
+ ; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[START:%.*]], i32 100)
446
+ ; CHECK-NEXT: [[TMP0:%.*]] = add nuw i32 [[SMAX]], 1
447
+ ; CHECK-NEXT: br label [[LOOP_PEEL_BEGIN:%.*]]
448
+ ; CHECK: loop.peel.begin:
449
+ ; CHECK-NEXT: br label [[LOOP_PEEL:%.*]]
450
+ ; CHECK: loop.peel:
451
+ ; CHECK-NEXT: [[C_0_PEEL:%.*]] = icmp eq i32 [[START]], [[START]]
452
+ ; CHECK-NEXT: br i1 [[C_0_PEEL]], label [[IF_THEN_PEEL:%.*]], label [[LOOP_LATCH_PEEL:%.*]]
453
+ ; CHECK: if.then.peel:
454
+ ; CHECK-NEXT: call void @fn(i32 [[START]])
455
+ ; CHECK-NEXT: br label [[LOOP_LATCH_PEEL]]
456
+ ; CHECK: loop.latch.peel:
457
+ ; CHECK-NEXT: [[IV_NEXT_PEEL:%.*]] = add i32 [[START]], 1
458
+ ; CHECK-NEXT: [[EXITCOND_PEEL:%.*]] = icmp ne i32 [[IV_NEXT_PEEL]], [[TMP0]]
459
+ ; CHECK-NEXT: br i1 [[EXITCOND_PEEL]], label [[LOOP_PEEL_NEXT:%.*]], label [[EXIT:%.*]]
460
+ ; CHECK: loop.peel.next:
461
+ ; CHECK-NEXT: br label [[LOOP_PEEL_NEXT1:%.*]]
462
+ ; CHECK: loop.peel.next1:
463
+ ; CHECK-NEXT: br label [[ENTRY_PEEL_NEWPH:%.*]]
464
+ ; CHECK: entry.peel.newph:
465
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
466
+ ; CHECK: loop:
467
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[IV_NEXT_PEEL]], [[ENTRY_PEEL_NEWPH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
468
+ ; CHECK-NEXT: [[C_0:%.*]] = icmp eq i32 [[IV]], [[START]]
469
+ ; CHECK-NEXT: br i1 [[C_0]], label [[IF_THEN:%.*]], label [[LOOP_LATCH]]
470
+ ; CHECK: if.then:
471
+ ; CHECK-NEXT: call void @fn(i32 [[IV]])
472
+ ; CHECK-NEXT: br label [[LOOP_LATCH]]
473
+ ; CHECK: loop.latch:
474
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
475
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[IV_NEXT]], [[TMP0]]
476
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP3:![0-9]+]]
477
+ ; CHECK: exit.loopexit:
478
+ ; CHECK-NEXT: br label [[EXIT]]
479
+ ; CHECK: exit:
480
+ ; CHECK-NEXT: ret void
481
+ ;
482
+ entry:
483
+ br label %loop
484
+
485
+ loop:
486
+ %iv = phi i32 [ %start , %entry ], [ %iv.next , %loop.latch ]
487
+ %c.0 = icmp eq i32 %iv , %start
488
+ br i1 %c.0 , label %if.then , label %loop.latch
489
+
490
+ if.then:
491
+ call void @fn (i32 %iv )
492
+ br label %loop.latch
493
+
494
+ loop.latch:
495
+ %iv.next = add i32 %iv , 1
496
+ %ec = icmp slt i32 %iv , 100
497
+ br i1 %ec , label %loop , label %exit
498
+
499
+ exit:
500
+ ret void
501
+ }
0 commit comments