xref: /aosp_15_r20/external/llvm/test/Transforms/LoopUnroll/unroll-opt-attribute.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll -unroll-count=4 | FileCheck -check-prefix=CHECK_COUNT4 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll | FileCheck -check-prefix=CHECK_NOCOUNT %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker;///////////////////// TEST 1 //////////////////////////////
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; This test shows that the loop is unrolled according to the specified
8*9880d681SAndroid Build Coastguard Worker; unroll factor.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerdefine void @Test1() nounwind {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  br label %loop
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerloop:
15*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]
16*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %iv, 1
17*9880d681SAndroid Build Coastguard Worker  %exitcnd = icmp uge i32 %inc, 1024
18*9880d681SAndroid Build Coastguard Worker  br i1 %exitcnd, label %exit, label %loop
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerexit:
21*9880d681SAndroid Build Coastguard Worker  ret void
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-LABEL: @Test1
25*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4:      phi
26*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: add
27*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: add
28*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: add
29*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: add
30*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: icmp
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker;///////////////////// TEST 2 //////////////////////////////
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; This test shows that with optnone attribute, the loop is not unrolled
36*9880d681SAndroid Build Coastguard Worker; even if an unroll factor was specified.
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine void @Test2() nounwind optnone noinline {
39*9880d681SAndroid Build Coastguard Workerentry:
40*9880d681SAndroid Build Coastguard Worker  br label %loop
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerloop:
43*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]
44*9880d681SAndroid Build Coastguard Worker  %inc = add i32 %iv, 1
45*9880d681SAndroid Build Coastguard Worker  %exitcnd = icmp uge i32 %inc, 1024
46*9880d681SAndroid Build Coastguard Worker  br i1 %exitcnd, label %exit, label %loop
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerexit:
49*9880d681SAndroid Build Coastguard Worker  ret void
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-LABEL: @Test2
53*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4:      phi
54*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: add
55*9880d681SAndroid Build Coastguard Worker; CHECK_COUNT4-NEXT: icmp
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker;///////////////////// TEST 3 //////////////////////////////
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; This test shows that this loop is fully unrolled by default.
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker@tab = common global [24 x i32] zeroinitializer, align 4
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine i32 @Test3() {
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  br label %for.body
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
69*9880d681SAndroid Build Coastguard Worker  %i.05 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
70*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [24 x i32], [24 x i32]* @tab, i32 0, i32 %i.05
71*9880d681SAndroid Build Coastguard Worker  store i32 %i.05, i32* %arrayidx, align 4
72*9880d681SAndroid Build Coastguard Worker  %inc = add nuw nsw i32 %i.05, 1
73*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %inc, 24
74*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
77*9880d681SAndroid Build Coastguard Worker  ret i32 42
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-LABEL: @Test3
81*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT:      store
82*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
83*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
84*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
85*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
86*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
87*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
88*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
89*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
90*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
91*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
92*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
93*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
94*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
95*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
96*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
97*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
98*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
99*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
100*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
101*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
102*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
103*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
104*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: store
105*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-NEXT: ret
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker;///////////////////// TEST 4 //////////////////////////////
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; This test shows that with optsize attribute, this loop is not unrolled.
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine i32 @Test4() optsize {
113*9880d681SAndroid Build Coastguard Workerentry:
114*9880d681SAndroid Build Coastguard Worker  br label %for.body
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
117*9880d681SAndroid Build Coastguard Worker  %i.05 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
118*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds [24 x i32], [24 x i32]* @tab, i32 0, i32 %i.05
119*9880d681SAndroid Build Coastguard Worker  store i32 %i.05, i32* %arrayidx, align 4
120*9880d681SAndroid Build Coastguard Worker  %inc = add nuw nsw i32 %i.05, 1
121*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %inc, 24
122*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
125*9880d681SAndroid Build Coastguard Worker  ret i32 42
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT-LABEL: @Test4
129*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT:      phi
130*9880d681SAndroid Build Coastguard Worker; CHECK_NOCOUNT:      icmp
131