1 ; RUN: opt -S %s -simplifycfg | FileCheck %s
3 define void @test(i32 %length.i, i32 %i) {
5 %iplus1 = add nsw i32 %i, 1
6 %var29 = icmp slt i32 %i, %length.i
7 %var30 = icmp slt i32 %iplus1, %length.i
8 ; CHECK: br i1 %var30, label %in_bounds, label %next
9 br i1 %var29, label %next, label %out_of_bounds, !prof !{!"branch_weights", i32 1000, i32 0}
13 ; CHECK: br i1 %var29, label %out_of_bounds2, label %out_of_bounds
14 br i1 %var30, label %in_bounds, label %out_of_bounds2, !prof !{!"branch_weights", i32 1000, i32 0}
28 define void @test2(i32 %length.i, i32 %i) {
30 %var29 = icmp slt i32 %i, %length.i
31 ; CHECK: br i1 %var30, label %in_bounds, label %next
32 br i1 %var29, label %next, label %out_of_bounds, !prof !{!"branch_weights", i32 1000, i32 0}
36 ; CHECK: br i1 %var29, label %out_of_bounds2, label %out_of_bounds
37 %iplus1 = add nsw i32 %i, 1
38 %var30 = icmp slt i32 %iplus1, %length.i
39 br i1 %var30, label %in_bounds, label %out_of_bounds2, !prof !{!"branch_weights", i32 1000, i32 0}
53 ; As written, this one can't trigger today. It would require us to duplicate
54 ; the %val1 load down two paths and that's not implemented yet.
55 define i64 @test3(i32 %length.i, i32 %i, i64* %base) {
57 %var29 = icmp slt i32 %i, %length.i
58 ; CHECK: br i1 %var29, label %next, label %out_of_bounds
59 br i1 %var29, label %next, label %out_of_bounds, !prof !{!"branch_weights", i32 1000, i32 0}
63 %addr1 = getelementptr i64, i64* %base, i32 %i
64 %val1 = load i64, i64* %addr1
65 %iplus1 = add nsw i32 %i, 1
66 %var30 = icmp slt i32 %iplus1, %length.i
67 ; CHECK: br i1 %var30, label %in_bounds, label %out_of_bounds2
68 br i1 %var30, label %in_bounds, label %out_of_bounds2, !prof !{!"branch_weights", i32 1000, i32 0}
71 %addr2 = getelementptr i64, i64* %base, i32 %iplus1
72 %val2 = load i64, i64* %addr2
73 %res = sub i64 %val1, %val2
81 call void @foo(i64 %val1)
85 declare void @foo(i64)