xref: /llvm-project/llvm/test/Transforms/HardwareLoops/ARM/structure.ll (revision 2a58be42396376e8d552158ff801d953c6c1bee3)
1*2a58be42SSamuel Parker; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -passes=hardware-loops %s -S -o - | \
292164cf2SSjoerd Meijer; RUN:     FileCheck %s
3c37dfd0fSRoman Lebedev; RUN: opt -mtriple=thumbv8.1m.main -passes=loop-unroll -unroll-remainder=false -S < %s | \
492164cf2SSjoerd Meijer; RUN:     llc -mtriple=thumbv8.1m.main | FileCheck %s --check-prefix=CHECK-UNROLL
5*2a58be42SSamuel Parker; RUN: opt -mtriple=thumbv8.1m.main-none-none-eabi -passes=hardware-loops \
692164cf2SSjoerd Meijer; RUN:     -pass-remarks-analysis=hardware-loops  %s -S -o - 2>&1 | \
792164cf2SSjoerd Meijer; RUN:     FileCheck %s --check-prefix=CHECK-REMARKS
892164cf2SSjoerd Meijer
992164cf2SSjoerd Meijer
1092164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
1192164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: nested hardware-loops not supported
1292164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
1392164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
1492164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
1592164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
1692164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: loop is not a candidate
17*2a58be42SSamuel Parker; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: loop is not a candidate
1892164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
1992164cf2SSjoerd Meijer; CHECK-REMARKS: remark: <unknown>:0:0: hardware-loop not created: it's not profitable to create a hardware-loop
2092164cf2SSjoerd Meijer
21757ac02dSSam Parker
22757ac02dSSam Parker; CHECK-LABEL: early_exit
23757ac02dSSam Parker; CHECK-NOT: llvm.set.loop.iterations
24757ac02dSSam Parker; CHECK-NOT: llvm.loop.decrement
25d17f4f26SMatt Arsenaultdefine i32 @early_exit(ptr nocapture readonly %a, i32 %max, i32 %n) {
26757ac02dSSam Parkerentry:
27757ac02dSSam Parker  br label %do.body
28757ac02dSSam Parker
29757ac02dSSam Parkerdo.body:
30757ac02dSSam Parker  %i.0 = phi i32 [ 0, %entry ], [ %inc, %if.end ]
31d17f4f26SMatt Arsenault  %arrayidx = getelementptr inbounds i32, ptr %a, i32 %i.0
32d17f4f26SMatt Arsenault  %0 = load i32, ptr %arrayidx, align 4
33757ac02dSSam Parker  %cmp = icmp sgt i32 %0, %max
34757ac02dSSam Parker  br i1 %cmp, label %do.end, label %if.end
35757ac02dSSam Parker
36757ac02dSSam Parkerif.end:
37757ac02dSSam Parker  %inc = add nuw i32 %i.0, 1
38757ac02dSSam Parker  %cmp1 = icmp ult i32 %inc, %n
39757ac02dSSam Parker  br i1 %cmp1, label %do.body, label %if.end.do.end_crit_edge
40757ac02dSSam Parker
41757ac02dSSam Parkerif.end.do.end_crit_edge:
42d17f4f26SMatt Arsenault  %arrayidx2.phi.trans.insert = getelementptr inbounds i32, ptr %a, i32 %inc
43d17f4f26SMatt Arsenault  %.pre = load i32, ptr %arrayidx2.phi.trans.insert, align 4
44757ac02dSSam Parker  br label %do.end
45757ac02dSSam Parker
46757ac02dSSam Parkerdo.end:
47757ac02dSSam Parker  %1 = phi i32 [ %.pre, %if.end.do.end_crit_edge ], [ %0, %do.body ]
48757ac02dSSam Parker  ret i32 %1
49757ac02dSSam Parker}
50757ac02dSSam Parker
51757ac02dSSam Parker; CHECK-LABEL: nested
52b2ac9681SDavid Green; CHECK-NOT: call i32 @llvm.start.loop.iterations.i32(i32 %N)
53757ac02dSSam Parker; CHECK: br i1 %cmp20, label %while.end7, label %while.cond1.preheader.us
54757ac02dSSam Parker
55b2ac9681SDavid Green; CHECK: [[START:%[^ ]+]] = call i32 @llvm.start.loop.iterations.i32(i32 %N)
56757ac02dSSam Parker; CHECK: br label %while.body3.us
57757ac02dSSam Parker
58b2ac9681SDavid Green; CHECK: [[REM:%[^ ]+]] = phi i32 [ [[START]], %while.cond1.preheader.us ], [ [[LOOP_DEC:%[^ ]+]], %while.body3.us ]
59b0614509SSjoerd Meijer; CHECK: [[LOOP_DEC]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[REM]], i32 1)
60757ac02dSSam Parker; CHECK: [[CMP:%[^ ]+]] = icmp ne i32 [[LOOP_DEC]], 0
61757ac02dSSam Parker; CHECK: br i1 [[CMP]], label %while.body3.us, label %while.cond1.while.end_crit_edge.us
62757ac02dSSam Parker
6380fb7434SThomas Preud'homme; CHECK-NOT: %{{[^ ]+}} = call i1 @llvm.loop.decrement.i32(i32 1)
64a6fd919cSSam Parker
65d17f4f26SMatt Arsenaultdefine void @nested(ptr nocapture %A, i32 %N) {
66757ac02dSSam Parkerentry:
67757ac02dSSam Parker  %cmp20 = icmp eq i32 %N, 0
68757ac02dSSam Parker  br i1 %cmp20, label %while.end7, label %while.cond1.preheader.us
69757ac02dSSam Parker
70757ac02dSSam Parkerwhile.cond1.preheader.us:
71757ac02dSSam Parker  %i.021.us = phi i32 [ %inc6.us, %while.cond1.while.end_crit_edge.us ], [ 0, %entry ]
72757ac02dSSam Parker  %mul.us = mul i32 %i.021.us, %N
73757ac02dSSam Parker  br label %while.body3.us
74757ac02dSSam Parker
75757ac02dSSam Parkerwhile.body3.us:
76757ac02dSSam Parker  %j.019.us = phi i32 [ 0, %while.cond1.preheader.us ], [ %inc.us, %while.body3.us ]
77757ac02dSSam Parker  %add.us = add i32 %j.019.us, %mul.us
78d17f4f26SMatt Arsenault  %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us
79d17f4f26SMatt Arsenault  store i32 %add.us, ptr %arrayidx.us, align 4
80757ac02dSSam Parker  %inc.us = add nuw i32 %j.019.us, 1
81757ac02dSSam Parker  %exitcond = icmp eq i32 %inc.us, %N
82757ac02dSSam Parker  br i1 %exitcond, label %while.cond1.while.end_crit_edge.us, label %while.body3.us
83757ac02dSSam Parker
84757ac02dSSam Parkerwhile.cond1.while.end_crit_edge.us:
85757ac02dSSam Parker  %inc6.us = add nuw i32 %i.021.us, 1
86757ac02dSSam Parker  %exitcond23 = icmp eq i32 %inc6.us, %N
87757ac02dSSam Parker  br i1 %exitcond23, label %while.end7, label %while.cond1.preheader.us
88757ac02dSSam Parker
89757ac02dSSam Parkerwhile.end7:
90757ac02dSSam Parker  ret void
91757ac02dSSam Parker}
929d28473aSSam Parker
939d28473aSSam Parker; CHECK-LABEL: pre_existing
94b2ac9681SDavid Green; CHECK: llvm.start.loop.iterations
95b2ac9681SDavid Green; CHECK-NOT: llvm.start.loop.iterations
96b0614509SSjoerd Meijer; CHECK: call i32 @llvm.loop.decrement.reg.i32(i32 %0, i32 1)
979d28473aSSam Parker; CHECK-NOT: call i32 @llvm.loop.decrement.reg
98d17f4f26SMatt Arsenaultdefine i32 @pre_existing(i32 %n, ptr nocapture %p, ptr nocapture readonly %q) {
999d28473aSSam Parkerentry:
100b2ac9681SDavid Green  %start = call i32 @llvm.start.loop.iterations.i32(i32 %n)
1019d28473aSSam Parker  br label %while.body
1029d28473aSSam Parker
1039d28473aSSam Parkerwhile.body:                                       ; preds = %while.body, %entry
104d17f4f26SMatt Arsenault  %q.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %q, %entry ]
105d17f4f26SMatt Arsenault  %p.addr.04 = phi ptr [ %incdec.ptr1, %while.body ], [ %p, %entry ]
106b2ac9681SDavid Green  %0 = phi i32 [ %start, %entry ], [ %2, %while.body ]
107d17f4f26SMatt Arsenault  %incdec.ptr = getelementptr inbounds i32, ptr %q.addr.05, i32 1
108d17f4f26SMatt Arsenault  %1 = load i32, ptr %q.addr.05, align 4
109d17f4f26SMatt Arsenault  %incdec.ptr1 = getelementptr inbounds i32, ptr %p.addr.04, i32 1
110d17f4f26SMatt Arsenault  store i32 %1, ptr %p.addr.04, align 4
111b0614509SSjoerd Meijer  %2 = call i32 @llvm.loop.decrement.reg.i32(i32 %0, i32 1)
1129d28473aSSam Parker  %3 = icmp ne i32 %2, 0
1139d28473aSSam Parker  br i1 %3, label %while.body, label %while.end
1149d28473aSSam Parker
1159d28473aSSam Parkerwhile.end:                                        ; preds = %while.body
1169d28473aSSam Parker  ret i32 0
1179d28473aSSam Parker}
1189d28473aSSam Parker
11998722691SSam Parker; CHECK-LABEL: pre_existing_test_set
120fad70c30SDavid Green; CHECK: call { i32, i1 } @llvm.test.start.loop.iterations
12198722691SSam Parker; CHECK-NOT: llvm.set{{.*}}.loop.iterations
122b0614509SSjoerd Meijer; CHECK: call i32 @llvm.loop.decrement.reg.i32(i32 %0, i32 1)
12398722691SSam Parker; CHECK-NOT: call i32 @llvm.loop.decrement.reg
124d17f4f26SMatt Arsenaultdefine i32 @pre_existing_test_set(i32 %n, ptr nocapture %p, ptr nocapture readonly %q) {
12598722691SSam Parkerentry:
126fad70c30SDavid Green  %guard = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %n)
127fad70c30SDavid Green  %g0 = extractvalue { i32, i1 } %guard, 0
128fad70c30SDavid Green  %g1 = extractvalue { i32, i1 } %guard, 1
129fad70c30SDavid Green  br i1 %g1, label %while.preheader, label %while.end
13098722691SSam Parker
13198722691SSam Parkerwhile.preheader:
13298722691SSam Parker  br label %while.body
13398722691SSam Parker
13498722691SSam Parkerwhile.body:                                       ; preds = %while.body, %entry
135d17f4f26SMatt Arsenault  %q.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %q, %while.preheader ]
136d17f4f26SMatt Arsenault  %p.addr.04 = phi ptr [ %incdec.ptr1, %while.body ], [ %p, %while.preheader ]
137fad70c30SDavid Green  %0 = phi i32 [ %g0, %while.preheader ], [ %2, %while.body ]
138d17f4f26SMatt Arsenault  %incdec.ptr = getelementptr inbounds i32, ptr %q.addr.05, i32 1
139d17f4f26SMatt Arsenault  %1 = load i32, ptr %q.addr.05, align 4
140d17f4f26SMatt Arsenault  %incdec.ptr1 = getelementptr inbounds i32, ptr %p.addr.04, i32 1
141d17f4f26SMatt Arsenault  store i32 %1, ptr %p.addr.04, align 4
142b0614509SSjoerd Meijer  %2 = call i32 @llvm.loop.decrement.reg.i32(i32 %0, i32 1)
14398722691SSam Parker  %3 = icmp ne i32 %2, 0
14498722691SSam Parker  br i1 %3, label %while.body, label %while.end
14598722691SSam Parker
14698722691SSam Parkerwhile.end:                                        ; preds = %while.body
14798722691SSam Parker  ret i32 0
14898722691SSam Parker}
14998722691SSam Parker
1509d28473aSSam Parker; CHECK-LABEL: pre_existing_inner
151b2ac9681SDavid Green; CHECK-NOT: llvm.start.loop.iterations
1529d28473aSSam Parker; CHECK: while.cond1.preheader.us:
153b2ac9681SDavid Green; CHECK: call i32 @llvm.start.loop.iterations.i32(i32 %N)
154b0614509SSjoerd Meijer; CHECK: call i32 @llvm.loop.decrement.reg.i32(i32 %0, i32 1)
1559d28473aSSam Parker; CHECK: br i1
1569d28473aSSam Parker; CHECK-NOT: call i32 @llvm.loop.decrement
157d17f4f26SMatt Arsenaultdefine void @pre_existing_inner(ptr nocapture %A, i32 %N) {
1589d28473aSSam Parkerentry:
1599d28473aSSam Parker  %cmp20 = icmp eq i32 %N, 0
1609d28473aSSam Parker  br i1 %cmp20, label %while.end7, label %while.cond1.preheader.us
1619d28473aSSam Parker
1629d28473aSSam Parkerwhile.cond1.preheader.us:
1639d28473aSSam Parker  %i.021.us = phi i32 [ %inc6.us, %while.cond1.while.end_crit_edge.us ], [ 0, %entry ]
1649d28473aSSam Parker  %mul.us = mul i32 %i.021.us, %N
165b2ac9681SDavid Green  %start = call i32 @llvm.start.loop.iterations.i32(i32 %N)
1669d28473aSSam Parker  br label %while.body3.us
1679d28473aSSam Parker
1689d28473aSSam Parkerwhile.body3.us:
1699d28473aSSam Parker  %j.019.us = phi i32 [ 0, %while.cond1.preheader.us ], [ %inc.us, %while.body3.us ]
170b2ac9681SDavid Green  %0 = phi i32 [ %start, %while.cond1.preheader.us ], [ %1, %while.body3.us ]
1719d28473aSSam Parker  %add.us = add i32 %j.019.us, %mul.us
172d17f4f26SMatt Arsenault  %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us
173d17f4f26SMatt Arsenault  store i32 %add.us, ptr %arrayidx.us, align 4
1749d28473aSSam Parker  %inc.us = add nuw i32 %j.019.us, 1
175b0614509SSjoerd Meijer  %1 = call i32 @llvm.loop.decrement.reg.i32(i32 %0, i32 1)
1769d28473aSSam Parker  %2 = icmp ne i32 %1, 0
1779d28473aSSam Parker  br i1 %2, label %while.body3.us, label %while.cond1.while.end_crit_edge.us
1789d28473aSSam Parker
1799d28473aSSam Parkerwhile.cond1.while.end_crit_edge.us:
1809d28473aSSam Parker  %inc6.us = add nuw i32 %i.021.us, 1
1819d28473aSSam Parker  %exitcond23 = icmp eq i32 %inc6.us, %N
1829d28473aSSam Parker  br i1 %exitcond23, label %while.end7, label %while.cond1.preheader.us
1839d28473aSSam Parker
1849d28473aSSam Parkerwhile.end7:
1859d28473aSSam Parker  ret void
1869d28473aSSam Parker}
1879d28473aSSam Parker
1881bd3d00eSSam Parker; CHECK-LABEL: not_rotated
189b2ac9681SDavid Green; CHECK-NOT: call i32 @llvm.start.loop.iterations
1901bd3d00eSSam Parker; CHECK-NOT: call i32 @llvm.loop.decrement.i32
191d17f4f26SMatt Arsenaultdefine void @not_rotated(i32, ptr nocapture, i16 signext) {
1921bd3d00eSSam Parker  br label %4
1931bd3d00eSSam Parker
1941bd3d00eSSam Parker4:
1951bd3d00eSSam Parker  %5 = phi i32 [ 0, %3 ], [ %19, %18 ]
1961bd3d00eSSam Parker  %6 = icmp eq i32 %5, %0
1971bd3d00eSSam Parker  br i1 %6, label %20, label %7
1981bd3d00eSSam Parker
1991bd3d00eSSam Parker7:
2001bd3d00eSSam Parker  %8 = mul i32 %5, %0
2011bd3d00eSSam Parker  br label %9
2021bd3d00eSSam Parker
2031bd3d00eSSam Parker9:
2041bd3d00eSSam Parker  %10 = phi i32 [ %17, %12 ], [ 0, %7 ]
2051bd3d00eSSam Parker  %11 = icmp eq i32 %10, %0
2061bd3d00eSSam Parker  br i1 %11, label %18, label %12
2071bd3d00eSSam Parker
2081bd3d00eSSam Parker12:
2091bd3d00eSSam Parker  %13 = add i32 %10, %8
210d17f4f26SMatt Arsenault  %14 = getelementptr inbounds i16, ptr %1, i32 %13
211d17f4f26SMatt Arsenault  %15 = load i16, ptr %14, align 2
2121bd3d00eSSam Parker  %16 = add i16 %15, %2
213d17f4f26SMatt Arsenault  store i16 %16, ptr %14, align 2
2141bd3d00eSSam Parker  %17 = add i32 %10, 1
2151bd3d00eSSam Parker  br label %9
2161bd3d00eSSam Parker
2171bd3d00eSSam Parker18:
2181bd3d00eSSam Parker  %19 = add i32 %5, 1
2191bd3d00eSSam Parker  br label %4
2201bd3d00eSSam Parker
2211bd3d00eSSam Parker20:
2221bd3d00eSSam Parker  ret void
2231bd3d00eSSam Parker}
2241bd3d00eSSam Parker
2251bd3d00eSSam Parker; CHECK-LABEL: multi_latch
226b2ac9681SDavid Green; CHECK-NOT: call i32 @llvm.start.loop.iterations
2271bd3d00eSSam Parker; CHECK-NOT: call i32 @llvm.loop.decrement
228d17f4f26SMatt Arsenaultdefine void @multi_latch(ptr %a, ptr %b, i32 %N) {
2291bd3d00eSSam Parkerentry:
2301bd3d00eSSam Parker  %half = lshr i32 %N, 1
2311bd3d00eSSam Parker  br label %header
2321bd3d00eSSam Parker
2331bd3d00eSSam Parkerheader:
2341bd3d00eSSam Parker  %iv = phi i32 [ 0, %entry ], [ %count.next, %latch.0 ], [ %count.next, %latch.1 ]
2351bd3d00eSSam Parker  %cmp = icmp ult i32 %iv, %half
236d17f4f26SMatt Arsenault  %addr.a = getelementptr i32, ptr %a, i32 %iv
237d17f4f26SMatt Arsenault  %addr.b = getelementptr i32, ptr %b, i32 %iv
2381bd3d00eSSam Parker  br i1 %cmp, label %if.then, label %if.else
2391bd3d00eSSam Parker
2401bd3d00eSSam Parkerif.then:
241d17f4f26SMatt Arsenault  store i32 %iv, ptr %addr.a
2421bd3d00eSSam Parker  br label %latch.0
2431bd3d00eSSam Parker
2441bd3d00eSSam Parkerif.else:
245d17f4f26SMatt Arsenault  store i32 %iv, ptr %addr.b
2461bd3d00eSSam Parker  br label %latch.0
2471bd3d00eSSam Parker
2481bd3d00eSSam Parkerlatch.0:
2491bd3d00eSSam Parker  %count.next = add nuw i32 %iv, 1
2501bd3d00eSSam Parker  %cmp.1 = icmp ult i32 %count.next, %half
2511bd3d00eSSam Parker  br i1 %cmp.1, label %header, label %latch.1
2521bd3d00eSSam Parker
2531bd3d00eSSam Parkerlatch.1:
254d17f4f26SMatt Arsenault  %ld = load i32, ptr %addr.a
255d17f4f26SMatt Arsenault  store i32 %ld, ptr %addr.b
2561bd3d00eSSam Parker  %cmp.2 = icmp ult i32 %count.next, %N
2571bd3d00eSSam Parker  br i1 %cmp.2, label %header, label %latch.1
2581bd3d00eSSam Parker
2591bd3d00eSSam Parkerexit:
2601bd3d00eSSam Parker  ret void
2611bd3d00eSSam Parker}
2621bd3d00eSSam Parker
263a6fd919cSSam Parker; CHECK-LABEL: search
26498722691SSam Parker; CHECK: entry:
265fad70c30SDavid Green; CHECK:   [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N)
266fad70c30SDavid Green; CHECK:   [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1
26798722691SSam Parker; CHECK:   br i1 [[TEST]], label %for.body.preheader, label %for.cond.cleanup
268a6fd919cSSam Parker; CHECK: for.body.preheader:
269a6fd919cSSam Parker; CHECK:   br label %for.body
270a6fd919cSSam Parker; CHECK: for.body:
271a6fd919cSSam Parker; CHECK: for.inc:
272b0614509SSjoerd Meijer; CHECK:   [[LOOP_DEC:%[^ ]+]] = call i32 @llvm.loop.decrement.reg.i32(
273a6fd919cSSam Parker; CHECK:   [[CMP:%[^ ]+]] = icmp ne i32 [[LOOP_DEC]], 0
274a6fd919cSSam Parker; CHECK:   br i1 [[CMP]], label %for.body, label %for.cond.cleanup
275d17f4f26SMatt Arsenaultdefine i32 @search(ptr nocapture readonly %c, i32 %N) {
276a6fd919cSSam Parkerentry:
277a6fd919cSSam Parker  %cmp11 = icmp eq i32 %N, 0
278a6fd919cSSam Parker  br i1 %cmp11, label %for.cond.cleanup, label %for.body
279a6fd919cSSam Parker
280a6fd919cSSam Parkerfor.cond.cleanup:
281a6fd919cSSam Parker  %found.0.lcssa = phi i32 [ 0, %entry ], [ %found.1, %for.inc ]
282a6fd919cSSam Parker  %spaces.0.lcssa = phi i32 [ 0, %entry ], [ %spaces.1, %for.inc ]
283a6fd919cSSam Parker  %sub = sub nsw i32 %found.0.lcssa, %spaces.0.lcssa
284a6fd919cSSam Parker  ret i32 %sub
285a6fd919cSSam Parker
286a6fd919cSSam Parkerfor.body:
287a6fd919cSSam Parker  %i.014 = phi i32 [ %inc3, %for.inc ], [ 0, %entry ]
288a6fd919cSSam Parker  %spaces.013 = phi i32 [ %spaces.1, %for.inc ], [ 0, %entry ]
289a6fd919cSSam Parker  %found.012 = phi i32 [ %found.1, %for.inc ], [ 0, %entry ]
290d17f4f26SMatt Arsenault  %arrayidx = getelementptr inbounds i8, ptr %c, i32 %i.014
291d17f4f26SMatt Arsenault  %0 = load i8, ptr %arrayidx, align 1
292a6fd919cSSam Parker  switch i8 %0, label %for.inc [
293a6fd919cSSam Parker    i8 108, label %sw.bb
294a6fd919cSSam Parker    i8 111, label %sw.bb
295a6fd919cSSam Parker    i8 112, label %sw.bb
296a6fd919cSSam Parker    i8 32, label %sw.bb1
297a6fd919cSSam Parker  ]
298a6fd919cSSam Parker
299a6fd919cSSam Parkersw.bb:                                            ; preds = %for.body, %for.body, %for.body
300a6fd919cSSam Parker  %inc = add nsw i32 %found.012, 1
301a6fd919cSSam Parker  br label %for.inc
302a6fd919cSSam Parker
303a6fd919cSSam Parkersw.bb1:                                           ; preds = %for.body
304a6fd919cSSam Parker  %inc2 = add nsw i32 %spaces.013, 1
305a6fd919cSSam Parker  br label %for.inc
306a6fd919cSSam Parker
307a6fd919cSSam Parkerfor.inc:                                          ; preds = %sw.bb, %sw.bb1, %for.body
308a6fd919cSSam Parker  %found.1 = phi i32 [ %found.012, %for.body ], [ %found.012, %sw.bb1 ], [ %inc, %sw.bb ]
309a6fd919cSSam Parker  %spaces.1 = phi i32 [ %spaces.013, %for.body ], [ %inc2, %sw.bb1 ], [ %spaces.013, %sw.bb ]
310a6fd919cSSam Parker  %inc3 = add nuw i32 %i.014, 1
311a6fd919cSSam Parker  %exitcond = icmp eq i32 %inc3, %N
312a6fd919cSSam Parker  br i1 %exitcond, label %for.cond.cleanup, label %for.body
313a6fd919cSSam Parker}
314a6fd919cSSam Parker
315a6fd919cSSam Parker; CHECK-LABEL: unroll_inc_int
316b2ac9681SDavid Green; CHECK: call i32 @llvm.start.loop.iterations.i32(i32 %N)
317b0614509SSjoerd Meijer; CHECK: call i32 @llvm.loop.decrement.reg.i32(
318a6fd919cSSam Parker
31998722691SSam Parker; CHECK-UNROLL-LABEL: unroll_inc_int
320a6fd919cSSam Parker; CHECK-UNROLL:     [[PREHEADER:.LBB[0-9_]+]]: @ %for.body.preheader
321a6fd919cSSam Parker; CHECK-UNROLL-NOT: dls
322a6fd919cSSam Parker; CHECK-UNROLL:     [[LOOP:.LBB[0-9_]+]]: @ %for.body
3238d85e945SPhilip Reames; CHECK-UNROLL:     le lr, [[LOOP]]
324fad70c30SDavid Green; CHECK-UNROLL:     wls lr, r12, [[EXIT:.LBB[0-9_]+]]
32598722691SSam Parker; CHECK-UNROLL:     [[EPIL:.LBB[0-9_]+]]:
32698722691SSam Parker; CHECK-UNROLL:     le lr, [[EPIL]]
32798722691SSam Parker; CHECK-UNROLL-NEXT: [[EXIT]]
328a6fd919cSSam Parker
329d17f4f26SMatt Arsenaultdefine void @unroll_inc_int(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) {
330a6fd919cSSam Parkerentry:
331a6fd919cSSam Parker  %cmp8 = icmp sgt i32 %N, 0
332a6fd919cSSam Parker  br i1 %cmp8, label %for.body, label %for.cond.cleanup
333a6fd919cSSam Parker
334a6fd919cSSam Parkerfor.cond.cleanup:
335a6fd919cSSam Parker  ret void
336a6fd919cSSam Parker
337a6fd919cSSam Parkerfor.body:
338a6fd919cSSam Parker  %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
339d17f4f26SMatt Arsenault  %arrayidx = getelementptr inbounds i32, ptr %b, i32 %i.09
340d17f4f26SMatt Arsenault  %0 = load i32, ptr %arrayidx, align 4
341d17f4f26SMatt Arsenault  %arrayidx1 = getelementptr inbounds i32, ptr %c, i32 %i.09
342d17f4f26SMatt Arsenault  %1 = load i32, ptr %arrayidx1, align 4
343a6fd919cSSam Parker  %mul = mul nsw i32 %1, %0
344d17f4f26SMatt Arsenault  %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 %i.09
345d17f4f26SMatt Arsenault  store i32 %mul, ptr %arrayidx2, align 4
346a6fd919cSSam Parker  %inc = add nuw nsw i32 %i.09, 1
347a6fd919cSSam Parker  %exitcond = icmp eq i32 %inc, %N
348a6fd919cSSam Parker  br i1 %exitcond, label %for.cond.cleanup, label %for.body
349a6fd919cSSam Parker}
350a6fd919cSSam Parker
351a6fd919cSSam Parker; CHECK-LABEL: unroll_inc_unsigned
352fad70c30SDavid Green; CHECK: call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N)
353b0614509SSjoerd Meijer; CHECK: call i32 @llvm.loop.decrement.reg.i32(
354a6fd919cSSam Parker
35598722691SSam Parker; CHECK-UNROLL-LABEL: unroll_inc_unsigned
356a6fd919cSSam Parker; CHECK-UNROLL:     [[PREHEADER:.LBB[0-9_]+]]: @ %for.body.preheader
357a6fd919cSSam Parker; CHECK-UNROLL-NOT: dls
358a6fd919cSSam Parker; CHECK-UNROLL:     [[LOOP:.LBB[0-9_]+]]: @ %for.body
3598d85e945SPhilip Reames; CHECK-UNROLL:     le lr, [[LOOP]]
360fad70c30SDavid Green; CHECK-UNROLL:     wls lr, r12, [[EPIL_EXIT:.LBB[0-9_]+]]
36198722691SSam Parker; CHECK-UNROLL: [[EPIL:.LBB[0-9_]+]]:
36298722691SSam Parker; CHECK-UNROLL:     le lr, [[EPIL]]
36398722691SSam Parker; CHECK-UNROLL: [[EPIL_EXIT]]:
36498722691SSam Parker; CHECK-UNROLL:     pop
365d17f4f26SMatt Arsenaultdefine void @unroll_inc_unsigned(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) {
366a6fd919cSSam Parkerentry:
367a6fd919cSSam Parker  %cmp8 = icmp eq i32 %N, 0
368a6fd919cSSam Parker  br i1 %cmp8, label %for.cond.cleanup, label %for.body
369a6fd919cSSam Parker
370a6fd919cSSam Parkerfor.cond.cleanup:
371a6fd919cSSam Parker  ret void
372a6fd919cSSam Parker
373a6fd919cSSam Parkerfor.body:
374a6fd919cSSam Parker  %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ]
375d17f4f26SMatt Arsenault  %arrayidx = getelementptr inbounds i32, ptr %b, i32 %i.09
376d17f4f26SMatt Arsenault  %0 = load i32, ptr %arrayidx, align 4
377d17f4f26SMatt Arsenault  %arrayidx1 = getelementptr inbounds i32, ptr %c, i32 %i.09
378d17f4f26SMatt Arsenault  %1 = load i32, ptr %arrayidx1, align 4
379a6fd919cSSam Parker  %mul = mul nsw i32 %1, %0
380d17f4f26SMatt Arsenault  %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 %i.09
381d17f4f26SMatt Arsenault  store i32 %mul, ptr %arrayidx2, align 4
382a6fd919cSSam Parker  %inc = add nuw i32 %i.09, 1
383a6fd919cSSam Parker  %exitcond = icmp eq i32 %inc, %N
384a6fd919cSSam Parker  br i1 %exitcond, label %for.cond.cleanup, label %for.body
385a6fd919cSSam Parker}
386a6fd919cSSam Parker
387a6fd919cSSam Parker; CHECK-LABEL: unroll_dec_int
388b2ac9681SDavid Green; CHECK: call i32 @llvm.start.loop.iterations.i32(i32 %N)
389b0614509SSjoerd Meijer; CHECK: call i32 @llvm.loop.decrement.reg.i32(
390a6fd919cSSam Parker
39198722691SSam Parker; CHECK-UNROLL-LABEL: unroll_dec_int:
39298722691SSam Parker; CHECK-UNROLL:         wls lr, {{.*}}, [[PROLOGUE_EXIT:.LBB[0-9_]+]]
39398722691SSam Parker; CHECK-UNROLL-NEXT: [[PROLOGUE:.LBB[0-9_]+]]:
39498722691SSam Parker; CHECK-UNROLL:         le lr, [[PROLOGUE]]
39598722691SSam Parker; CHECK-UNROLL-NEXT: [[PROLOGUE_EXIT:.LBB[0-9_]+]]:
39698722691SSam Parker; CHECK-UNROLL:      [[BODY:.LBB[0-9_]+]]:
39798722691SSam Parker; CHECK-UNROLL:         le lr, [[BODY]]
39898722691SSam Parker; CHECK-UNROLL-NOT:     b
39998722691SSam Parker; CHECK-UNROLL:         pop
400d17f4f26SMatt Arsenaultdefine void @unroll_dec_int(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) {
401a6fd919cSSam Parkerentry:
402a6fd919cSSam Parker  %cmp8 = icmp sgt i32 %N, 0
403a6fd919cSSam Parker  br i1 %cmp8, label %for.body, label %for.cond.cleanup
404a6fd919cSSam Parker
405a6fd919cSSam Parkerfor.cond.cleanup:
406a6fd919cSSam Parker  ret void
407a6fd919cSSam Parker
408a6fd919cSSam Parkerfor.body:
409a6fd919cSSam Parker  %i.09 = phi i32 [ %dec, %for.body ], [ %N, %entry ]
410d17f4f26SMatt Arsenault  %arrayidx = getelementptr inbounds i32, ptr %b, i32 %i.09
411d17f4f26SMatt Arsenault  %0 = load i32, ptr %arrayidx, align 4
412d17f4f26SMatt Arsenault  %arrayidx1 = getelementptr inbounds i32, ptr %c, i32 %i.09
413d17f4f26SMatt Arsenault  %1 = load i32, ptr %arrayidx1, align 4
414a6fd919cSSam Parker  %mul = mul nsw i32 %1, %0
415d17f4f26SMatt Arsenault  %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 %i.09
416d17f4f26SMatt Arsenault  store i32 %mul, ptr %arrayidx2, align 4
417a6fd919cSSam Parker  %dec = add nsw i32 %i.09, -1
418a6fd919cSSam Parker  %cmp = icmp sgt i32 %dec, 0
419a6fd919cSSam Parker  br i1 %cmp, label %for.body, label %for.cond.cleanup
420a6fd919cSSam Parker}
4211bd3d00eSSam Parker
422b2ac9681SDavid Greendeclare i32 @llvm.start.loop.iterations.i32(i32) #0
423fad70c30SDavid Greendeclare { i32, i1 } @llvm.test.start.loop.iterations.i32(i32) #0
424b0614509SSjoerd Meijerdeclare i32 @llvm.loop.decrement.reg.i32(i32, i32) #0
4259d28473aSSam Parker
426