Skip to content

Commit e69f647

Browse files
committed
Autogen tests for ease of future update
1 parent 2d8ec3c commit e69f647

File tree

4 files changed

+755
-189
lines changed

4 files changed

+755
-189
lines changed

llvm/test/Transforms/IRCE/conjunctive-checks.ll

Lines changed: 141 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,77 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt -S -verify-loop-info -irce < %s | FileCheck %s
23
; RUN: opt -S -verify-loop-info -passes='require<branch-prob>,irce' < %s | FileCheck %s
34

45
define void @f_0(i32 *%arr, i32 *%a_len_ptr, i32 %n, i1* %cond_buf) {
56
; CHECK-LABEL: @f_0(
6-
7-
; CHECK: loop.preheader:
8-
; CHECK: [[len_sub:[^ ]+]] = add nsw i32 %len, -4
9-
; CHECK: [[exit_main_loop_at_hiclamp:[^ ]+]] = call i32 @llvm.smin.i32(i32 %n, i32 [[len_sub]])
10-
; CHECK: [[exit_main_loop_at_loclamp:[^ ]+]] = call i32 @llvm.smax.i32(i32 [[exit_main_loop_at_hiclamp]], i32 0)
11-
; CHECK: [[enter_main_loop:[^ ]+]] = icmp slt i32 0, [[exit_main_loop_at_loclamp]]
12-
; CHECK: br i1 [[enter_main_loop]], label %[[loop_preheader2:[^ ,]+]], label %main.pseudo.exit
13-
14-
; CHECK: [[loop_preheader2]]:
15-
; CHECK: br label %loop
16-
17-
entry:
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[LEN:%.*]] = load i32, i32* [[A_LEN_PTR:%.*]], align 4, !range [[RNG0:![0-9]+]]
9+
; CHECK-NEXT: [[FIRST_ITR_CHECK:%.*]] = icmp sgt i32 [[N:%.*]], 0
10+
; CHECK-NEXT: br i1 [[FIRST_ITR_CHECK]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
11+
; CHECK: loop.preheader:
12+
; CHECK-NEXT: [[TMP0:%.*]] = add nsw i32 [[LEN]], -4
13+
; CHECK-NEXT: [[SMIN:%.*]] = call i32 @llvm.smin.i32(i32 [[N]], i32 [[TMP0]])
14+
; CHECK-NEXT: [[EXIT_MAINLOOP_AT:%.*]] = call i32 @llvm.smax.i32(i32 [[SMIN]], i32 0)
15+
; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 0, [[EXIT_MAINLOOP_AT]]
16+
; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP_PREHEADER1:%.*]], label [[MAIN_PSEUDO_EXIT:%.*]]
17+
; CHECK: loop.preheader1:
18+
; CHECK-NEXT: br label [[LOOP:%.*]]
19+
; CHECK: loop:
20+
; CHECK-NEXT: [[IDX:%.*]] = phi i32 [ [[IDX_NEXT:%.*]], [[IN_BOUNDS:%.*]] ], [ 0, [[LOOP_PREHEADER1]] ]
21+
; CHECK-NEXT: [[IDX_NEXT]] = add i32 [[IDX]], 1
22+
; CHECK-NEXT: [[IDX_FOR_ABC:%.*]] = add i32 [[IDX]], 4
23+
; CHECK-NEXT: [[ABC_ACTUAL:%.*]] = icmp slt i32 [[IDX_FOR_ABC]], [[LEN]]
24+
; CHECK-NEXT: [[COND:%.*]] = load volatile i1, i1* [[COND_BUF:%.*]], align 1
25+
; CHECK-NEXT: [[ABC:%.*]] = and i1 [[COND]], true
26+
; CHECK-NEXT: br i1 [[ABC]], label [[IN_BOUNDS]], label [[OUT_OF_BOUNDS_LOOPEXIT2:%.*]], !prof [[PROF1:![0-9]+]]
27+
; CHECK: in.bounds:
28+
; CHECK-NEXT: [[ADDR:%.*]] = getelementptr i32, i32* [[ARR:%.*]], i32 [[IDX_FOR_ABC]]
29+
; CHECK-NEXT: store i32 0, i32* [[ADDR]], align 4
30+
; CHECK-NEXT: [[NEXT:%.*]] = icmp slt i32 [[IDX_NEXT]], [[N]]
31+
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[IDX_NEXT]], [[EXIT_MAINLOOP_AT]]
32+
; CHECK-NEXT: br i1 [[TMP2]], label [[LOOP]], label [[MAIN_EXIT_SELECTOR:%.*]]
33+
; CHECK: main.exit.selector:
34+
; CHECK-NEXT: [[IDX_NEXT_LCSSA:%.*]] = phi i32 [ [[IDX_NEXT]], [[IN_BOUNDS]] ]
35+
; CHECK-NEXT: [[TMP3:%.*]] = icmp slt i32 [[IDX_NEXT_LCSSA]], [[N]]
36+
; CHECK-NEXT: br i1 [[TMP3]], label [[MAIN_PSEUDO_EXIT]], label [[EXIT_LOOPEXIT:%.*]]
37+
; CHECK: main.pseudo.exit:
38+
; CHECK-NEXT: [[IDX_COPY:%.*]] = phi i32 [ 0, [[LOOP_PREHEADER]] ], [ [[IDX_NEXT_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
39+
; CHECK-NEXT: [[INDVAR_END:%.*]] = phi i32 [ 0, [[LOOP_PREHEADER]] ], [ [[IDX_NEXT_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
40+
; CHECK-NEXT: br label [[POSTLOOP:%.*]]
41+
; CHECK: out.of.bounds.loopexit:
42+
; CHECK-NEXT: br label [[OUT_OF_BOUNDS:%.*]]
43+
; CHECK: out.of.bounds.loopexit2:
44+
; CHECK-NEXT: br label [[OUT_OF_BOUNDS]]
45+
; CHECK: out.of.bounds:
46+
; CHECK-NEXT: ret void
47+
; CHECK: exit.loopexit.loopexit:
48+
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
49+
; CHECK: exit.loopexit:
50+
; CHECK-NEXT: br label [[EXIT]]
51+
; CHECK: exit:
52+
; CHECK-NEXT: ret void
53+
; CHECK: postloop:
54+
; CHECK-NEXT: br label [[LOOP_POSTLOOP:%.*]]
55+
; CHECK: loop.postloop:
56+
; CHECK-NEXT: [[IDX_POSTLOOP:%.*]] = phi i32 [ [[IDX_NEXT_POSTLOOP:%.*]], [[IN_BOUNDS_POSTLOOP:%.*]] ], [ [[IDX_COPY]], [[POSTLOOP]] ]
57+
; CHECK-NEXT: [[IDX_NEXT_POSTLOOP]] = add i32 [[IDX_POSTLOOP]], 1
58+
; CHECK-NEXT: [[IDX_FOR_ABC_POSTLOOP:%.*]] = add i32 [[IDX_POSTLOOP]], 4
59+
; CHECK-NEXT: [[ABC_ACTUAL_POSTLOOP:%.*]] = icmp slt i32 [[IDX_FOR_ABC_POSTLOOP]], [[LEN]]
60+
; CHECK-NEXT: [[COND_POSTLOOP:%.*]] = load volatile i1, i1* [[COND_BUF]], align 1
61+
; CHECK-NEXT: [[ABC_POSTLOOP:%.*]] = and i1 [[COND_POSTLOOP]], [[ABC_ACTUAL_POSTLOOP]]
62+
; CHECK-NEXT: br i1 [[ABC_POSTLOOP]], label [[IN_BOUNDS_POSTLOOP]], label [[OUT_OF_BOUNDS_LOOPEXIT:%.*]], !prof [[PROF1]]
63+
; CHECK: in.bounds.postloop:
64+
; CHECK-NEXT: [[ADDR_POSTLOOP:%.*]] = getelementptr i32, i32* [[ARR]], i32 [[IDX_FOR_ABC_POSTLOOP]]
65+
; CHECK-NEXT: store i32 0, i32* [[ADDR_POSTLOOP]], align 4
66+
; CHECK-NEXT: [[NEXT_POSTLOOP:%.*]] = icmp slt i32 [[IDX_NEXT_POSTLOOP]], [[N]]
67+
; CHECK-NEXT: br i1 [[NEXT_POSTLOOP]], label [[LOOP_POSTLOOP]], label [[EXIT_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP2:![0-9]+]], !irce.loop.clone !7
68+
;
69+
entry:
1870
%len = load i32, i32* %a_len_ptr, !range !0
1971
%first.itr.check = icmp sgt i32 %n, 0
2072
br i1 %first.itr.check, label %loop, label %exit
2173

22-
loop:
74+
loop:
2375
%idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]
2476
%idx.next = add i32 %idx, 1
2577
%idx.for.abc = add i32 %idx, 4
@@ -28,70 +80,115 @@ define void @f_0(i32 *%arr, i32 *%a_len_ptr, i32 %n, i1* %cond_buf) {
2880
%abc = and i1 %cond, %abc.actual
2981
br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
3082

31-
; CHECK: loop:
32-
; CHECK: %cond = load volatile i1, i1* %cond_buf
33-
; CHECK: %abc = and i1 %cond, true
34-
; CHECK: br i1 %abc, label %in.bounds, label %[[loop_exit:[^ ,]+]], !prof !1
35-
36-
; CHECK: [[loop_exit]]:
37-
; CHECK: br label %out.of.bounds
38-
39-
in.bounds:
83+
in.bounds:
4084
%addr = getelementptr i32, i32* %arr, i32 %idx.for.abc
4185
store i32 0, i32* %addr
4286
%next = icmp slt i32 %idx.next, %n
4387
br i1 %next, label %loop, label %exit
4488

45-
out.of.bounds:
89+
out.of.bounds:
4690
ret void
4791

48-
exit:
92+
exit:
4993
ret void
5094
}
5195

5296
define void @f_1(
53-
i32* %arr_a, i32* %a_len_ptr, i32* %arr_b, i32* %b_len_ptr, i32 %n) {
5497
; CHECK-LABEL: @f_1(
55-
56-
; CHECK: loop.preheader:
57-
; CHECK: [[smax_len:[^ ]+]] = call i32 @llvm.smin.i32(i32 %len.b, i32 %len.a)
58-
; CHECK: [[upper_limit_loclamp:[^ ]+]] = call i32 @llvm.smin.i32(i32 [[smax_len]], i32 %n)
59-
; CHECK: [[upper_limit:[^ ]+]] = call i32 @llvm.smax.i32(i32 [[upper_limit_loclamp]], i32 0)
60-
61-
entry:
98+
; CHECK-NEXT: entry:
99+
; CHECK-NEXT: [[LEN_A:%.*]] = load i32, i32* [[A_LEN_PTR:%.*]], align 4, !range [[RNG0]]
100+
; CHECK-NEXT: [[LEN_B:%.*]] = load i32, i32* [[B_LEN_PTR:%.*]], align 4, !range [[RNG0]]
101+
; CHECK-NEXT: [[FIRST_ITR_CHECK:%.*]] = icmp sgt i32 [[N:%.*]], 0
102+
; CHECK-NEXT: br i1 [[FIRST_ITR_CHECK]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
103+
; CHECK: loop.preheader:
104+
; CHECK-NEXT: [[SMIN:%.*]] = call i32 @llvm.smin.i32(i32 [[LEN_B]], i32 [[LEN_A]])
105+
; CHECK-NEXT: [[SMIN1:%.*]] = call i32 @llvm.smin.i32(i32 [[SMIN]], i32 [[N]])
106+
; CHECK-NEXT: [[EXIT_MAINLOOP_AT:%.*]] = call i32 @llvm.smax.i32(i32 [[SMIN1]], i32 0)
107+
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 0, [[EXIT_MAINLOOP_AT]]
108+
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP_PREHEADER2:%.*]], label [[MAIN_PSEUDO_EXIT:%.*]]
109+
; CHECK: loop.preheader2:
110+
; CHECK-NEXT: br label [[LOOP:%.*]]
111+
; CHECK: loop:
112+
; CHECK-NEXT: [[IDX:%.*]] = phi i32 [ [[IDX_NEXT:%.*]], [[IN_BOUNDS:%.*]] ], [ 0, [[LOOP_PREHEADER2]] ]
113+
; CHECK-NEXT: [[IDX_NEXT]] = add i32 [[IDX]], 1
114+
; CHECK-NEXT: [[ABC_A:%.*]] = icmp slt i32 [[IDX]], [[LEN_A]]
115+
; CHECK-NEXT: [[ABC_B:%.*]] = icmp slt i32 [[IDX]], [[LEN_B]]
116+
; CHECK-NEXT: [[ABC:%.*]] = and i1 true, true
117+
; CHECK-NEXT: br i1 [[ABC]], label [[IN_BOUNDS]], label [[OUT_OF_BOUNDS_LOOPEXIT3:%.*]], !prof [[PROF1]]
118+
; CHECK: in.bounds:
119+
; CHECK-NEXT: [[ADDR_A:%.*]] = getelementptr i32, i32* [[ARR_A:%.*]], i32 [[IDX]]
120+
; CHECK-NEXT: store i32 0, i32* [[ADDR_A]], align 4
121+
; CHECK-NEXT: [[ADDR_B:%.*]] = getelementptr i32, i32* [[ARR_B:%.*]], i32 [[IDX]]
122+
; CHECK-NEXT: store i32 -1, i32* [[ADDR_B]], align 4
123+
; CHECK-NEXT: [[NEXT:%.*]] = icmp slt i32 [[IDX_NEXT]], [[N]]
124+
; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[IDX_NEXT]], [[EXIT_MAINLOOP_AT]]
125+
; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP]], label [[MAIN_EXIT_SELECTOR:%.*]]
126+
; CHECK: main.exit.selector:
127+
; CHECK-NEXT: [[IDX_NEXT_LCSSA:%.*]] = phi i32 [ [[IDX_NEXT]], [[IN_BOUNDS]] ]
128+
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[IDX_NEXT_LCSSA]], [[N]]
129+
; CHECK-NEXT: br i1 [[TMP2]], label [[MAIN_PSEUDO_EXIT]], label [[EXIT_LOOPEXIT:%.*]]
130+
; CHECK: main.pseudo.exit:
131+
; CHECK-NEXT: [[IDX_COPY:%.*]] = phi i32 [ 0, [[LOOP_PREHEADER]] ], [ [[IDX_NEXT_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
132+
; CHECK-NEXT: [[INDVAR_END:%.*]] = phi i32 [ 0, [[LOOP_PREHEADER]] ], [ [[IDX_NEXT_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
133+
; CHECK-NEXT: br label [[POSTLOOP:%.*]]
134+
; CHECK: out.of.bounds.loopexit:
135+
; CHECK-NEXT: br label [[OUT_OF_BOUNDS:%.*]]
136+
; CHECK: out.of.bounds.loopexit3:
137+
; CHECK-NEXT: br label [[OUT_OF_BOUNDS]]
138+
; CHECK: out.of.bounds:
139+
; CHECK-NEXT: ret void
140+
; CHECK: exit.loopexit.loopexit:
141+
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
142+
; CHECK: exit.loopexit:
143+
; CHECK-NEXT: br label [[EXIT]]
144+
; CHECK: exit:
145+
; CHECK-NEXT: ret void
146+
; CHECK: postloop:
147+
; CHECK-NEXT: br label [[LOOP_POSTLOOP:%.*]]
148+
; CHECK: loop.postloop:
149+
; CHECK-NEXT: [[IDX_POSTLOOP:%.*]] = phi i32 [ [[IDX_NEXT_POSTLOOP:%.*]], [[IN_BOUNDS_POSTLOOP:%.*]] ], [ [[IDX_COPY]], [[POSTLOOP]] ]
150+
; CHECK-NEXT: [[IDX_NEXT_POSTLOOP]] = add i32 [[IDX_POSTLOOP]], 1
151+
; CHECK-NEXT: [[ABC_A_POSTLOOP:%.*]] = icmp slt i32 [[IDX_POSTLOOP]], [[LEN_A]]
152+
; CHECK-NEXT: [[ABC_B_POSTLOOP:%.*]] = icmp slt i32 [[IDX_POSTLOOP]], [[LEN_B]]
153+
; CHECK-NEXT: [[ABC_POSTLOOP:%.*]] = and i1 [[ABC_A_POSTLOOP]], [[ABC_B_POSTLOOP]]
154+
; CHECK-NEXT: br i1 [[ABC_POSTLOOP]], label [[IN_BOUNDS_POSTLOOP]], label [[OUT_OF_BOUNDS_LOOPEXIT:%.*]], !prof [[PROF1]]
155+
; CHECK: in.bounds.postloop:
156+
; CHECK-NEXT: [[ADDR_A_POSTLOOP:%.*]] = getelementptr i32, i32* [[ARR_A]], i32 [[IDX_POSTLOOP]]
157+
; CHECK-NEXT: store i32 0, i32* [[ADDR_A_POSTLOOP]], align 4
158+
; CHECK-NEXT: [[ADDR_B_POSTLOOP:%.*]] = getelementptr i32, i32* [[ARR_B]], i32 [[IDX_POSTLOOP]]
159+
; CHECK-NEXT: store i32 -1, i32* [[ADDR_B_POSTLOOP]], align 4
160+
; CHECK-NEXT: [[NEXT_POSTLOOP:%.*]] = icmp slt i32 [[IDX_NEXT_POSTLOOP]], [[N]]
161+
; CHECK-NEXT: br i1 [[NEXT_POSTLOOP]], label [[LOOP_POSTLOOP]], label [[EXIT_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP8:![0-9]+]], !irce.loop.clone !7
162+
;
163+
i32* %arr_a, i32* %a_len_ptr, i32* %arr_b, i32* %b_len_ptr, i32 %n) {
164+
165+
166+
entry:
62167
%len.a = load i32, i32* %a_len_ptr, !range !0
63168
%len.b = load i32, i32* %b_len_ptr, !range !0
64169
%first.itr.check = icmp sgt i32 %n, 0
65170
br i1 %first.itr.check, label %loop, label %exit
66171

67-
loop:
172+
loop:
68173
%idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]
69174
%idx.next = add i32 %idx, 1
70175
%abc.a = icmp slt i32 %idx, %len.a
71176
%abc.b = icmp slt i32 %idx, %len.b
72177
%abc = and i1 %abc.a, %abc.b
73178
br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
74179

75-
; CHECK: loop:
76-
; CHECK: %abc = and i1 true, true
77-
; CHECK: br i1 %abc, label %in.bounds, label %[[oob_loopexit:[^ ,]+]], !prof !1
78-
79-
; CHECK: [[oob_loopexit]]:
80-
; CHECK-NEXT: br label %out.of.bounds
81-
82-
83-
in.bounds:
180+
in.bounds:
84181
%addr.a = getelementptr i32, i32* %arr_a, i32 %idx
85182
store i32 0, i32* %addr.a
86183
%addr.b = getelementptr i32, i32* %arr_b, i32 %idx
87184
store i32 -1, i32* %addr.b
88185
%next = icmp slt i32 %idx.next, %n
89186
br i1 %next, label %loop, label %exit
90187

91-
out.of.bounds:
188+
out.of.bounds:
92189
ret void
93190

94-
exit:
191+
exit:
95192
ret void
96193
}
97194

Lines changed: 76 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,108 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt -verify-loop-info -irce -S < %s | FileCheck %s
23
; RUN: opt -verify-loop-info -passes='require<branch-prob>,irce' -S < %s | FileCheck %s
34

45
define void @multiple_access_no_preloop(
5-
i32* %arr_a, i32* %a_len_ptr, i32* %arr_b, i32* %b_len_ptr, i32 %n) {
6+
; CHECK-LABEL: @multiple_access_no_preloop(
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: [[LEN_A:%.*]] = load i32, i32* [[A_LEN_PTR:%.*]], align 4, !range [[RNG0:![0-9]+]]
9+
; CHECK-NEXT: [[LEN_B:%.*]] = load i32, i32* [[B_LEN_PTR:%.*]], align 4, !range [[RNG0]]
10+
; CHECK-NEXT: [[FIRST_ITR_CHECK:%.*]] = icmp sgt i32 [[N:%.*]], 0
11+
; CHECK-NEXT: br i1 [[FIRST_ITR_CHECK]], label [[LOOP_PREHEADER:%.*]], label [[EXIT:%.*]]
12+
; CHECK: loop.preheader:
13+
; CHECK-NEXT: [[SMIN:%.*]] = call i32 @llvm.smin.i32(i32 [[LEN_B]], i32 [[LEN_A]])
14+
; CHECK-NEXT: [[SMIN1:%.*]] = call i32 @llvm.smin.i32(i32 [[SMIN]], i32 [[N]])
15+
; CHECK-NEXT: [[EXIT_MAINLOOP_AT:%.*]] = call i32 @llvm.smax.i32(i32 [[SMIN1]], i32 0)
16+
; CHECK-NEXT: [[TMP0:%.*]] = icmp slt i32 0, [[EXIT_MAINLOOP_AT]]
17+
; CHECK-NEXT: br i1 [[TMP0]], label [[LOOP_PREHEADER2:%.*]], label [[MAIN_PSEUDO_EXIT:%.*]]
18+
; CHECK: loop.preheader2:
19+
; CHECK-NEXT: br label [[LOOP:%.*]]
20+
; CHECK: loop:
21+
; CHECK-NEXT: [[IDX:%.*]] = phi i32 [ [[IDX_NEXT:%.*]], [[IN_BOUNDS_B:%.*]] ], [ 0, [[LOOP_PREHEADER2]] ]
22+
; CHECK-NEXT: [[IDX_NEXT]] = add i32 [[IDX]], 1
23+
; CHECK-NEXT: [[ABC_A:%.*]] = icmp slt i32 [[IDX]], [[LEN_A]]
24+
; CHECK-NEXT: br i1 true, label [[IN_BOUNDS_A:%.*]], label [[OUT_OF_BOUNDS_LOOPEXIT3:%.*]], !prof [[PROF1:![0-9]+]]
25+
; CHECK: in.bounds.a:
26+
; CHECK-NEXT: [[ADDR_A:%.*]] = getelementptr i32, i32* [[ARR_A:%.*]], i32 [[IDX]]
27+
; CHECK-NEXT: store i32 0, i32* [[ADDR_A]], align 4
28+
; CHECK-NEXT: [[ABC_B:%.*]] = icmp slt i32 [[IDX]], [[LEN_B]]
29+
; CHECK-NEXT: br i1 true, label [[IN_BOUNDS_B]], label [[OUT_OF_BOUNDS_LOOPEXIT3]], !prof [[PROF1]]
30+
; CHECK: in.bounds.b:
31+
; CHECK-NEXT: [[ADDR_B:%.*]] = getelementptr i32, i32* [[ARR_B:%.*]], i32 [[IDX]]
32+
; CHECK-NEXT: store i32 -1, i32* [[ADDR_B]], align 4
33+
; CHECK-NEXT: [[NEXT:%.*]] = icmp slt i32 [[IDX_NEXT]], [[N]]
34+
; CHECK-NEXT: [[TMP1:%.*]] = icmp slt i32 [[IDX_NEXT]], [[EXIT_MAINLOOP_AT]]
35+
; CHECK-NEXT: br i1 [[TMP1]], label [[LOOP]], label [[MAIN_EXIT_SELECTOR:%.*]]
36+
; CHECK: main.exit.selector:
37+
; CHECK-NEXT: [[IDX_NEXT_LCSSA:%.*]] = phi i32 [ [[IDX_NEXT]], [[IN_BOUNDS_B]] ]
38+
; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[IDX_NEXT_LCSSA]], [[N]]
39+
; CHECK-NEXT: br i1 [[TMP2]], label [[MAIN_PSEUDO_EXIT]], label [[EXIT_LOOPEXIT:%.*]]
40+
; CHECK: main.pseudo.exit:
41+
; CHECK-NEXT: [[IDX_COPY:%.*]] = phi i32 [ 0, [[LOOP_PREHEADER]] ], [ [[IDX_NEXT_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
42+
; CHECK-NEXT: [[INDVAR_END:%.*]] = phi i32 [ 0, [[LOOP_PREHEADER]] ], [ [[IDX_NEXT_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
43+
; CHECK-NEXT: br label [[POSTLOOP:%.*]]
44+
; CHECK: out.of.bounds.loopexit:
45+
; CHECK-NEXT: br label [[OUT_OF_BOUNDS:%.*]]
46+
; CHECK: out.of.bounds.loopexit3:
47+
; CHECK-NEXT: br label [[OUT_OF_BOUNDS]]
48+
; CHECK: out.of.bounds:
49+
; CHECK-NEXT: ret void
50+
; CHECK: exit.loopexit.loopexit:
51+
; CHECK-NEXT: br label [[EXIT_LOOPEXIT]]
52+
; CHECK: exit.loopexit:
53+
; CHECK-NEXT: br label [[EXIT]]
54+
; CHECK: exit:
55+
; CHECK-NEXT: ret void
56+
; CHECK: postloop:
57+
; CHECK-NEXT: br label [[LOOP_POSTLOOP:%.*]]
58+
; CHECK: loop.postloop:
59+
; CHECK-NEXT: [[IDX_POSTLOOP:%.*]] = phi i32 [ [[IDX_NEXT_POSTLOOP:%.*]], [[IN_BOUNDS_B_POSTLOOP:%.*]] ], [ [[IDX_COPY]], [[POSTLOOP]] ]
60+
; CHECK-NEXT: [[IDX_NEXT_POSTLOOP]] = add i32 [[IDX_POSTLOOP]], 1
61+
; CHECK-NEXT: [[ABC_A_POSTLOOP:%.*]] = icmp slt i32 [[IDX_POSTLOOP]], [[LEN_A]]
62+
; CHECK-NEXT: br i1 [[ABC_A_POSTLOOP]], label [[IN_BOUNDS_A_POSTLOOP:%.*]], label [[OUT_OF_BOUNDS_LOOPEXIT:%.*]], !prof [[PROF1]]
63+
; CHECK: in.bounds.a.postloop:
64+
; CHECK-NEXT: [[ADDR_A_POSTLOOP:%.*]] = getelementptr i32, i32* [[ARR_A]], i32 [[IDX_POSTLOOP]]
65+
; CHECK-NEXT: store i32 0, i32* [[ADDR_A_POSTLOOP]], align 4
66+
; CHECK-NEXT: [[ABC_B_POSTLOOP:%.*]] = icmp slt i32 [[IDX_POSTLOOP]], [[LEN_B]]
67+
; CHECK-NEXT: br i1 [[ABC_B_POSTLOOP]], label [[IN_BOUNDS_B_POSTLOOP]], label [[OUT_OF_BOUNDS_LOOPEXIT]], !prof [[PROF1]]
68+
; CHECK: in.bounds.b.postloop:
69+
; CHECK-NEXT: [[ADDR_B_POSTLOOP:%.*]] = getelementptr i32, i32* [[ARR_B]], i32 [[IDX_POSTLOOP]]
70+
; CHECK-NEXT: store i32 -1, i32* [[ADDR_B_POSTLOOP]], align 4
71+
; CHECK-NEXT: [[NEXT_POSTLOOP:%.*]] = icmp slt i32 [[IDX_NEXT_POSTLOOP]], [[N]]
72+
; CHECK-NEXT: br i1 [[NEXT_POSTLOOP]], label [[LOOP_POSTLOOP]], label [[EXIT_LOOPEXIT_LOOPEXIT:%.*]], !llvm.loop [[LOOP2:![0-9]+]], !irce.loop.clone !7
73+
;
74+
i32* %arr_a, i32* %a_len_ptr, i32* %arr_b, i32* %b_len_ptr, i32 %n) {
675

7-
entry:
76+
entry:
877
%len.a = load i32, i32* %a_len_ptr, !range !0
978
%len.b = load i32, i32* %b_len_ptr, !range !0
1079
%first.itr.check = icmp sgt i32 %n, 0
1180
br i1 %first.itr.check, label %loop, label %exit
1281

13-
loop:
82+
loop:
1483
%idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds.b ]
1584
%idx.next = add i32 %idx, 1
1685
%abc.a = icmp slt i32 %idx, %len.a
1786
br i1 %abc.a, label %in.bounds.a, label %out.of.bounds, !prof !1
1887

19-
in.bounds.a:
88+
in.bounds.a:
2089
%addr.a = getelementptr i32, i32* %arr_a, i32 %idx
2190
store i32 0, i32* %addr.a
2291
%abc.b = icmp slt i32 %idx, %len.b
2392
br i1 %abc.b, label %in.bounds.b, label %out.of.bounds, !prof !1
2493

25-
in.bounds.b:
94+
in.bounds.b:
2695
%addr.b = getelementptr i32, i32* %arr_b, i32 %idx
2796
store i32 -1, i32* %addr.b
2897
%next = icmp slt i32 %idx.next, %n
2998
br i1 %next, label %loop, label %exit
3099

31-
out.of.bounds:
100+
out.of.bounds:
32101
ret void
33102

34-
exit:
103+
exit:
35104
ret void
36105
}
37106

38-
; CHECK-LABEL: @multiple_access_no_preloop(
39-
40-
; CHECK: loop.preheader:
41-
; CHECK: [[smax_len:[^ ]+]] = call i32 @llvm.smin.i32(i32 %len.b, i32 %len.a)
42-
; CHECK: [[upper_limit_loclamp:[^ ]+]] = call i32 @llvm.smin.i32(i32 [[smax_len]], i32 %n)
43-
; CHECK: [[upper_limit:[^ ]+]] = call i32 @llvm.smax.i32(i32 [[upper_limit_loclamp]], i32 0)
44-
45-
; CHECK: loop:
46-
; CHECK: br i1 true, label %in.bounds.a, label %out.of.bounds
47-
48-
; CHECK: in.bounds.a:
49-
; CHECK: br i1 true, label %in.bounds.b, label %out.of.bounds
50-
51-
; CHECK: in.bounds.b:
52-
; CHECK: [[main_loop_cond:[^ ]+]] = icmp slt i32 %idx.next, [[upper_limit]]
53-
; CHECK: br i1 [[main_loop_cond]], label %loop, label %main.exit.selector
54-
55-
; CHECK: in.bounds.b.postloop:
56-
; CHECK: %next.postloop = icmp slt i32 %idx.next.postloop, %n
57-
; CHECK: br i1 %next.postloop, label %loop.postloop, label %exit.loopexit
58-
59107
!0 = !{i32 0, i32 2147483647}
60108
!1 = !{!"branch_weights", i32 128, i32 4}

0 commit comments

Comments
 (0)