140 lines · plain
1; RUN: opt -verify-loop-info -passes=irce -irce-print-range-checks -irce-print-changed-loops %s -S 2>&1 | FileCheck %s2; RUN: opt -verify-loop-info -passes='require<branch-prob>,irce' -irce-print-range-checks -irce-print-changed-loops %s -S 2>&1 | FileCheck %s3 4; Make sure that we can pick up both range checks.5define void @test_01(ptr %arr, ptr %a_len_ptr, ptr %size_ptr) {6 7; CHECK-LABEL: @test_01(8 9entry:10 %len = load i32, ptr %a_len_ptr, !range !011 %size = load i32, ptr %size_ptr12 %first_iter_check = icmp sle i32 %size, 013 br i1 %first_iter_check, label %exit, label %loop14 15loop:16 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]17 %rc1 = icmp slt i32 %iv, %len18 %rc2 = icmp slt i32 %iv, %size19 ; CHECK: %rc = and i1 true, true20 %rc = and i1 %rc1, %rc221 br i1 %rc, label %backedge, label %out_of_bounds22 23 24backedge:25 %iv.next = add i32 %iv, 126 %arr_el_ptr = getelementptr i32, ptr %arr, i32 %iv27 %el = load i32, ptr %arr_el_ptr28 %loopcond = icmp ne i32 %iv, %size29 br i1 %loopcond, label %loop, label %exit30 31exit:32 ret void33 34out_of_bounds:35 ret void36}37 38; Same as test_01, unsigned predicates.39define void @test_02(ptr %arr, ptr %a_len_ptr, ptr %size_ptr) {40 41; CHECK-LABEL: @test_02(42 43entry:44 %len = load i32, ptr %a_len_ptr, !range !045 %size = load i32, ptr %size_ptr46 %first_iter_check = icmp sle i32 %size, 047 br i1 %first_iter_check, label %exit, label %loop48 49loop:50 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]51 %rc1 = icmp ult i32 %iv, %len52 %rc2 = icmp ult i32 %iv, %size53 ; CHECK: %rc = and i1 true, true54 %rc = and i1 %rc1, %rc255 br i1 %rc, label %backedge, label %out_of_bounds56 57 58backedge:59 %iv.next = add i32 %iv, 160 %arr_el_ptr = getelementptr i32, ptr %arr, i32 %iv61 %el = load i32, ptr %arr_el_ptr62 %loopcond = icmp ne i32 %iv, %size63 br i1 %loopcond, label %loop, label %exit64 65exit:66 ret void67 68out_of_bounds:69 ret void70}71 72define void @test_03(ptr %arr, ptr %a_len_ptr, ptr %size_ptr) {73 74; CHECK-LABEL: @test_03(75 76entry:77 %len = load i32, ptr %a_len_ptr, !range !078 %size = load i32, ptr %size_ptr79 %first_iter_check = icmp eq i32 %size, 080 br i1 %first_iter_check, label %exit, label %loop81 82loop:83 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]84 %rc1 = icmp slt i32 %iv, %len85 %rc2 = icmp slt i32 %iv, %size86 ; CHECK: %rc = and i1 true, true87 %rc = and i1 %rc1, %rc288 br i1 %rc, label %backedge, label %out_of_bounds89 90 91backedge:92 %iv.next = add i32 %iv, 193 %arr_el_ptr = getelementptr i32, ptr %arr, i32 %iv94 %el = load i32, ptr %arr_el_ptr95 %loopcond = icmp ne i32 %iv, %len96 br i1 %loopcond, label %loop, label %exit97 98exit:99 ret void100 101out_of_bounds:102 ret void103}104 105define void @test_04(ptr %arr, ptr %a_len_ptr, ptr %size_ptr) {106 107; CHECK-LABEL: @test_04(108 109entry:110 %len = load i32, ptr %a_len_ptr, !range !0111 %size = load i32, ptr %size_ptr112 %first_iter_check = icmp eq i32 %size, 0113 br i1 %first_iter_check, label %exit, label %loop114 115loop:116 %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]117 %rc1 = icmp ult i32 %iv, %len118 %rc2 = icmp ult i32 %iv, %size119 ; CHECK: %rc = and i1 true, true120 %rc = and i1 %rc1, %rc2121 br i1 %rc, label %backedge, label %out_of_bounds122 123 124backedge:125 %iv.next = add i32 %iv, 1126 %arr_el_ptr = getelementptr i32, ptr %arr, i32 %iv127 %el = load i32, ptr %arr_el_ptr128 %loopcond = icmp ne i32 %iv, %len129 br i1 %loopcond, label %loop, label %exit130 131exit:132 ret void133 134out_of_bounds:135 ret void136}137 138!0 = !{i32 0, i32 2147483647}139!1 = !{!"branch_weights", i32 64, i32 4}140