brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 91b68ce Raw
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