[ARM] Better OR's for MVE compares
[llvm-core.git] / test / Transforms / IRCE / non_known_positive_end.ll
blob135e4461f1a1a4af06ffdb3b6024a03de0b337de
1 ; RUN: opt -verify-loop-info -irce -irce-print-range-checks -irce-print-changed-loops %s -S 2>&1 | FileCheck %s
2 ; RUN: opt -verify-loop-info -passes='require<branch-prob>,loop(irce)' -irce-print-range-checks -irce-print-changed-loops %s -S 2>&1 | FileCheck %s
4 ; Make sure that we can pick up both range checks.
5 define void @test_01(i32 *%arr, i32* %a_len_ptr, i32* %size_ptr) {
7 ; CHECK-LABEL: @test_01(
9 entry:
10   %len = load i32, i32* %a_len_ptr, !range !0
11   %size = load i32, i32* %size_ptr
12   %first_iter_check = icmp sle i32 %size, 0
13   br i1 %first_iter_check, label %exit, label %loop
15 loop:
16   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
17   %rc1 = icmp slt i32 %iv, %len
18   %rc2 = icmp slt i32 %iv, %size
19   ; CHECK: %rc = and i1 true, true
20   %rc = and i1 %rc1, %rc2
21   br i1 %rc, label %backedge, label %out_of_bounds
24 backedge:
25   %iv.next = add i32 %iv, 1
26   %arr_el_ptr = getelementptr i32, i32* %arr, i32 %iv
27   %el = load i32, i32* %arr_el_ptr
28   %loopcond = icmp ne i32 %iv, %size
29   br i1 %loopcond, label %loop, label %exit
31 exit:
32   ret void
34 out_of_bounds:
35   ret void
38 ; Same as test_01, unsigned predicates.
39 define void @test_02(i32 *%arr, i32* %a_len_ptr, i32* %size_ptr) {
41 ; CHECK-LABEL: @test_02(
43 entry:
44   %len = load i32, i32* %a_len_ptr, !range !0
45   %size = load i32, i32* %size_ptr
46   %first_iter_check = icmp sle i32 %size, 0
47   br i1 %first_iter_check, label %exit, label %loop
49 loop:
50   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
51   %rc1 = icmp ult i32 %iv, %len
52   %rc2 = icmp ult i32 %iv, %size
53   ; CHECK: %rc = and i1 true, true
54   %rc = and i1 %rc1, %rc2
55   br i1 %rc, label %backedge, label %out_of_bounds
58 backedge:
59   %iv.next = add i32 %iv, 1
60   %arr_el_ptr = getelementptr i32, i32* %arr, i32 %iv
61   %el = load i32, i32* %arr_el_ptr
62   %loopcond = icmp ne i32 %iv, %size
63   br i1 %loopcond, label %loop, label %exit
65 exit:
66   ret void
68 out_of_bounds:
69   ret void
72 define void @test_03(i32 *%arr, i32* %a_len_ptr, i32* %size_ptr) {
74 ; CHECK-LABEL: @test_03(
76 entry:
77   %len = load i32, i32* %a_len_ptr, !range !0
78   %size = load i32, i32* %size_ptr
79   %first_iter_check = icmp eq i32 %size, 0
80   br i1 %first_iter_check, label %exit, label %loop
82 loop:
83   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
84   %rc1 = icmp slt i32 %iv, %len
85   %rc2 = icmp slt i32 %iv, %size
86   ; CHECK: %rc = and i1 true, true
87   %rc = and i1 %rc1, %rc2
88   br i1 %rc, label %backedge, label %out_of_bounds
91 backedge:
92   %iv.next = add i32 %iv, 1
93   %arr_el_ptr = getelementptr i32, i32* %arr, i32 %iv
94   %el = load i32, i32* %arr_el_ptr
95   %loopcond = icmp ne i32 %iv, %len
96   br i1 %loopcond, label %loop, label %exit
98 exit:
99   ret void
101 out_of_bounds:
102   ret void
105 define void @test_04(i32 *%arr, i32* %a_len_ptr, i32* %size_ptr) {
107 ; CHECK-LABEL: @test_04(
109 entry:
110   %len = load i32, i32* %a_len_ptr, !range !0
111   %size = load i32, i32* %size_ptr
112   %first_iter_check = icmp eq i32 %size, 0
113   br i1 %first_iter_check, label %exit, label %loop
115 loop:
116   %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]
117   %rc1 = icmp ult i32 %iv, %len
118   %rc2 = icmp ult i32 %iv, %size
119   ; CHECK: %rc = and i1 true, true
120   %rc = and i1 %rc1, %rc2
121   br i1 %rc, label %backedge, label %out_of_bounds
124 backedge:
125   %iv.next = add i32 %iv, 1
126   %arr_el_ptr = getelementptr i32, i32* %arr, i32 %iv
127   %el = load i32, i32* %arr_el_ptr
128   %loopcond = icmp ne i32 %iv, %len
129   br i1 %loopcond, label %loop, label %exit
131 exit:
132   ret void
134 out_of_bounds:
135   ret void
138 !0 = !{i32 0, i32 2147483647}
139 !1 = !{!"branch_weights", i32 64, i32 4}