1; RUN: opt -S -loop-unroll -unroll-runtime %s -o - | FileCheck %s
2; RUN: opt -S -loop-unroll -unroll-runtime -unroll-max-upperbound=6 %s -o - | FileCheck %s --check-prefix=UPPER
3
4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5
6@global = dso_local local_unnamed_addr global i32 0, align 4
7@global.1 = dso_local local_unnamed_addr global i8* null, align 4
8
9; Check that loop in hoge_3, with a runtime upperbound of 3, is not unrolled.
10; CHECK-LABEL: hoge_3
11; CHECK: loop:
12; CHECK: store
13; CHECK-NOT: store
14; CHECK: br i1 %{{.*}}, label %loop
15; UPPER-LABEL: hoge_3
16; UPPER: loop:
17; UPPER: store
18; UPPER-NOT: store
19; UPPER: br i1 %{{.*}}, label %loop
20define dso_local void @hoge_3(i8 %arg) {
21entry:
22  %x = load i32, i32* @global, align 4
23  %y = load i8*, i8** @global.1, align 4
24  %0 = icmp ult i32 %x, 17
25  br i1 %0, label %loop, label %exit
26
27loop:
28  %iv = phi i32 [ %x, %entry ], [ %iv.next, %loop ]
29  %ptr = phi i8* [ %y, %entry ], [ %ptr.next, %loop ]
30  %iv.next = add nuw i32 %iv, 8
31  %ptr.next = getelementptr inbounds i8, i8* %ptr, i32 1
32  store i8 %arg, i8* %ptr.next, align 1
33  %1 = icmp ult i32 %iv.next, 17
34  br i1 %1, label %loop, label %exit
35
36exit:
37  ret void
38}
39
40; Check that loop in hoge_5, with a runtime upperbound of 5, is unrolled when -unroll-max-upperbound=4
41; CHECK-LABEL: hoge_5
42; CHECK: loop:
43; CHECK: store
44; CHECK-NOT: store
45; CHECK: br i1 %{{.*}}, label %loop
46; UPPER-LABEL: hoge_5
47; UPPER: loop:
48; UPPER: store
49; UPPER: store
50; UPPER: store
51; UPPER: br i1 %{{.*}}, label %loop
52define dso_local void @hoge_5(i8 %arg) {
53entry:
54  %x = load i32, i32* @global, align 4
55  %y = load i8*, i8** @global.1, align 4
56  %0 = icmp ult i32 %x, 17
57  br i1 %0, label %loop, label %exit
58
59loop:
60  %iv = phi i32 [ %x, %entry ], [ %iv.next, %loop ]
61  %ptr = phi i8* [ %y, %entry ], [ %ptr.next, %loop ]
62  %iv.next = add nuw i32 %iv, 4
63  %ptr.next = getelementptr inbounds i8, i8* %ptr, i32 1
64  store i8 %arg, i8* %ptr.next, align 1
65  %1 = icmp ult i32 %iv.next, 17
66  br i1 %1, label %loop, label %exit
67
68exit:
69  ret void
70}
71