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