1*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;force-hardware-loop-guard;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-EXIT 2*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;force-hardware-loop-guard;force-hardware-loop-phi;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LATCH 3*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=NO-GUARD 49a92be1bSSam Parker 59a92be1bSSam Parker; NO-GUARD-NOT: @llvm.test.set.loop.iterations 69a92be1bSSam Parker 79a92be1bSSam Parker; CHECK-LABEL: test1 89a92be1bSSam Parker; CHECK: entry: 9b46c085dSRoman Lebedev; CHECK: [[MAX:%[^ ]+]] = call i32 @llvm.umax.i32(i32 %N, i32 2) 109a92be1bSSam Parker; CHECK: [[COUNT:%[^ ]+]] = add i32 [[MAX]], -1 119a92be1bSSam Parker; CHECK: br i1 %t1, label %do.body.preheader 129a92be1bSSam Parker; CHECK: do.body.preheader: 13b2ac9681SDavid Green; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 [[COUNT]]) 14b2ac9681SDavid Green; CHECK-LATCH: call i32 @llvm.start.loop.iterations.i32(i32 [[COUNT]]) 159a92be1bSSam Parker; CHECK: br label %do.body 16d17f4f26SMatt Arsenaultdefine void @test1(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 179a92be1bSSam Parkerentry: 189a92be1bSSam Parker br i1 %t1, label %do.body, label %if.end 199a92be1bSSam Parker 209a92be1bSSam Parkerdo.body: ; preds = %do.body, %entry 21d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ] 22d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr1, %do.body ], [ %a, %entry ] 239a92be1bSSam Parker %i.0 = phi i32 [ %inc, %do.body ], [ 1, %entry ] 24d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 25d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 26d17f4f26SMatt Arsenault %incdec.ptr1 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 27d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 289a92be1bSSam Parker %inc = add nuw i32 %i.0, 1 299a92be1bSSam Parker %cmp = icmp ult i32 %inc, %N 309a92be1bSSam Parker br i1 %cmp, label %do.body, label %if.end 319a92be1bSSam Parker 329a92be1bSSam Parkerif.end: ; preds = %do.body, %entry 339a92be1bSSam Parker ret void 349a92be1bSSam Parker} 359a92be1bSSam Parker 369a92be1bSSam Parker; CHECK-LABEL: test2 379a92be1bSSam Parker; CHECK-NOT: call i1 @llvm.test.set.loop.iterations 389a92be1bSSam Parker; CHECK-NOT: call void @llvm.set.loop.iterations 39b2ac9681SDavid Green; CHECK-NOT: call i32 @llvm.start.loop.iterations 40d17f4f26SMatt Arsenaultdefine void @test2(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 419a92be1bSSam Parkerentry: 429a92be1bSSam Parker br i1 %t1, label %do.body, label %if.end 439a92be1bSSam Parker 449a92be1bSSam Parkerdo.body: ; preds = %do.body, %entry 45d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ] 46d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr1, %do.body ], [ %a, %entry ] 479a92be1bSSam Parker %i.0 = phi i32 [ %add, %do.body ], [ 1, %entry ] 48d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 49d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 50d17f4f26SMatt Arsenault %incdec.ptr1 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 51d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 529a92be1bSSam Parker %add = add i32 %i.0, 2 539a92be1bSSam Parker %cmp = icmp ult i32 %add, %N 549a92be1bSSam Parker br i1 %cmp, label %do.body, label %if.end 559a92be1bSSam Parker 569a92be1bSSam Parkerif.end: ; preds = %do.body, %entry 579a92be1bSSam Parker ret void 589a92be1bSSam Parker} 599a92be1bSSam Parker 609a92be1bSSam Parker; CHECK-LABEL: test3 619a92be1bSSam Parker; CHECK: entry: 62b46c085dSRoman Lebedev; CHECK: [[COUNT:%[^ ]+]] = call i32 @llvm.umax.i32(i32 %N, i32 1) 639a92be1bSSam Parker; CHECK: br i1 %brmerge.demorgan, label %do.body.preheader 649a92be1bSSam Parker; CHECK: do.body.preheader: 65b2ac9681SDavid Green; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 [[COUNT]]) 66b2ac9681SDavid Green; CHECK-LATCH: call i32 @llvm.start.loop.iterations.i32(i32 [[COUNT]]) 679a92be1bSSam Parker; CHECK: br label %do.body 68d17f4f26SMatt Arsenaultdefine void @test3(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 699a92be1bSSam Parkerentry: 709a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %t2 719a92be1bSSam Parker br i1 %brmerge.demorgan, label %do.body, label %if.end 729a92be1bSSam Parker 739a92be1bSSam Parkerdo.body: ; preds = %do.body, %entry 74d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ] 75d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ] 769a92be1bSSam Parker %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ] 77d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 78d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 79d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 80d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 819a92be1bSSam Parker %inc = add nuw i32 %i.0, 1 829a92be1bSSam Parker %cmp = icmp ult i32 %inc, %N 839a92be1bSSam Parker br i1 %cmp, label %do.body, label %if.end 849a92be1bSSam Parker 859a92be1bSSam Parkerif.end: ; preds = %do.body, %entry 869a92be1bSSam Parker ret void 879a92be1bSSam Parker} 889a92be1bSSam Parker 899a92be1bSSam Parker; CHECK-LABEL: test4 909a92be1bSSam Parker; CHECK: entry: 919a92be1bSSam Parker; CHECK-LATCH: br i1 %brmerge.demorgan, label %while.cond 92b2ac9681SDavid Green; CHECK-LATCH-NOT: @llvm{{.*}}loop.iterations 939a92be1bSSam Parker; CHECK-EXIT: br i1 %brmerge.demorgan, label %while.cond.preheader 949a92be1bSSam Parker; CHECK-EXIT: while.cond.preheader: 959a92be1bSSam Parker; CHECK-EXIT: [[COUNT:%[^ ]+]] = add i32 %N, 1 969a92be1bSSam Parker; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 [[COUNT]]) 979a92be1bSSam Parker; CHECK-EXIT: br label %while.cond 98d17f4f26SMatt Arsenaultdefine void @test4(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 999a92be1bSSam Parkerentry: 1009a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %t2 1019a92be1bSSam Parker br i1 %brmerge.demorgan, label %while.cond, label %if.end 1029a92be1bSSam Parker 1039a92be1bSSam Parkerwhile.cond: ; preds = %while.body, %entry 104d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %entry ] 105d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %entry ] 1069a92be1bSSam Parker %i.0 = phi i32 [ %inc, %while.body ], [ 0, %entry ] 1079a92be1bSSam Parker %exitcond = icmp eq i32 %i.0, %N 1089a92be1bSSam Parker br i1 %exitcond, label %if.end, label %while.body 1099a92be1bSSam Parker 1109a92be1bSSam Parkerwhile.body: ; preds = %while.cond 111d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 112d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 113d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 114d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 1159a92be1bSSam Parker %inc = add i32 %i.0, 1 1169a92be1bSSam Parker br label %while.cond 1179a92be1bSSam Parker 1189a92be1bSSam Parkerif.end: ; preds = %while.cond, %entry 1199a92be1bSSam Parker ret void 1209a92be1bSSam Parker} 1219a92be1bSSam Parker 1229a92be1bSSam Parker; CHECK-LABEL: test5 1239a92be1bSSam Parker; CHECK: entry: 1249a92be1bSSam Parker; CHECK: br i1 %or.cond, label %while.body.preheader 1259a92be1bSSam Parker; CHECK: while.body.preheader: 126b2ac9681SDavid Green; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 %N) 127b2ac9681SDavid Green; CHECK-LATCH: call i32 @llvm.start.loop.iterations.i32(i32 %N) 1289a92be1bSSam Parker; CHECK: br label %while.body 129d17f4f26SMatt Arsenaultdefine void @test5(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 1309a92be1bSSam Parkerentry: 1319a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %t2 1329a92be1bSSam Parker %cmp6 = icmp ne i32 %N, 0 1339a92be1bSSam Parker %or.cond = and i1 %brmerge.demorgan, %cmp6 1349a92be1bSSam Parker br i1 %or.cond, label %while.body, label %if.end 1359a92be1bSSam Parker 1369a92be1bSSam Parkerwhile.body: ; preds = %while.body, %entry 1379a92be1bSSam Parker %i.09 = phi i32 [ %inc, %while.body ], [ 0, %entry ] 138d17f4f26SMatt Arsenault %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %entry ] 139d17f4f26SMatt Arsenault %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %entry ] 140d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1 141d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.07, align 4 142d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1 143d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.08, align 4 1449a92be1bSSam Parker %inc = add nuw i32 %i.09, 1 1459a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 1469a92be1bSSam Parker br i1 %exitcond, label %if.end, label %while.body 1479a92be1bSSam Parker 1489a92be1bSSam Parkerif.end: ; preds = %while.body, %entry 1499a92be1bSSam Parker ret void 1509a92be1bSSam Parker} 1519a92be1bSSam Parker 1529a92be1bSSam Parker; CHECK-LABEL: test6 1539a92be1bSSam Parker; CHECK: entry: 1549a92be1bSSam Parker; CHECK: br i1 %brmerge.demorgan, label %while.preheader 1559a92be1bSSam Parker; CHECK: while.preheader: 156fad70c30SDavid Green; CHECK-EXIT: [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %N) 157fad70c30SDavid Green; CHECK-LATCH: [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N) 158fad70c30SDavid Green; CHECK-LATCH: [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1 1599a92be1bSSam Parker; CHECK: br i1 [[TEST]], label %while.body.preheader, label %if.end 1609a92be1bSSam Parker; CHECK: while.body.preheader: 1619a92be1bSSam Parker; CHECK: br label %while.body 162d17f4f26SMatt Arsenaultdefine void @test6(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 1639a92be1bSSam Parkerentry: 1649a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %t2 1659a92be1bSSam Parker br i1 %brmerge.demorgan, label %while.preheader, label %if.end 1669a92be1bSSam Parker 1679a92be1bSSam Parkerwhile.preheader: ; preds = %entry 1689a92be1bSSam Parker %cmp = icmp ne i32 %N, 0 1699a92be1bSSam Parker br i1 %cmp, label %while.body, label %if.end 1709a92be1bSSam Parker 1719a92be1bSSam Parkerwhile.body: ; preds = %while.body, %while.preheader 1729a92be1bSSam Parker %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ] 173d17f4f26SMatt Arsenault %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ] 174d17f4f26SMatt Arsenault %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ] 175d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1 176d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.07, align 4 177d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1 178d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.08, align 4 1799a92be1bSSam Parker %inc = add nuw i32 %i.09, 1 1809a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 1819a92be1bSSam Parker br i1 %exitcond, label %if.end, label %while.body 1829a92be1bSSam Parker 1839a92be1bSSam Parkerif.end: ; preds = %while.body, %while.preheader, %entry 1849a92be1bSSam Parker ret void 1859a92be1bSSam Parker} 1869a92be1bSSam Parker 1879a92be1bSSam Parker; CHECK-LABEL: test7 1889a92be1bSSam Parker; CHECK: entry: 1899a92be1bSSam Parker; CHECK: br i1 %brmerge.demorgan, label %while.preheader 1909a92be1bSSam Parker; CHECK: while.preheader: 191fad70c30SDavid Green; CHECK-EXIT: [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %N) 192fad70c30SDavid Green; CHECK-LATCH: [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N) 193fad70c30SDavid Green; CHECK-LATCH: [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1 1949a92be1bSSam Parker; CHECK: br i1 [[TEST]], label %while.body.preheader, label %if.end 1959a92be1bSSam Parker; CHECK: while.body.preheader: 1969a92be1bSSam Parker; CHECK: br label %while.body 197d17f4f26SMatt Arsenaultdefine void @test7(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 1989a92be1bSSam Parkerentry: 1999a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %t2 2009a92be1bSSam Parker br i1 %brmerge.demorgan, label %while.preheader, label %if.end 2019a92be1bSSam Parker 2029a92be1bSSam Parkerwhile.preheader: ; preds = %entry 2039a92be1bSSam Parker %cmp = icmp eq i32 %N, 0 2049a92be1bSSam Parker br i1 %cmp, label %if.end, label %while.body 2059a92be1bSSam Parker 2069a92be1bSSam Parkerwhile.body: ; preds = %while.body, %while.preheader 2079a92be1bSSam Parker %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ] 208d17f4f26SMatt Arsenault %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ] 209d17f4f26SMatt Arsenault %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ] 210d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1 211d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.07, align 4 212d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1 213d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.08, align 4 2149a92be1bSSam Parker %inc = add nuw i32 %i.09, 1 2159a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 2169a92be1bSSam Parker br i1 %exitcond, label %if.end, label %while.body 2179a92be1bSSam Parker 2189a92be1bSSam Parkerif.end: ; preds = %while.body, %while.preheader, %entry 2199a92be1bSSam Parker ret void 2209a92be1bSSam Parker} 2219a92be1bSSam Parker 2229a92be1bSSam Parker; TODO: Can we rearrange the conditional blocks so that we can use the test form? 2239a92be1bSSam Parker; CHECK-LABEL: test8 2249a92be1bSSam Parker; CHECK: entry: 2259a92be1bSSam Parker; CHECK: [[CMP:%[^ ]+]] = icmp ne i32 %N, 0 2269a92be1bSSam Parker; CHECK: br i1 [[CMP]], label %while.preheader 2279a92be1bSSam Parker; CHECK: while.preheader: 2289a92be1bSSam Parker; CHECK: br i1 %brmerge.demorgan, label %while.body.preheader 2299a92be1bSSam Parker; CHECK: while.body.preheader: 230b2ac9681SDavid Green; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 %N) 231b2ac9681SDavid Green; CHECK-LATCH: call i32 @llvm.start.loop.iterations.i32(i32 %N) 2329a92be1bSSam Parker; CHECK: br label %while.body 233d17f4f26SMatt Arsenaultdefine void @test8(i1 zeroext %t1, i1 zeroext %t2, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 2349a92be1bSSam Parkerentry: 2359a92be1bSSam Parker %cmp = icmp ne i32 %N, 0 2369a92be1bSSam Parker br i1 %cmp, label %while.preheader, label %if.end 2379a92be1bSSam Parker 2389a92be1bSSam Parkerwhile.preheader: ; preds = %entry 2399a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %t2 2409a92be1bSSam Parker br i1 %brmerge.demorgan, label %while.body, label %if.end 2419a92be1bSSam Parker 2429a92be1bSSam Parkerwhile.body: ; preds = %while.body, %while.preheader 2439a92be1bSSam Parker %i.09 = phi i32 [ %inc, %while.body ], [ 0, %while.preheader ] 244d17f4f26SMatt Arsenault %a.addr.08 = phi ptr [ %incdec.ptr3, %while.body ], [ %a, %while.preheader ] 245d17f4f26SMatt Arsenault %b.addr.07 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.preheader ] 246d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.07, i32 1 247d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.07, align 4 248d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.08, i32 1 249d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.08, align 4 2509a92be1bSSam Parker %inc = add nuw i32 %i.09, 1 2519a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 2529a92be1bSSam Parker br i1 %exitcond, label %if.end, label %while.body 2539a92be1bSSam Parker 2549a92be1bSSam Parkerif.end: ; preds = %while.body, %while.preheader, %entry 2559a92be1bSSam Parker ret void 2569a92be1bSSam Parker} 2579a92be1bSSam Parker 2589a92be1bSSam Parker; CHECK-LABEL: test9 2599a92be1bSSam Parker; CHECK: entry: 2609a92be1bSSam Parker; CHECK: br i1 %brmerge.demorgan, label %do.body.preheader 2619a92be1bSSam Parker; CHECK: do.body.preheader: 262b2ac9681SDavid Green; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 %N) 263b2ac9681SDavid Green; CHECK-LATCH: call i32 @llvm.start.loop.iterations.i32(i32 %N) 2649a92be1bSSam Parker; CHECK: br label %do.body 265d17f4f26SMatt Arsenaultdefine void @test9(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 2669a92be1bSSam Parkerentry: 2679a92be1bSSam Parker %cmp = icmp ne i32 %N, 0 2689a92be1bSSam Parker %brmerge.demorgan = and i1 %t1, %cmp 2699a92be1bSSam Parker br i1 %brmerge.demorgan, label %do.body, label %if.end 2709a92be1bSSam Parker 2719a92be1bSSam Parkerdo.body: ; preds = %do.body, %entry 272d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ] 273d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ] 2749a92be1bSSam Parker %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ] 275d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 276d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 277d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 278d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 2799a92be1bSSam Parker %inc = add nuw i32 %i.0, 1 2809a92be1bSSam Parker %cmp.1 = icmp ult i32 %inc, %N 2819a92be1bSSam Parker br i1 %cmp.1, label %do.body, label %if.end 2829a92be1bSSam Parker 2839a92be1bSSam Parkerif.end: ; preds = %do.body, %entry 2849a92be1bSSam Parker ret void 2859a92be1bSSam Parker} 2869a92be1bSSam Parker 2879a92be1bSSam Parker; CHECK-LABEL: test10 2889a92be1bSSam Parker; CHECK: entry: 2899a92be1bSSam Parker; CHECK: br i1 %cmp.1, label %do.body.preheader 2909a92be1bSSam Parker; CHECK: do.body.preheader: 291b2ac9681SDavid Green; CHECK-EXIT: call void @llvm.set.loop.iterations.i32(i32 292b2ac9681SDavid Green; CHECK-LATCH: call i32 @llvm.start.loop.iterations.i32(i32 2939a92be1bSSam Parker; CHECK: br label %do.body 294d17f4f26SMatt Arsenaultdefine void @test10(ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 2959a92be1bSSam Parkerentry: 2969a92be1bSSam Parker %cmp = icmp ne i32 %N, 0 2979a92be1bSSam Parker %sub = sub i32 %N, 1 2989a92be1bSSam Parker %be = select i1 %cmp, i32 0, i32 %sub 2999a92be1bSSam Parker %cmp.1 = icmp ne i32 %be, 0 3009a92be1bSSam Parker br i1 %cmp.1, label %do.body, label %if.end 3019a92be1bSSam Parker 3029a92be1bSSam Parkerdo.body: ; preds = %do.body, %entry 303d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %entry ] 304d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %entry ] 3059a92be1bSSam Parker %i.0 = phi i32 [ %inc, %do.body ], [ 0, %entry ] 306d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 307d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 308d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 309d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 3109a92be1bSSam Parker %inc = add nuw i32 %i.0, 1 3119a92be1bSSam Parker %cmp.2 = icmp ult i32 %inc, %N 3129a92be1bSSam Parker br i1 %cmp.2, label %do.body, label %if.end 3139a92be1bSSam Parker 3149a92be1bSSam Parkerif.end: ; preds = %do.body, %entry 3159a92be1bSSam Parker ret void 3169a92be1bSSam Parker} 3179a92be1bSSam Parker 3189a92be1bSSam Parker; CHECK-LABEL: test11 3199a92be1bSSam Parker; CHECK: entry: 3209a92be1bSSam Parker; CHECK: br label %do.body.preheader 3219a92be1bSSam Parker; CHECK: do.body.preheader: 322fad70c30SDavid Green; CHECK-EXIT: [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %N) 323fad70c30SDavid Green; CHECK-LATCH: [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %N) 324fad70c30SDavid Green; CHECK-LATCH: [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1 3259a92be1bSSam Parker; CHECK: br i1 [[TEST]], label %do.body.preheader1, label %if.end 3269a92be1bSSam Parker; CHECK: do.body.preheader1: 3279a92be1bSSam Parker; CHECK: br label %do.body 328d17f4f26SMatt Arsenaultdefine void @test11(i1 zeroext %t1, ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 3299a92be1bSSam Parkerentry: 3309a92be1bSSam Parker br label %do.body.preheader 3319a92be1bSSam Parker 3329a92be1bSSam Parkerdo.body.preheader: 3339a92be1bSSam Parker %cmp = icmp ne i32 %N, 0 3349a92be1bSSam Parker br i1 %cmp, label %do.body, label %if.end 3359a92be1bSSam Parker 3369a92be1bSSam Parkerdo.body: 337d17f4f26SMatt Arsenault %b.addr.0 = phi ptr [ %incdec.ptr, %do.body ], [ %b, %do.body.preheader ] 338d17f4f26SMatt Arsenault %a.addr.0 = phi ptr [ %incdec.ptr3, %do.body ], [ %a, %do.body.preheader ] 3399a92be1bSSam Parker %i.0 = phi i32 [ %inc, %do.body ], [ 0, %do.body.preheader ] 340d17f4f26SMatt Arsenault %incdec.ptr = getelementptr inbounds i32, ptr %b.addr.0, i32 1 341d17f4f26SMatt Arsenault %tmp = load i32, ptr %b.addr.0, align 4 342d17f4f26SMatt Arsenault %incdec.ptr3 = getelementptr inbounds i32, ptr %a.addr.0, i32 1 343d17f4f26SMatt Arsenault store i32 %tmp, ptr %a.addr.0, align 4 3449a92be1bSSam Parker %inc = add nuw i32 %i.0, 1 3459a92be1bSSam Parker %cmp.1 = icmp ult i32 %inc, %N 3469a92be1bSSam Parker br i1 %cmp.1, label %do.body, label %if.end 3479a92be1bSSam Parker 3489a92be1bSSam Parkerif.end: ; preds = %do.body, %entry 3499a92be1bSSam Parker ret void 3509a92be1bSSam Parker} 351c98a8a09SSam Parker 352c98a8a09SSam Parker; CHECK-LABEL: test12 353c98a8a09SSam Parker; CHECK: entry: 354c98a8a09SSam Parker; CHECK-EXIT: [[TEST:%[^ ]+]] = call i1 @llvm.test.set.loop.iterations.i32(i32 %conv) 355c98a8a09SSam Parker; CHECK-LATCH: [[TEST1:%[^ ]+]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 %conv) 356c98a8a09SSam Parker; CHECK-LATCH: [[TEST:%[^ ]+]] = extractvalue { i32, i1 } [[TEST1]], 1 357c98a8a09SSam Parker; CHECK: br i1 [[TEST]], label %for.body.preheader, label %for.end 358c98a8a09SSam Parker; CHECK: for.body.preheader: 359c98a8a09SSam Parker; CHECK: br label %for.body 360c98a8a09SSam Parker 361d17f4f26SMatt Arsenaultdefine void @test12(ptr nocapture %a, ptr nocapture readonly %b, i16 zeroext %length) { 362c98a8a09SSam Parkerentry: 363c98a8a09SSam Parker %conv = zext i16 %length to i32 364c98a8a09SSam Parker %cmp8.not = icmp eq i16 %length, 0 365c98a8a09SSam Parker br i1 %cmp8.not, label %for.end, label %for.body 366c98a8a09SSam Parker 367c98a8a09SSam Parkerfor.body: ; preds = %entry, %for.body 368c98a8a09SSam Parker %i.09 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 369d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %b, i32 %i.09 370d17f4f26SMatt Arsenault %0 = load i32, ptr %arrayidx, align 4 371d17f4f26SMatt Arsenault %arrayidx2 = getelementptr inbounds i32, ptr %a, i32 %i.09 372d17f4f26SMatt Arsenault store i32 %0, ptr %arrayidx2, align 4 373c98a8a09SSam Parker %inc = add nuw nsw i32 %i.09, 1 374c98a8a09SSam Parker %exitcond.not = icmp eq i32 %inc, %conv 375c98a8a09SSam Parker br i1 %exitcond.not, label %for.end, label %for.body 376c98a8a09SSam Parker 377c98a8a09SSam Parkerfor.end: ; preds = %for.body, %entry 378c98a8a09SSam Parker ret void 379c98a8a09SSam Parker} 380