xref: /aosp_15_r20/external/llvm/test/Transforms/LoopUnroll/runtime-loop.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll -unroll-runtime=true | FileCheck %s -check-prefix=EPILOG
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll -unroll-runtime=true -unroll-runtime-epilog=false | FileCheck %s -check-prefix=PROLOG
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Tests for unrolling loops with run-time trip counts
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; EPILOG: %xtraiter = and i32 %n
9*9880d681SAndroid Build Coastguard Worker; EPILOG:  %lcmp.mod = icmp ne i32 %xtraiter, 0
10*9880d681SAndroid Build Coastguard Worker; EPILOG:  br i1 %lcmp.mod, label %for.body.epil.preheader, label %for.end.loopexit
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; PROLOG: %xtraiter = and i32 %n
13*9880d681SAndroid Build Coastguard Worker; PROLOG:  %lcmp.mod = icmp ne i32 %xtraiter, 0
14*9880d681SAndroid Build Coastguard Worker; PROLOG:  br i1 %lcmp.mod, label %for.body.prol.preheader, label %for.body.prol.loopexit
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; EPILOG: for.body.epil:
17*9880d681SAndroid Build Coastguard Worker; EPILOG: %indvars.iv.epil = phi i64 [ %indvars.iv.next.epil, %for.body.epil ],  [ %indvars.iv.unr, %for.body.epil.preheader ]
18*9880d681SAndroid Build Coastguard Worker; EPILOG:  %epil.iter.sub = sub i32 %epil.iter, 1
19*9880d681SAndroid Build Coastguard Worker; EPILOG:  %epil.iter.cmp = icmp ne i32 %epil.iter.sub, 0
20*9880d681SAndroid Build Coastguard Worker; EPILOG:  br i1 %epil.iter.cmp, label %for.body.epil, label %for.end.loopexit.epilog-lcssa, !llvm.loop !0
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; PROLOG: for.body.prol:
23*9880d681SAndroid Build Coastguard Worker; PROLOG: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %for.body.prol.preheader ]
24*9880d681SAndroid Build Coastguard Worker; PROLOG:  %prol.iter.sub = sub i32 %prol.iter, 1
25*9880d681SAndroid Build Coastguard Worker; PROLOG:  %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0
26*9880d681SAndroid Build Coastguard Worker; PROLOG:  br i1 %prol.iter.cmp, label %for.body.prol, label %for.body.prol.loopexit, !llvm.loop !0
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i32 @test(i32* nocapture %a, i32 %n) nounwind uwtable readonly {
30*9880d681SAndroid Build Coastguard Workerentry:
31*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i32 %n, 0
32*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
35*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
36*9880d681SAndroid Build Coastguard Worker  %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
37*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
38*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
39*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, %sum.02
40*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add i64 %indvars.iv, 1
41*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
42*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, %n
43*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body, %entry
46*9880d681SAndroid Build Coastguard Worker  %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]
47*9880d681SAndroid Build Coastguard Worker  ret i32 %sum.0.lcssa
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; Still try to completely unroll loops with compile-time trip counts
52*9880d681SAndroid Build Coastguard Worker; even if the -unroll-runtime is specified
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; EPILOG: for.body:
55*9880d681SAndroid Build Coastguard Worker; EPILOG-NOT: for.body.epil:
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; PROLOG: for.body:
58*9880d681SAndroid Build Coastguard Worker; PROLOG-NOT: for.body.prol:
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32* nocapture %a) nounwind uwtable readonly {
61*9880d681SAndroid Build Coastguard Workerentry:
62*9880d681SAndroid Build Coastguard Worker  br label %for.body
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
65*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
66*9880d681SAndroid Build Coastguard Worker  %sum.01 = phi i32 [ 0, %entry ], [ %add, %for.body ]
67*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
68*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
69*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, %sum.01
70*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add i64 %indvars.iv, 1
71*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
72*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, 5
73*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
76*9880d681SAndroid Build Coastguard Worker  ret i32 %add
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; This is test 2007-05-09-UnknownTripCount.ll which can be unrolled now
80*9880d681SAndroid Build Coastguard Worker; if the -unroll-runtime option is turned on
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; EPILOG: bb72.2:
83*9880d681SAndroid Build Coastguard Worker; PROLOG: bb72.2:
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine void @foo(i32 %trips) {
86*9880d681SAndroid Build Coastguard Workerentry:
87*9880d681SAndroid Build Coastguard Worker        br label %cond_true.outer
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workercond_true.outer:
90*9880d681SAndroid Build Coastguard Worker        %indvar1.ph = phi i32 [ 0, %entry ], [ %indvar.next2, %bb72 ]
91*9880d681SAndroid Build Coastguard Worker        br label %bb72
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerbb72:
94*9880d681SAndroid Build Coastguard Worker        %indvar.next2 = add i32 %indvar1.ph, 1
95*9880d681SAndroid Build Coastguard Worker        %exitcond3 = icmp eq i32 %indvar.next2, %trips
96*9880d681SAndroid Build Coastguard Worker        br i1 %exitcond3, label %cond_true138, label %cond_true.outer
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workercond_true138:
99*9880d681SAndroid Build Coastguard Worker        ret void
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; Test run-time unrolling for a loop that counts down by -2.
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; EPILOG: for.body.epil:
106*9880d681SAndroid Build Coastguard Worker; EPILOG: br i1 %epil.iter.cmp, label %for.body.epil, label %for.cond.for.end_crit_edge.epilog-lcssa
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; PROLOG: for.body.prol:
109*9880d681SAndroid Build Coastguard Worker; PROLOG: br i1 %prol.iter.cmp, label %for.body.prol, label %for.body.prol.loopexit
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @down(i16* nocapture %p, i32 %len) nounwind uwtable readonly {
112*9880d681SAndroid Build Coastguard Workerentry:
113*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i32 %len, 0
114*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %for.end, label %for.body
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
117*9880d681SAndroid Build Coastguard Worker  %p.addr.05 = phi i16* [ %incdec.ptr, %for.body ], [ %p, %entry ]
118*9880d681SAndroid Build Coastguard Worker  %len.addr.04 = phi i32 [ %sub, %for.body ], [ %len, %entry ]
119*9880d681SAndroid Build Coastguard Worker  %res.03 = phi i32 [ %add, %for.body ], [ 0, %entry ]
120*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i16, i16* %p.addr.05, i64 1
121*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %p.addr.05, align 2
122*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %0 to i32
123*9880d681SAndroid Build Coastguard Worker  %add = add i32 %conv, %res.03
124*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %len.addr.04, -2
125*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %sub, 0
126*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.cond.for.end_crit_edge, label %for.body
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerfor.cond.for.end_crit_edge:                       ; preds = %for.body
129*9880d681SAndroid Build Coastguard Worker  %phitmp = trunc i32 %add to i16
130*9880d681SAndroid Build Coastguard Worker  br label %for.end
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.cond.for.end_crit_edge, %entry
133*9880d681SAndroid Build Coastguard Worker  %res.0.lcssa = phi i16 [ %phitmp, %for.cond.for.end_crit_edge ], [ 0, %entry ]
134*9880d681SAndroid Build Coastguard Worker  ret i16 %res.0.lcssa
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; Test run-time unrolling disable metadata.
138*9880d681SAndroid Build Coastguard Worker; EPILOG: for.body:
139*9880d681SAndroid Build Coastguard Worker; EPILOG-NOT: for.body.epil:
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; PROLOG: for.body:
142*9880d681SAndroid Build Coastguard Worker; PROLOG-NOT: for.body.prol:
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @test2(i16* nocapture %p, i32 %len) nounwind uwtable readonly {
145*9880d681SAndroid Build Coastguard Workerentry:
146*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i32 %len, 0
147*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %for.end, label %for.body
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
150*9880d681SAndroid Build Coastguard Worker  %p.addr.05 = phi i16* [ %incdec.ptr, %for.body ], [ %p, %entry ]
151*9880d681SAndroid Build Coastguard Worker  %len.addr.04 = phi i32 [ %sub, %for.body ], [ %len, %entry ]
152*9880d681SAndroid Build Coastguard Worker  %res.03 = phi i32 [ %add, %for.body ], [ 0, %entry ]
153*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i16, i16* %p.addr.05, i64 1
154*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %p.addr.05, align 2
155*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %0 to i32
156*9880d681SAndroid Build Coastguard Worker  %add = add i32 %conv, %res.03
157*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %len.addr.04, -2
158*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %sub, 0
159*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.cond.for.end_crit_edge, label %for.body, !llvm.loop !0
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerfor.cond.for.end_crit_edge:                       ; preds = %for.body
162*9880d681SAndroid Build Coastguard Worker  %phitmp = trunc i32 %add to i16
163*9880d681SAndroid Build Coastguard Worker  br label %for.end
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.cond.for.end_crit_edge, %entry
166*9880d681SAndroid Build Coastguard Worker  %res.0.lcssa = phi i16 [ %phitmp, %for.cond.for.end_crit_edge ], [ 0, %entry ]
167*9880d681SAndroid Build Coastguard Worker  ret i16 %res.0.lcssa
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker!0 = distinct !{!0, !1}
171*9880d681SAndroid Build Coastguard Worker!1 = !{!"llvm.loop.unroll.runtime.disable"}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; EPILOG: !0 = distinct !{!0, !1}
174*9880d681SAndroid Build Coastguard Worker; EPILOG: !1 = !{!"llvm.loop.unroll.disable"}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker; PROLOG: !0 = distinct !{!0, !1}
177*9880d681SAndroid Build Coastguard Worker; PROLOG: !1 = !{!"llvm.loop.unroll.disable"}
178