xref: /llvm-project/llvm/test/Transforms/HardwareLoops/loop-guards.ll (revision 2a58be42396376e8d552158ff801d953c6c1bee3)
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