blob: 25a8076302312cf1ca1d06a94c0ebea6b1feae7d [file] [log] [blame]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Roman Lebedevbdd65352019-09-03 17:14:56 +00002; RUN: opt -loop-idiom < %s -S | FileCheck %s
Roman Lebedev445c22b2019-04-25 08:33:47 +00003
4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
5
6; This only tests various forms of loop control-flow.
7; These tests are fully identical to bcmp()==0 otherwise.
8
9; #include <algorithm>
10;
11; bool pointer_iteration_const_size_no_overlap(char const* ptr) {
12; return std::equal(ptr, ptr + 8, ptr + 8);
13; }
14; bool pointer_iteration_const_size_partial_overlap(char const* ptr) {
15; return std::equal(ptr, ptr + 16, ptr + 8);
16; }
17; bool pointer_iteration_const_size_overlap_unknown(char const* ptr0, char const* ptr1) {
18; return std::equal(ptr0, ptr0 + 8, ptr1);
19; }
20;
21; bool pointer_iteration_variable_size_no_overlap(char const* ptr, size_t count) {
22; return std::equal(ptr, ptr + count, ptr + count);
23; }
24; bool pointer_iteration_variable_size_partial_overlap(char const* ptr, size_t count) {
25; return std::equal(ptr, ptr + 2 * count, ptr + count);
26; }
27; bool pointer_iteration_variable_size_overlap_unknown(char const* ptr0, char const* ptr1, size_t count) {
28; return std::equal(ptr0, ptr0 + count, ptr1);
29; }
30;
31; bool index_iteration_eq_const_size_no_overlap(char const* ptr) {
32; char const* ptr0 = ptr;
33; char const* ptr1 = ptr + 8;
34; for(size_t i = 0; i < 8; i++) {
35; if(ptr0[i] != ptr1[i])
36; return false;
37; }
38; return true;
39; }
40; bool index_iteration_eq_const_size_partial_overlap(char const* ptr) {
41; char const* ptr0 = ptr;
42; char const* ptr1 = ptr + 8;
43; for(size_t i = 0; i < 16; i++) {
44; if(ptr0[i] != ptr1[i])
45; return false;
46; }
47; return true;
48; }
49; bool index_iteration_eq_const_size_overlap_unknown(char const* ptr0, char const* ptr1) {
50; for(size_t i = 0; i < 8; i++) {
51; if(ptr0[i] != ptr1[i])
52; return false;
53; }
54; return true;
55; }
56;
57; bool index_iteration_eq_variable_size_no_overlap(char const* ptr, size_t count) {
58; char const* ptr0 = ptr;
59; char const* ptr1 = ptr + count;
60; for(size_t i = 0; i < count; i++) {
61; if(ptr0[i] != ptr1[i])
62; return false;
63; }
64; return true;
65; }
66; bool index_iteration_eq_variable_size_partial_overlap(char const* ptr, size_t count) {
67; char const* ptr0 = ptr;
68; char const* ptr1 = ptr + count;
69; for(size_t i = 0; i < 2 * count; i++) {
70; if(ptr0[i] != ptr1[i])
71; return false;
72; }
73; return true;
74; }
75; bool index_iteration_eq_variable_size_overlap_unknown(char const* ptr0, char const* ptr1, size_t count) {
76; for(size_t i = 0; i < count; i++) {
77; if(ptr0[i] != ptr1[i])
78; return false;
79; }
80; return true;
81; }
82;
83; bool index_iteration_starting_from_negative(char const* ptr0, char const* ptr1) {
84; for(int i = -4; i < 4; i++) {
85; if(ptr0[i] != ptr1[i])
86; return false;
87; }
88; return true;
89; }
90;
91; bool combined_iteration_eq_const_size_no_overlap(char const* ptr) {
92; char const* ptr0 = ptr;
93; char const* ptr1 = ptr + 8;
94; for(size_t i = 0; i < 8; i++, ++ptr0, ++ptr1) {
95; if(*ptr0 != *ptr1)
96; return false;
97; }
98; return true;
99; }
100; bool combined_iteration_eq_const_size_partial_overlap(char const* ptr) {
101; char const* ptr0 = ptr;
102; char const* ptr1 = ptr + 8;
103; for(size_t i = 0; i < 16; i++, ++ptr0, ++ptr1) {
104; if(*ptr0 != *ptr1)
105; return false;
106; }
107; return true;
108; }
109; bool combined_iteration_eq_const_size_overlap_unknown(char const* ptr0, char const* ptr1) {
110; for(size_t i = 0; i < 8; i++, ++ptr0, ++ptr1) {
111; if(*ptr0 != *ptr1)
112; return false;
113; }
114; return true;
115; }
116;
117; bool combined_iteration_eq_variable_size_no_overlap(char const* ptr, size_t count) {
118; char const* ptr0 = ptr;
119; char const* ptr1 = ptr + count;
120; for(size_t i = 0; i < count; i++, ++ptr0, ++ptr1) {
121; if(*ptr0 != *ptr1)
122; return false;
123; }
124; return true;
125; }
126; bool combined_iteration_eq_variable_size_partial_overlap(char const* ptr, size_t count) {
127; char const* ptr0 = ptr;
128; char const* ptr1 = ptr + count;
129; for(size_t i = 0; i < 2 * count; i++, ++ptr0, ++ptr1) {
130; if(*ptr0 != *ptr1)
131; return false;
132; }
133; return true;
134; }
135; bool combined_iteration_eq_variable_size_overlap_unknown(char const* ptr0, char const* ptr1, size_t count) {
136; for(size_t i = 0; i < count; i++, ++ptr0, ++ptr1) {
137; if(*ptr0 != *ptr1)
138; return false;
139; }
140; return true;
141; }
142;
143; bool negated_pointer_iteration_variable_size_overlap_unknown(char const* ptr0, char const* ptr1, size_t count) {
144; return !std::equal(ptr0, ptr0 + count, ptr1);
145; }
146;
147; bool integer_pointer_iteration_variable_size_overlap_unknown(int const* ptr0, int const* ptr1, size_t count) {
148; return std::equal(ptr0, ptr0 + count, ptr1);
149; }
150;
151; bool small_index_iteration(char const* ptr0, char const* ptr1, int count) {
152; for(int i = 0; i < count; i++, ++ptr0, ++ptr1) {
153; if(*ptr0 != *ptr1)
154; return false;
155; }
156; return true;
157; }
158;
159; bool three_pointer_iteration(char const* ptr0, char const* ptr0_end, char const* ptr1) {
160; return std::equal(ptr0, ptr0_end, ptr1);
161; }
162;
163; int value_propagation(char const* ptr0, char const* ptr1, size_t count, int on_equal, int on_unequal) {
164; if(std::equal(ptr0, ptr0 + count, ptr1))
165; return on_equal;
166; return on_unequal;
167; }
168;
169; void callee_on_unequal();
170; void callee_on_success();
171; void multiple_exit_blocks(char const* ptr0, char const* ptr1, size_t count) {
172; if(!std::equal(ptr0, ptr0 + count, ptr1)) {
173; callee_on_unequal();
174; return;
175; }
176; callee_on_success();
177; }
178;
179; void multiple_phis(char const* ptr0, char const* ptr1, size_t count, char const* v0, char const* v1, char const* v2, char const* v3, char const** out0, char const** out1) {
180; char const *o0, *o1;
181; if(std::equal(ptr0, ptr0 + count, ptr1)) {
182; o0 = v0;
183; o1 = v1;
184; } else {
185; o0 = v2;
186; o1 = v3;
187; }
188; *out0 = o0;
189; *out1 = o1;
190; }
191;
192; void sink(bool);
193; void loop_within_loop(size_t outer_count, char const** ptr0, char const** ptr1, size_t* count) {
194; for(size_t i = 0; i != outer_count; ++i)
195; sink(std::equal(ptr0[i], ptr0[i] + count[i], ptr1[i]));
196; }
197;
198; void loop_within_loop_with_multiple_exit_blocks(size_t outer_count, char const** ptr0, char const** ptr1, size_t* count) {
199; for(size_t i = 0; i != outer_count; ++i) {
200; if(!std::equal(ptr0[i], ptr0[i] + count[i], ptr1[i])) {
201; callee_on_unequal();
202; return;
203; }
204; callee_on_success();
205; }
206; }
207;
208; void endless_loop_if_equal(int *a, int *b) {
209; for (;;) {
210; for (int c = 0; c < 4; c++) {
211; if (a[c] != b[c])
212; return;
213; }
214; }
215; }
216;
217; bool load_of_bitcasts(char const* ptr0, float const* ptr1, size_t count) {
218; for(size_t i = 0; i < count; i++, ptr0 += sizeof(float), ptr1++) {
219; int v0, v1;
220; memcpy(&v0, ptr0, sizeof(float));
221; memcpy(&v1, ptr1, sizeof(float));
222; if(v0 != v1)
223; return false;
224; }
225; return true;
226; }
227;
228; // FIXME
229; bool overlapping_loads(char const* ptr0, char const* ptr1, size_t count) {
230; for(size_t i = 0; i < count; i++, ptr0++, ptr1++) {
231; int v0, v1;
232; memcpy(&v0, ptr0, sizeof(float));
233; memcpy(&v1, ptr1, sizeof(float));
234; if(v0 != v1)
235; return false;
236; }
237; return true;
238; }
239
240define i1 @_Z39pointer_iteration_const_size_no_overlapPKc(i8* %ptr) {
241; CHECK-LABEL: @_Z39pointer_iteration_const_size_no_overlapPKc(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000242; CHECK-NEXT: entry:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000243; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 8
Roman Lebedevbdd65352019-09-03 17:14:56 +0000244; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
245; CHECK: for.body.i.i:
246; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[ADD_PTR]], [[ENTRY:%.*]] ]
247; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_IDX:%.*]] = phi i64 [ [[__FIRST1_ADDR_06_I_I_ADD:%.*]], [[FOR_INC_I_I]] ], [ 0, [[ENTRY]] ]
248; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[__FIRST1_ADDR_06_I_I_IDX]]
249; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I_PTR]]
250; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
251; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[V0]], [[V1]]
252; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]]
253; CHECK: for.inc.i.i:
254; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_ADD]] = add nuw nsw i64 [[__FIRST1_ADDR_06_I_I_IDX]], 1
255; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
256; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i64 [[__FIRST1_ADDR_06_I_I_ADD]], 8
257; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000258; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000259; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000260; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
261;
262entry:
263 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
264 br label %for.body.i.i
265
266for.body.i.i: ; preds = %for.inc.i.i, %entry
267 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %add.ptr, %entry ]
268 %__first1.addr.06.i.i.idx = phi i64 [ %__first1.addr.06.i.i.add, %for.inc.i.i ], [ 0, %entry ]
269 %__first1.addr.06.i.i.ptr = getelementptr inbounds i8, i8* %ptr, i64 %__first1.addr.06.i.i.idx
270 %v0 = load i8, i8* %__first1.addr.06.i.i.ptr
271 %v1 = load i8, i8* %__first2.addr.07.i.i
272 %cmp.i.i.i = icmp eq i8 %v0, %v1
273 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
274
275for.inc.i.i: ; preds = %for.body.i.i
276 %__first1.addr.06.i.i.add = add nuw nsw i64 %__first1.addr.06.i.i.idx, 1
277 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
278 %cmp.i.i = icmp eq i64 %__first1.addr.06.i.i.add, 8
279 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
280
281_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i
282 %retval.0.i.i = phi i1 [ false, %for.body.i.i ], [ true, %for.inc.i.i ]
283 ret i1 %retval.0.i.i
284}
285
286define i1 @_Z44pointer_iteration_const_size_partial_overlapPKc(i8* %ptr) {
287; CHECK-LABEL: @_Z44pointer_iteration_const_size_partial_overlapPKc(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000288; CHECK-NEXT: entry:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000289; CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 8
Roman Lebedevbdd65352019-09-03 17:14:56 +0000290; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
291; CHECK: for.body.i.i:
292; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[ADD_PTR1]], [[ENTRY:%.*]] ]
293; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_IDX:%.*]] = phi i64 [ [[__FIRST1_ADDR_06_I_I_ADD:%.*]], [[FOR_INC_I_I]] ], [ 0, [[ENTRY]] ]
294; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[__FIRST1_ADDR_06_I_I_IDX]]
295; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I_PTR]]
296; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
297; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[V0]], [[V1]]
298; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]]
299; CHECK: for.inc.i.i:
300; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_ADD]] = add nuw nsw i64 [[__FIRST1_ADDR_06_I_I_IDX]], 1
301; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
302; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i64 [[__FIRST1_ADDR_06_I_I_ADD]], 16
303; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000304; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000305; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000306; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
307;
308entry:
309 %add.ptr1 = getelementptr inbounds i8, i8* %ptr, i64 8
310 br label %for.body.i.i
311
312for.body.i.i: ; preds = %for.inc.i.i, %entry
313 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %add.ptr1, %entry ]
314 %__first1.addr.06.i.i.idx = phi i64 [ %__first1.addr.06.i.i.add, %for.inc.i.i ], [ 0, %entry ]
315 %__first1.addr.06.i.i.ptr = getelementptr inbounds i8, i8* %ptr, i64 %__first1.addr.06.i.i.idx
316 %v0 = load i8, i8* %__first1.addr.06.i.i.ptr
317 %v1 = load i8, i8* %__first2.addr.07.i.i
318 %cmp.i.i.i = icmp eq i8 %v0, %v1
319 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
320
321for.inc.i.i: ; preds = %for.body.i.i
322 %__first1.addr.06.i.i.add = add nuw nsw i64 %__first1.addr.06.i.i.idx, 1
323 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
324 %cmp.i.i = icmp eq i64 %__first1.addr.06.i.i.add, 16
325 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
326
327_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i
328 %retval.0.i.i = phi i1 [ false, %for.body.i.i ], [ true, %for.inc.i.i ]
329 ret i1 %retval.0.i.i
330}
331
332define i1 @_Z44pointer_iteration_const_size_overlap_unknownPKcS0_(i8* %ptr0, i8* %ptr1) {
333; CHECK-LABEL: @_Z44pointer_iteration_const_size_overlap_unknownPKcS0_(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000334; CHECK-NEXT: entry:
335; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
336; CHECK: for.body.i.i:
337; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[ENTRY:%.*]] ]
338; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_IDX:%.*]] = phi i64 [ [[__FIRST1_ADDR_06_I_I_ADD:%.*]], [[FOR_INC_I_I]] ], [ 0, [[ENTRY]] ]
339; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[__FIRST1_ADDR_06_I_I_IDX]]
340; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I_PTR]]
341; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
342; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[V0]], [[V1]]
343; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]]
344; CHECK: for.inc.i.i:
345; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I_ADD]] = add nuw nsw i64 [[__FIRST1_ADDR_06_I_I_IDX]], 1
346; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
347; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i64 [[__FIRST1_ADDR_06_I_I_ADD]], 8
348; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000349; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000350; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000351; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
352;
353entry:
354 br label %for.body.i.i
355
356for.body.i.i: ; preds = %for.inc.i.i, %entry
357 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
358 %__first1.addr.06.i.i.idx = phi i64 [ %__first1.addr.06.i.i.add, %for.inc.i.i ], [ 0, %entry ]
359 %__first1.addr.06.i.i.ptr = getelementptr inbounds i8, i8* %ptr0, i64 %__first1.addr.06.i.i.idx
360 %v0 = load i8, i8* %__first1.addr.06.i.i.ptr
361 %v1 = load i8, i8* %__first2.addr.07.i.i
362 %cmp.i.i.i = icmp eq i8 %v0, %v1
363 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
364
365for.inc.i.i: ; preds = %for.body.i.i
366 %__first1.addr.06.i.i.add = add nuw nsw i64 %__first1.addr.06.i.i.idx, 1
367 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
368 %cmp.i.i = icmp eq i64 %__first1.addr.06.i.i.add, 8
369 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
370
371_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i
372 %retval.0.i.i = phi i1 [ false, %for.body.i.i ], [ true, %for.inc.i.i ]
373 ret i1 %retval.0.i.i
374}
375
376define i1 @_Z42pointer_iteration_variable_size_no_overlapPKcm(i8* %ptr, i64 %count) {
377; CHECK-LABEL: @_Z42pointer_iteration_variable_size_no_overlapPKcm(
378; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000379; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 [[COUNT:%.*]]
380; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
381; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
382; CHECK: for.body.i.i.preheader:
383; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
384; CHECK: for.body.i.i:
385; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[ADD_PTR]], [[FOR_BODY_I_I_PREHEADER]] ]
386; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR]], [[FOR_BODY_I_I_PREHEADER]] ]
387; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
388; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
389; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[V0]], [[V1]]
390; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
391; CHECK: for.inc.i.i:
392; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
393; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
394; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
395; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000396; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000397; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000398; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
399; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
400; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
401; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
402;
403entry:
404 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %count
405 %cmp5.i.i = icmp eq i64 %count, 0
406 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
407
408for.body.i.i: ; preds = %entry, %for.inc.i.i
409 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %add.ptr, %entry ]
410 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr, %entry ]
411 %v0 = load i8, i8* %__first1.addr.06.i.i
412 %v1 = load i8, i8* %__first2.addr.07.i.i
413 %cmp.i.i.i = icmp eq i8 %v0, %v1
414 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
415
416for.inc.i.i: ; preds = %for.body.i.i
417 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
418 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
419 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
420 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
421
422_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %entry
423 %retval.0.i.i = phi i1 [ true, %entry ], [ true, %for.inc.i.i ], [ false, %for.body.i.i ]
424 ret i1 %retval.0.i.i
425}
426
427define i1 @_Z47pointer_iteration_variable_size_partial_overlapPKcm(i8* %ptr, i64 %count) {
428; CHECK-LABEL: @_Z47pointer_iteration_variable_size_partial_overlapPKcm(
429; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000430; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[COUNT:%.*]], 1
431; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 [[MUL]]
432; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[MUL]], 0
433; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
434; CHECK: for.body.i.i.preheader:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000435; CHECK-NEXT: [[ADD_PTR1:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[COUNT]]
Roman Lebedevbdd65352019-09-03 17:14:56 +0000436; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
437; CHECK: for.body.i.i:
438; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[ADD_PTR1]], [[FOR_BODY_I_I_PREHEADER]] ]
439; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR]], [[FOR_BODY_I_I_PREHEADER]] ]
440; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
441; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
442; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[V0]], [[V1]]
443; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
444; CHECK: for.inc.i.i:
445; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
446; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
447; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
448; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000449; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000450; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000451; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
452; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
453; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
454; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
455;
456entry:
457 %mul = shl i64 %count, 1
458 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %mul
459 %cmp5.i.i = icmp eq i64 %mul, 0
460 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i.preheader
461
462for.body.i.i.preheader: ; preds = %entry
463 %add.ptr1 = getelementptr inbounds i8, i8* %ptr, i64 %count
464 br label %for.body.i.i
465
466for.body.i.i: ; preds = %for.body.i.i.preheader, %for.inc.i.i
467 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %add.ptr1, %for.body.i.i.preheader ]
468 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr, %for.body.i.i.preheader ]
469 %v0 = load i8, i8* %__first1.addr.06.i.i
470 %v1 = load i8, i8* %__first2.addr.07.i.i
471 %cmp.i.i.i = icmp eq i8 %v0, %v1
472 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
473
474for.inc.i.i: ; preds = %for.body.i.i
475 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
476 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
477 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
478 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
479
480_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %entry
481 %retval.0.i.i = phi i1 [ true, %entry ], [ true, %for.inc.i.i ], [ false, %for.body.i.i ]
482 ret i1 %retval.0.i.i
483}
484
485define i1 @_Z47pointer_iteration_variable_size_overlap_unknownPKcS0_m(i8* %ptr0, i8* %ptr1, i64 %count) {
486; CHECK-LABEL: @_Z47pointer_iteration_variable_size_overlap_unknownPKcS0_m(
487; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000488; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[COUNT:%.*]]
489; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
490; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
491; CHECK: for.body.i.i.preheader:
492; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
493; CHECK: for.body.i.i:
494; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
495; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
496; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
497; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
498; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[V0]], [[V1]]
499; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
500; CHECK: for.inc.i.i:
501; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
502; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
503; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
504; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000505; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000506; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000507; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
508; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
509; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
510; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
511;
512entry:
513 %add.ptr = getelementptr inbounds i8, i8* %ptr0, i64 %count
514 %cmp5.i.i = icmp eq i64 %count, 0
515 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
516
517for.body.i.i: ; preds = %entry, %for.inc.i.i
518 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
519 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
520 %v0 = load i8, i8* %__first1.addr.06.i.i
521 %v1 = load i8, i8* %__first2.addr.07.i.i
522 %cmp.i.i.i = icmp eq i8 %v0, %v1
523 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
524
525for.inc.i.i: ; preds = %for.body.i.i
526 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
527 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
528 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
529 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
530
531_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %entry
532 %retval.0.i.i = phi i1 [ true, %entry ], [ true, %for.inc.i.i ], [ false, %for.body.i.i ]
533 ret i1 %retval.0.i.i
534}
535
536define i1 @_Z40index_iteration_eq_const_size_no_overlapPKc(i8* %ptr) {
537; CHECK-LABEL: @_Z40index_iteration_eq_const_size_no_overlapPKc(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000538; CHECK-NEXT: entry:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000539; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 8
Roman Lebedevbdd65352019-09-03 17:14:56 +0000540; CHECK-NEXT: br label [[FOR_BODY:%.*]]
541; CHECK: for.cond:
542; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC:%.*]], 8
543; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
544; CHECK: for.body:
545; CHECK-NEXT: [[I_013:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC]], [[FOR_COND:%.*]] ]
546; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[I_013]]
547; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
548; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[ADD_PTR]], i64 [[I_013]]
549; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX1]]
550; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[V0]], [[V1]]
551; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_013]], 1
552; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000553; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000554; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000555; CHECK-NEXT: ret i1 [[RES]]
556;
557entry:
558 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
559 br label %for.body
560
561for.cond: ; preds = %for.body
562 %cmp = icmp ult i64 %inc, 8
563 br i1 %cmp, label %for.body, label %cleanup
564
565for.body: ; preds = %entry, %for.cond
566 %i.013 = phi i64 [ 0, %entry ], [ %inc, %for.cond ]
567 %arrayidx = getelementptr inbounds i8, i8* %ptr, i64 %i.013
568 %v0 = load i8, i8* %arrayidx
569 %arrayidx1 = getelementptr inbounds i8, i8* %add.ptr, i64 %i.013
570 %v1 = load i8, i8* %arrayidx1
571 %cmp3 = icmp eq i8 %v0, %v1
572 %inc = add nuw nsw i64 %i.013, 1
573 br i1 %cmp3, label %for.cond, label %cleanup
574
575cleanup: ; preds = %for.cond, %for.body
576 %res = phi i1 [ false, %for.body ], [ true, %for.cond ]
577 ret i1 %res
578}
579
580define i1 @_Z45index_iteration_eq_const_size_partial_overlapPKc(i8* %ptr) {
581; CHECK-LABEL: @_Z45index_iteration_eq_const_size_partial_overlapPKc(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000582; CHECK-NEXT: entry:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000583; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 8
Roman Lebedevbdd65352019-09-03 17:14:56 +0000584; CHECK-NEXT: br label [[FOR_BODY:%.*]]
585; CHECK: for.cond:
586; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC:%.*]], 16
587; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
588; CHECK: for.body:
589; CHECK-NEXT: [[I_013:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC]], [[FOR_COND:%.*]] ]
590; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[I_013]]
591; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
592; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[ADD_PTR]], i64 [[I_013]]
593; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX1]]
594; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[V0]], [[V1]]
595; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_013]], 1
596; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000597; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000598; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000599; CHECK-NEXT: ret i1 [[RES]]
600;
601entry:
602 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
603 br label %for.body
604
605for.cond: ; preds = %for.body
606 %cmp = icmp ult i64 %inc, 16
607 br i1 %cmp, label %for.body, label %cleanup
608
609for.body: ; preds = %entry, %for.cond
610 %i.013 = phi i64 [ 0, %entry ], [ %inc, %for.cond ]
611 %arrayidx = getelementptr inbounds i8, i8* %ptr, i64 %i.013
612 %v0 = load i8, i8* %arrayidx
613 %arrayidx1 = getelementptr inbounds i8, i8* %add.ptr, i64 %i.013
614 %v1 = load i8, i8* %arrayidx1
615 %cmp3 = icmp eq i8 %v0, %v1
616 %inc = add nuw nsw i64 %i.013, 1
617 br i1 %cmp3, label %for.cond, label %cleanup
618
619cleanup: ; preds = %for.cond, %for.body
620 %res = phi i1 [ false, %for.body ], [ true, %for.cond ]
621 ret i1 %res
622}
623
624define i1 @_Z45index_iteration_eq_const_size_overlap_unknownPKcS0_(i8* %ptr0, i8* %ptr1) {
625; CHECK-LABEL: @_Z45index_iteration_eq_const_size_overlap_unknownPKcS0_(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000626; CHECK-NEXT: entry:
627; CHECK-NEXT: br label [[FOR_BODY:%.*]]
628; CHECK: for.cond:
629; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC:%.*]], 8
630; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
631; CHECK: for.body:
632; CHECK-NEXT: [[I_08:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC]], [[FOR_COND:%.*]] ]
633; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[I_08]]
634; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
635; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[PTR1:%.*]], i64 [[I_08]]
636; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX1]]
637; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[V0]], [[V1]]
638; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_08]], 1
639; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000640; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000641; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000642; CHECK-NEXT: ret i1 [[RES]]
643;
644entry:
645 br label %for.body
646
647for.cond: ; preds = %for.body
648 %cmp = icmp ult i64 %inc, 8
649 br i1 %cmp, label %for.body, label %cleanup
650
651for.body: ; preds = %entry, %for.cond
652 %i.08 = phi i64 [ 0, %entry ], [ %inc, %for.cond ]
653 %arrayidx = getelementptr inbounds i8, i8* %ptr0, i64 %i.08
654 %v0 = load i8, i8* %arrayidx
655 %arrayidx1 = getelementptr inbounds i8, i8* %ptr1, i64 %i.08
656 %v1 = load i8, i8* %arrayidx1
657 %cmp3 = icmp eq i8 %v0, %v1
658 %inc = add nuw nsw i64 %i.08, 1
659 br i1 %cmp3, label %for.cond, label %cleanup
660
661cleanup: ; preds = %for.cond, %for.body
662 %res = phi i1 [ false, %for.body ], [ true, %for.cond ]
663 ret i1 %res
664}
665
666define i1 @_Z43index_iteration_eq_variable_size_no_overlapPKcm(i8* %ptr, i64 %count) {
667; CHECK-LABEL: @_Z43index_iteration_eq_variable_size_no_overlapPKcm(
668; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000669; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 [[COUNT:%.*]]
670; CHECK-NEXT: [[CMP14:%.*]] = icmp eq i64 [[COUNT]], 0
671; CHECK-NEXT: br i1 [[CMP14]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
672; CHECK: for.body.preheader:
673; CHECK-NEXT: br label [[FOR_BODY:%.*]]
674; CHECK: for.cond:
675; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC:%.*]], [[COUNT]]
676; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
677; CHECK: for.body:
678; CHECK-NEXT: [[I_015:%.*]] = phi i64 [ [[INC]], [[FOR_COND:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
679; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[I_015]]
680; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
681; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[ADD_PTR]], i64 [[I_015]]
682; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX1]]
683; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[V0]], [[V1]]
684; CHECK-NEXT: [[INC]] = add nuw i64 [[I_015]], 1
685; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000686; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000687; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000688; CHECK-NEXT: br label [[CLEANUP]]
689; CHECK: cleanup:
690; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP_LOOPEXIT]] ]
691; CHECK-NEXT: ret i1 [[RES]]
692;
693entry:
694 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %count
695 %cmp14 = icmp eq i64 %count, 0
696 br i1 %cmp14, label %cleanup, label %for.body
697
698for.cond: ; preds = %for.body
699 %cmp = icmp ult i64 %inc, %count
700 br i1 %cmp, label %for.body, label %cleanup
701
702for.body: ; preds = %entry, %for.cond
703 %i.015 = phi i64 [ %inc, %for.cond ], [ 0, %entry ]
704 %arrayidx = getelementptr inbounds i8, i8* %ptr, i64 %i.015
705 %v0 = load i8, i8* %arrayidx
706 %arrayidx1 = getelementptr inbounds i8, i8* %add.ptr, i64 %i.015
707 %v1 = load i8, i8* %arrayidx1
708 %cmp3 = icmp eq i8 %v0, %v1
709 %inc = add nuw i64 %i.015, 1
710 br i1 %cmp3, label %for.cond, label %cleanup
711
712cleanup: ; preds = %for.body, %for.cond, %entry
713 %res = phi i1 [ true, %entry ], [ true, %for.cond ], [ false, %for.body ]
714 ret i1 %res
715}
716
717define i1 @_Z48index_iteration_eq_variable_size_partial_overlapPKcm(i8* %ptr, i64 %count) {
718; CHECK-LABEL: @_Z48index_iteration_eq_variable_size_partial_overlapPKcm(
719; CHECK-NEXT: entry:
720; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 [[COUNT:%.*]]
Roman Lebedevbdd65352019-09-03 17:14:56 +0000721; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[COUNT]], 1
722; CHECK-NEXT: [[CMP14:%.*]] = icmp eq i64 [[MUL]], 0
723; CHECK-NEXT: br i1 [[CMP14]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
724; CHECK: for.body.preheader:
725; CHECK-NEXT: br label [[FOR_BODY:%.*]]
726; CHECK: for.cond:
727; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC:%.*]], [[MUL]]
728; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
729; CHECK: for.body:
730; CHECK-NEXT: [[I_015:%.*]] = phi i64 [ [[INC]], [[FOR_COND:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
731; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR]], i64 [[I_015]]
732; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
733; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[ADD_PTR]], i64 [[I_015]]
734; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX1]]
735; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[V0]], [[V1]]
736; CHECK-NEXT: [[INC]] = add nuw i64 [[I_015]], 1
737; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000738; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000739; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000740; CHECK-NEXT: br label [[CLEANUP]]
741; CHECK: cleanup:
742; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP_LOOPEXIT]] ]
743; CHECK-NEXT: ret i1 [[RES]]
744;
745entry:
746 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %count
747 %mul = shl i64 %count, 1
748 %cmp14 = icmp eq i64 %mul, 0
749 br i1 %cmp14, label %cleanup, label %for.body
750
751for.cond: ; preds = %for.body
752 %cmp = icmp ult i64 %inc, %mul
753 br i1 %cmp, label %for.body, label %cleanup
754
755for.body: ; preds = %entry, %for.cond
756 %i.015 = phi i64 [ %inc, %for.cond ], [ 0, %entry ]
757 %arrayidx = getelementptr inbounds i8, i8* %ptr, i64 %i.015
758 %v0 = load i8, i8* %arrayidx
759 %arrayidx1 = getelementptr inbounds i8, i8* %add.ptr, i64 %i.015
760 %v1 = load i8, i8* %arrayidx1
761 %cmp3 = icmp eq i8 %v0, %v1
762 %inc = add nuw i64 %i.015, 1
763 br i1 %cmp3, label %for.cond, label %cleanup
764
765cleanup: ; preds = %for.body, %for.cond, %entry
766 %res = phi i1 [ true, %entry ], [ true, %for.cond ], [ false, %for.body ]
767 ret i1 %res
768}
769
770define i1 @_Z48index_iteration_eq_variable_size_overlap_unknownPKcS0_m(i8* %ptr0, i8* %ptr1, i64 %count) {
771; CHECK-LABEL: @_Z48index_iteration_eq_variable_size_overlap_unknownPKcS0_m(
772; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000773; CHECK-NEXT: [[CMP8:%.*]] = icmp eq i64 [[COUNT:%.*]], 0
774; CHECK-NEXT: br i1 [[CMP8]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
775; CHECK: for.body.preheader:
776; CHECK-NEXT: br label [[FOR_BODY:%.*]]
777; CHECK: for.cond:
778; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC:%.*]], [[COUNT]]
779; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT:%.*]]
780; CHECK: for.body:
781; CHECK-NEXT: [[I_09:%.*]] = phi i64 [ [[INC]], [[FOR_COND:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
782; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[I_09]]
783; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
784; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, i8* [[PTR1:%.*]], i64 [[I_09]]
785; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX1]]
786; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[V0]], [[V1]]
787; CHECK-NEXT: [[INC]] = add nuw i64 [[I_09]], 1
788; CHECK-NEXT: br i1 [[CMP3]], label [[FOR_COND]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000789; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000790; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000791; CHECK-NEXT: br label [[CLEANUP]]
792; CHECK: cleanup:
793; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP_LOOPEXIT]] ]
794; CHECK-NEXT: ret i1 [[RES]]
795;
796entry:
797 %cmp8 = icmp eq i64 %count, 0
798 br i1 %cmp8, label %cleanup, label %for.body
799
800for.cond: ; preds = %for.body
801 %cmp = icmp ult i64 %inc, %count
802 br i1 %cmp, label %for.body, label %cleanup
803
804for.body: ; preds = %entry, %for.cond
805 %i.09 = phi i64 [ %inc, %for.cond ], [ 0, %entry ]
806 %arrayidx = getelementptr inbounds i8, i8* %ptr0, i64 %i.09
807 %v0 = load i8, i8* %arrayidx
808 %arrayidx1 = getelementptr inbounds i8, i8* %ptr1, i64 %i.09
809 %v1 = load i8, i8* %arrayidx1
810 %cmp3 = icmp eq i8 %v0, %v1
811 %inc = add nuw i64 %i.09, 1
812 br i1 %cmp3, label %for.cond, label %cleanup
813
814cleanup: ; preds = %for.body, %for.cond, %entry
815 %res = phi i1 [ true, %entry ], [ true, %for.cond ], [ false, %for.body ]
816 ret i1 %res
817}
818
819define i1 @_Z38index_iteration_starting_from_negativePKcS0_(i8* %ptr0, i8* %ptr1) {
820; CHECK-LABEL: @_Z38index_iteration_starting_from_negativePKcS0_(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000821; CHECK-NEXT: entry:
822; CHECK-NEXT: br label [[FOR_BODY:%.*]]
823; CHECK: for.cond:
824; CHECK-NEXT: [[CMP:%.*]] = icmp slt i64 [[INDVARS_IV_NEXT:%.*]], 4
825; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP:%.*]]
826; CHECK: for.body:
827; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ -4, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT]], [[FOR_COND:%.*]] ]
828; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[INDVARS_IV]]
829; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[ARRAYIDX]]
830; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, i8* [[PTR1:%.*]], i64 [[INDVARS_IV]]
831; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[ARRAYIDX2]]
832; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i8 [[V0]], [[V1]]
833; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
834; CHECK-NEXT: br i1 [[CMP4]], label [[FOR_COND]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000835; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000836; CHECK-NEXT: [[RET:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_COND]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000837; CHECK-NEXT: ret i1 [[RET]]
838;
839entry:
840 br label %for.body
841
842for.cond: ; preds = %for.body
843 %cmp = icmp slt i64 %indvars.iv.next, 4
844 br i1 %cmp, label %for.body, label %cleanup
845
846for.body: ; preds = %entry, %for.cond
847 %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.cond ]
848 %arrayidx = getelementptr inbounds i8, i8* %ptr0, i64 %indvars.iv
849 %v0 = load i8, i8* %arrayidx
850 %arrayidx2 = getelementptr inbounds i8, i8* %ptr1, i64 %indvars.iv
851 %v1 = load i8, i8* %arrayidx2
852 %cmp4 = icmp eq i8 %v0, %v1
853 %indvars.iv.next = add nsw i64 %indvars.iv, 1
854 br i1 %cmp4, label %for.cond, label %cleanup
855
856cleanup: ; preds = %for.cond, %for.body
857 %ret = phi i1 [ false, %for.body ], [ true, %for.cond ]
858 ret i1 %ret
859}
860
861define i1 @_Z43combined_iteration_eq_const_size_no_overlapPKc(i8* %ptr) {
862; CHECK-LABEL: @_Z43combined_iteration_eq_const_size_no_overlapPKc(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000863; CHECK-NEXT: entry:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000864; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 8
Roman Lebedevbdd65352019-09-03 17:14:56 +0000865; CHECK-NEXT: br label [[FOR_BODY:%.*]]
866; CHECK: for.body:
867; CHECK-NEXT: [[I_015:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]
868; CHECK-NEXT: [[PTR1_014:%.*]] = phi i8* [ [[ADD_PTR]], [[ENTRY]] ], [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ]
869; CHECK-NEXT: [[PTR0_013:%.*]] = phi i8* [ [[PTR]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ]
870; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[PTR0_013]]
871; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[PTR1_014]]
872; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[V0]], [[V1]]
873; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP:%.*]]
874; CHECK: for.inc:
875; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_015]], 1
876; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_013]], i64 1
877; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_014]], i64 1
878; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], 8
879; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000880; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000881; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000882; CHECK-NEXT: ret i1 [[RES]]
883;
884entry:
885 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
886 br label %for.body
887
888for.body: ; preds = %entry, %for.inc
889 %i.015 = phi i64 [ 0, %entry ], [ %inc, %for.inc ]
890 %ptr1.014 = phi i8* [ %add.ptr, %entry ], [ %incdec.ptr3, %for.inc ]
891 %ptr0.013 = phi i8* [ %ptr, %entry ], [ %incdec.ptr, %for.inc ]
892 %v0 = load i8, i8* %ptr0.013
893 %v1 = load i8, i8* %ptr1.014
894 %cmp2 = icmp eq i8 %v0, %v1
895 br i1 %cmp2, label %for.inc, label %cleanup
896
897for.inc: ; preds = %for.body
898 %inc = add nuw nsw i64 %i.015, 1
899 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.013, i64 1
900 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.014, i64 1
901 %cmp = icmp ult i64 %inc, 8
902 br i1 %cmp, label %for.body, label %cleanup
903
904cleanup: ; preds = %for.inc, %for.body
905 %res = phi i1 [ false, %for.body ], [ true, %for.inc ]
906 ret i1 %res
907}
908
909define i1 @_Z48combined_iteration_eq_const_size_partial_overlapPKc(i8* %ptr) {
910; CHECK-LABEL: @_Z48combined_iteration_eq_const_size_partial_overlapPKc(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000911; CHECK-NEXT: entry:
Roman Lebedev445c22b2019-04-25 08:33:47 +0000912; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 8
Roman Lebedevbdd65352019-09-03 17:14:56 +0000913; CHECK-NEXT: br label [[FOR_BODY:%.*]]
914; CHECK: for.body:
915; CHECK-NEXT: [[I_015:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]
916; CHECK-NEXT: [[PTR1_014:%.*]] = phi i8* [ [[ADD_PTR]], [[ENTRY]] ], [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ]
917; CHECK-NEXT: [[PTR0_013:%.*]] = phi i8* [ [[PTR]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ]
918; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[PTR0_013]]
919; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[PTR1_014]]
920; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[V0]], [[V1]]
921; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP:%.*]]
922; CHECK: for.inc:
923; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_015]], 1
924; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_013]], i64 1
925; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_014]], i64 1
926; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], 16
927; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000928; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000929; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000930; CHECK-NEXT: ret i1 [[RES]]
931;
932entry:
933 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 8
934 br label %for.body
935
936for.body: ; preds = %entry, %for.inc
937 %i.015 = phi i64 [ 0, %entry ], [ %inc, %for.inc ]
938 %ptr1.014 = phi i8* [ %add.ptr, %entry ], [ %incdec.ptr3, %for.inc ]
939 %ptr0.013 = phi i8* [ %ptr, %entry ], [ %incdec.ptr, %for.inc ]
940 %v0 = load i8, i8* %ptr0.013
941 %v1 = load i8, i8* %ptr1.014
942 %cmp2 = icmp eq i8 %v0, %v1
943 br i1 %cmp2, label %for.inc, label %cleanup
944
945for.inc: ; preds = %for.body
946 %inc = add nuw nsw i64 %i.015, 1
947 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.013, i64 1
948 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.014, i64 1
949 %cmp = icmp ult i64 %inc, 16
950 br i1 %cmp, label %for.body, label %cleanup
951
952cleanup: ; preds = %for.inc, %for.body
953 %res = phi i1 [ false, %for.body ], [ true, %for.inc ]
954 ret i1 %res
955}
956
957define i1 @_Z48combined_iteration_eq_const_size_overlap_unknownPKcS0_(i8* %ptr0, i8* %ptr1) {
958; CHECK-LABEL: @_Z48combined_iteration_eq_const_size_overlap_unknownPKcS0_(
Roman Lebedevbdd65352019-09-03 17:14:56 +0000959; CHECK-NEXT: entry:
960; CHECK-NEXT: br label [[FOR_BODY:%.*]]
961; CHECK: for.body:
962; CHECK-NEXT: [[I_010:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]
963; CHECK-NEXT: [[PTR1_ADDR_09:%.*]] = phi i8* [ [[PTR1:%.*]], [[ENTRY]] ], [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ]
964; CHECK-NEXT: [[PTR0_ADDR_08:%.*]] = phi i8* [ [[PTR0:%.*]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ]
965; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[PTR0_ADDR_08]]
966; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[PTR1_ADDR_09]]
967; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[V0]], [[V1]]
968; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP:%.*]]
969; CHECK: for.inc:
970; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_010]], 1
971; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_ADDR_08]], i64 1
972; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_ADDR_09]], i64 1
973; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], 8
974; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP]]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000975; CHECK: cleanup:
Roman Lebedevbdd65352019-09-03 17:14:56 +0000976; CHECK-NEXT: [[RES:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +0000977; CHECK-NEXT: ret i1 [[RES]]
978;
979entry:
980 br label %for.body
981
982for.body: ; preds = %entry, %for.inc
983 %i.010 = phi i64 [ 0, %entry ], [ %inc, %for.inc ]
984 %ptr1.addr.09 = phi i8* [ %ptr1, %entry ], [ %incdec.ptr3, %for.inc ]
985 %ptr0.addr.08 = phi i8* [ %ptr0, %entry ], [ %incdec.ptr, %for.inc ]
986 %v0 = load i8, i8* %ptr0.addr.08
987 %v1 = load i8, i8* %ptr1.addr.09
988 %cmp2 = icmp eq i8 %v0, %v1
989 br i1 %cmp2, label %for.inc, label %cleanup
990
991for.inc: ; preds = %for.body
992 %inc = add nuw nsw i64 %i.010, 1
993 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.addr.08, i64 1
994 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.addr.09, i64 1
995 %cmp = icmp ult i64 %inc, 8
996 br i1 %cmp, label %for.body, label %cleanup
997
998cleanup: ; preds = %for.inc, %for.body
999 %res = phi i1 [ false, %for.body ], [ true, %for.inc ]
1000 ret i1 %res
1001}
1002
1003define i1 @_Z46combined_iteration_eq_variable_size_no_overlapPKcm(i8* %ptr, i64 %count) {
1004; CHECK-LABEL: @_Z46combined_iteration_eq_variable_size_no_overlapPKcm(
1005; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001006; CHECK-NEXT: [[CMP14:%.*]] = icmp eq i64 [[COUNT:%.*]], 0
1007; CHECK-NEXT: br i1 [[CMP14]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1008; CHECK: for.body.preheader:
1009; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 [[COUNT]]
1010; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1011; CHECK: for.body:
1012; CHECK-NEXT: [[I_017:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1013; CHECK-NEXT: [[PTR1_016:%.*]] = phi i8* [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ], [ [[ADD_PTR]], [[FOR_BODY_PREHEADER]] ]
1014; CHECK-NEXT: [[PTR0_015:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ], [ [[PTR]], [[FOR_BODY_PREHEADER]] ]
1015; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[PTR0_015]]
1016; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[PTR1_016]]
1017; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[V0]], [[V1]]
1018; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP_LOOPEXIT:%.*]]
1019; CHECK: for.inc:
1020; CHECK-NEXT: [[INC]] = add nuw i64 [[I_017]], 1
1021; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_015]], i64 1
1022; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_016]], i64 1
1023; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], [[COUNT]]
1024; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001025; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001026; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001027; CHECK-NEXT: br label [[CLEANUP]]
1028; CHECK: cleanup:
1029; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP_LOOPEXIT]] ]
1030; CHECK-NEXT: ret i1 [[RES]]
1031;
1032entry:
1033 %cmp14 = icmp eq i64 %count, 0
1034 br i1 %cmp14, label %cleanup, label %for.body.preheader
1035
1036for.body.preheader: ; preds = %entry
1037 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %count
1038 br label %for.body
1039
1040for.body: ; preds = %for.body.preheader, %for.inc
1041 %i.017 = phi i64 [ %inc, %for.inc ], [ 0, %for.body.preheader ]
1042 %ptr1.016 = phi i8* [ %incdec.ptr3, %for.inc ], [ %add.ptr, %for.body.preheader ]
1043 %ptr0.015 = phi i8* [ %incdec.ptr, %for.inc ], [ %ptr, %for.body.preheader ]
1044 %v0 = load i8, i8* %ptr0.015
1045 %v1 = load i8, i8* %ptr1.016
1046 %cmp2 = icmp eq i8 %v0, %v1
1047 br i1 %cmp2, label %for.inc, label %cleanup
1048
1049for.inc: ; preds = %for.body
1050 %inc = add nuw i64 %i.017, 1
1051 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.015, i64 1
1052 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.016, i64 1
1053 %cmp = icmp ult i64 %inc, %count
1054 br i1 %cmp, label %for.body, label %cleanup
1055
1056cleanup: ; preds = %for.body, %for.inc, %entry
1057 %res = phi i1 [ true, %entry ], [ true, %for.inc ], [ false, %for.body ]
1058 ret i1 %res
1059}
1060
1061define i1 @_Z51combined_iteration_eq_variable_size_partial_overlapPKcm(i8* %ptr, i64 %count) {
1062; CHECK-LABEL: @_Z51combined_iteration_eq_variable_size_partial_overlapPKcm(
1063; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001064; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[COUNT:%.*]], 1
1065; CHECK-NEXT: [[CMP14:%.*]] = icmp eq i64 [[MUL]], 0
1066; CHECK-NEXT: br i1 [[CMP14]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1067; CHECK: for.body.preheader:
Roman Lebedev445c22b2019-04-25 08:33:47 +00001068; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR:%.*]], i64 [[COUNT]]
Roman Lebedevbdd65352019-09-03 17:14:56 +00001069; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1070; CHECK: for.body:
1071; CHECK-NEXT: [[I_017:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1072; CHECK-NEXT: [[PTR1_016:%.*]] = phi i8* [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ], [ [[ADD_PTR]], [[FOR_BODY_PREHEADER]] ]
1073; CHECK-NEXT: [[PTR0_015:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ], [ [[PTR]], [[FOR_BODY_PREHEADER]] ]
1074; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[PTR0_015]]
1075; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[PTR1_016]]
1076; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[V0]], [[V1]]
1077; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP_LOOPEXIT:%.*]]
1078; CHECK: for.inc:
1079; CHECK-NEXT: [[INC]] = add nuw i64 [[I_017]], 1
1080; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_015]], i64 1
1081; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_016]], i64 1
1082; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], [[MUL]]
1083; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001084; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001085; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001086; CHECK-NEXT: br label [[CLEANUP]]
1087; CHECK: cleanup:
1088; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP_LOOPEXIT]] ]
1089; CHECK-NEXT: ret i1 [[RES]]
1090;
1091entry:
1092 %mul = shl i64 %count, 1
1093 %cmp14 = icmp eq i64 %mul, 0
1094 br i1 %cmp14, label %cleanup, label %for.body.preheader
1095
1096for.body.preheader: ; preds = %entry
1097 %add.ptr = getelementptr inbounds i8, i8* %ptr, i64 %count
1098 br label %for.body
1099
1100for.body: ; preds = %for.body.preheader, %for.inc
1101 %i.017 = phi i64 [ %inc, %for.inc ], [ 0, %for.body.preheader ]
1102 %ptr1.016 = phi i8* [ %incdec.ptr3, %for.inc ], [ %add.ptr, %for.body.preheader ]
1103 %ptr0.015 = phi i8* [ %incdec.ptr, %for.inc ], [ %ptr, %for.body.preheader ]
1104 %v0 = load i8, i8* %ptr0.015
1105 %v1 = load i8, i8* %ptr1.016
1106 %cmp2 = icmp eq i8 %v0, %v1
1107 br i1 %cmp2, label %for.inc, label %cleanup
1108
1109for.inc: ; preds = %for.body
1110 %inc = add nuw i64 %i.017, 1
1111 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.015, i64 1
1112 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.016, i64 1
1113 %cmp = icmp ult i64 %inc, %mul
1114 br i1 %cmp, label %for.body, label %cleanup
1115
1116cleanup: ; preds = %for.body, %for.inc, %entry
1117 %res = phi i1 [ true, %entry ], [ true, %for.inc ], [ false, %for.body ]
1118 ret i1 %res
1119}
1120
1121define i1 @_Z51combined_iteration_eq_variable_size_overlap_unknownPKcS0_m(i8* %ptr0, i8* %ptr1, i64 %count) {
1122; CHECK-LABEL: @_Z51combined_iteration_eq_variable_size_overlap_unknownPKcS0_m(
1123; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001124; CHECK-NEXT: [[CMP8:%.*]] = icmp eq i64 [[COUNT:%.*]], 0
1125; CHECK-NEXT: br i1 [[CMP8]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1126; CHECK: for.body.preheader:
1127; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1128; CHECK: for.body:
1129; CHECK-NEXT: [[I_011:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1130; CHECK-NEXT: [[PTR1_ADDR_010:%.*]] = phi i8* [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ], [ [[PTR1:%.*]], [[FOR_BODY_PREHEADER]] ]
1131; CHECK-NEXT: [[PTR0_ADDR_09:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ], [ [[PTR0:%.*]], [[FOR_BODY_PREHEADER]] ]
1132; CHECK-NEXT: [[V0:%.*]] = load i8, i8* [[PTR0_ADDR_09]]
1133; CHECK-NEXT: [[V1:%.*]] = load i8, i8* [[PTR1_ADDR_010]]
1134; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[V0]], [[V1]]
1135; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP_LOOPEXIT:%.*]]
1136; CHECK: for.inc:
1137; CHECK-NEXT: [[INC]] = add nuw i64 [[I_011]], 1
1138; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_ADDR_09]], i64 1
1139; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_ADDR_010]], i64 1
1140; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], [[COUNT]]
1141; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001142; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001143; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001144; CHECK-NEXT: br label [[CLEANUP]]
1145; CHECK: cleanup:
1146; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP_LOOPEXIT]] ]
1147; CHECK-NEXT: ret i1 [[RES]]
1148;
1149entry:
1150 %cmp8 = icmp eq i64 %count, 0
1151 br i1 %cmp8, label %cleanup, label %for.body
1152
1153for.body: ; preds = %entry, %for.inc
1154 %i.011 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
1155 %ptr1.addr.010 = phi i8* [ %incdec.ptr3, %for.inc ], [ %ptr1, %entry ]
1156 %ptr0.addr.09 = phi i8* [ %incdec.ptr, %for.inc ], [ %ptr0, %entry ]
1157 %v0 = load i8, i8* %ptr0.addr.09
1158 %v1 = load i8, i8* %ptr1.addr.010
1159 %cmp2 = icmp eq i8 %v0, %v1
1160 br i1 %cmp2, label %for.inc, label %cleanup
1161
1162for.inc: ; preds = %for.body
1163 %inc = add nuw i64 %i.011, 1
1164 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.addr.09, i64 1
1165 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.addr.010, i64 1
1166 %cmp = icmp ult i64 %inc, %count
1167 br i1 %cmp, label %for.body, label %cleanup
1168
1169cleanup: ; preds = %for.body, %for.inc, %entry
1170 %res = phi i1 [ true, %entry ], [ true, %for.inc ], [ false, %for.body ]
1171 ret i1 %res
1172}
1173
1174define i1 @_Z55negated_pointer_iteration_variable_size_overlap_unknownPKcS0_m(i8* %ptr0, i8* %ptr1, i64 %count) {
1175; CHECK-LABEL: @_Z55negated_pointer_iteration_variable_size_overlap_unknownPKcS0_m(
1176; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001177; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[COUNT:%.*]]
1178; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
1179; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1180; CHECK: for.body.i.i.preheader:
1181; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1182; CHECK: for.body.i.i:
1183; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
1184; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
1185; CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1186; CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1187; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T0]], [[T1]]
1188; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
1189; CHECK: for.inc.i.i:
1190; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1191; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1192; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1193; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001194; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001195; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ true, [[FOR_BODY_I_I]] ], [ false, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001196; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
1197; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
1198; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ false, [[ENTRY:%.*]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1199; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
1200;
1201entry:
1202 %add.ptr = getelementptr inbounds i8, i8* %ptr0, i64 %count
1203 %cmp5.i.i = icmp eq i64 %count, 0
1204 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1205
1206for.body.i.i: ; preds = %entry, %for.inc.i.i
1207 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
1208 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
1209 %t0 = load i8, i8* %__first1.addr.06.i.i
1210 %t1 = load i8, i8* %__first2.addr.07.i.i
1211 %cmp.i.i.i = icmp eq i8 %t0, %t1
1212 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
1213
1214for.inc.i.i: ; preds = %for.body.i.i
1215 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1216 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1217 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
1218 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1219
1220_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %entry
1221 %retval.0.i.i = phi i1 [ false, %entry ], [ false, %for.inc.i.i ], [ true, %for.body.i.i ]
1222 ret i1 %retval.0.i.i
1223}
1224
1225define i1 @_Z55integer_pointer_iteration_variable_size_overlap_unknownPKiS0_m(i32* %ptr0, i32* %ptr1, i64 %count) {
1226; CHECK-LABEL: @_Z55integer_pointer_iteration_variable_size_overlap_unknownPKiS0_m(
1227; CHECK-NEXT: entry:
1228; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i32, i32* [[PTR0:%.*]], i64 [[COUNT:%.*]]
1229; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
Roman Lebedevbdd65352019-09-03 17:14:56 +00001230; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKIS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1231; CHECK: for.body.i.i.preheader:
1232; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1233; CHECK: for.body.i.i:
1234; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i32* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
1235; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i32* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
1236; CHECK-NEXT: [[T0:%.*]] = load i32, i32* [[__FIRST1_ADDR_06_I_I]]
1237; CHECK-NEXT: [[T1:%.*]] = load i32, i32* [[__FIRST2_ADDR_07_I_I]]
1238; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i32 [[T0]], [[T1]]
1239; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKIS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
1240; CHECK: for.inc.i.i:
1241; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i32, i32* [[__FIRST1_ADDR_06_I_I]], i64 1
1242; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i32, i32* [[__FIRST2_ADDR_07_I_I]], i64 1
1243; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i32* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1244; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKIS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001245; CHECK: _ZNSt3__15equalIPKiS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001246; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001247; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKIS2_EEBT_S3_T0__EXIT]]
1248; CHECK: _ZNSt3__15equalIPKiS2_EEbT_S3_T0_.exit:
1249; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKIS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1250; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
1251;
1252entry:
1253 %add.ptr = getelementptr inbounds i32, i32* %ptr0, i64 %count
1254 %cmp5.i.i = icmp eq i64 %count, 0
1255 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKiS2_EEbT_S3_T0_.exit, label %for.body.i.i
1256
1257for.body.i.i: ; preds = %entry, %for.inc.i.i
1258 %__first2.addr.07.i.i = phi i32* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
1259 %__first1.addr.06.i.i = phi i32* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
1260 %t0 = load i32, i32* %__first1.addr.06.i.i
1261 %t1 = load i32, i32* %__first2.addr.07.i.i
1262 %cmp.i.i.i = icmp eq i32 %t0, %t1
1263 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKiS2_EEbT_S3_T0_.exit
1264
1265for.inc.i.i: ; preds = %for.body.i.i
1266 %incdec.ptr.i.i = getelementptr inbounds i32, i32* %__first1.addr.06.i.i, i64 1
1267 %incdec.ptr1.i.i = getelementptr inbounds i32, i32* %__first2.addr.07.i.i, i64 1
1268 %cmp.i.i = icmp eq i32* %incdec.ptr.i.i, %add.ptr
1269 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKiS2_EEbT_S3_T0_.exit, label %for.body.i.i
1270
1271_ZNSt3__15equalIPKiS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %entry
1272 %retval.0.i.i = phi i1 [ true, %entry ], [ true, %for.inc.i.i ], [ false, %for.body.i.i ]
1273 ret i1 %retval.0.i.i
1274}
1275
1276define i1 @_Z21small_index_iterationPKcS0_i(i8* %ptr0, i8* %ptr1, i32 %count) {
1277; CHECK-LABEL: @_Z21small_index_iterationPKcS0_i(
1278; CHECK-NEXT: entry:
1279; CHECK-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[COUNT:%.*]], 0
Roman Lebedevbdd65352019-09-03 17:14:56 +00001280; CHECK-NEXT: br i1 [[CMP8]], label [[FOR_BODY_PREHEADER:%.*]], label [[CLEANUP:%.*]]
1281; CHECK: for.body.preheader:
1282; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1283; CHECK: for.body:
1284; CHECK-NEXT: [[I_011:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_INC:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1285; CHECK-NEXT: [[PTR1_ADDR_010:%.*]] = phi i8* [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ], [ [[PTR1:%.*]], [[FOR_BODY_PREHEADER]] ]
1286; CHECK-NEXT: [[PTR0_ADDR_09:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ], [ [[PTR0:%.*]], [[FOR_BODY_PREHEADER]] ]
1287; CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[PTR0_ADDR_09]]
1288; CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[PTR1_ADDR_010]]
1289; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[T0]], [[T1]]
1290; CHECK-NEXT: br i1 [[CMP2]], label [[FOR_INC]], label [[CLEANUP_LOOPEXIT:%.*]]
1291; CHECK: for.inc:
1292; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_011]], 1
1293; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_ADDR_09]], i64 1
1294; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_ADDR_010]], i64 1
1295; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], [[COUNT]]
1296; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001297; CHECK: cleanup.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001298; CHECK-NEXT: [[T2_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001299; CHECK-NEXT: br label [[CLEANUP]]
1300; CHECK: cleanup:
1301; CHECK-NEXT: [[T2:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[T2_PH]], [[CLEANUP_LOOPEXIT]] ]
1302; CHECK-NEXT: ret i1 [[T2]]
1303;
1304entry:
1305 %cmp8 = icmp sgt i32 %count, 0
1306 br i1 %cmp8, label %for.body, label %cleanup
1307
1308for.body: ; preds = %entry, %for.inc
1309 %i.011 = phi i32 [ %inc, %for.inc ], [ 0, %entry ]
1310 %ptr1.addr.010 = phi i8* [ %incdec.ptr3, %for.inc ], [ %ptr1, %entry ]
1311 %ptr0.addr.09 = phi i8* [ %incdec.ptr, %for.inc ], [ %ptr0, %entry ]
1312 %t0 = load i8, i8* %ptr0.addr.09
1313 %t1 = load i8, i8* %ptr1.addr.010
1314 %cmp2 = icmp eq i8 %t0, %t1
1315 br i1 %cmp2, label %for.inc, label %cleanup
1316
1317for.inc: ; preds = %for.body
1318 %inc = add nuw nsw i32 %i.011, 1
1319 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.addr.09, i64 1
1320 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.addr.010, i64 1
1321 %cmp = icmp slt i32 %inc, %count
1322 br i1 %cmp, label %for.body, label %cleanup
1323
1324cleanup: ; preds = %for.body, %for.inc, %entry
1325 %t2 = phi i1 [ true, %entry ], [ true, %for.inc ], [ false, %for.body ]
1326 ret i1 %t2
1327}
1328
1329define i1 @_Z23three_pointer_iterationPKcS0_S0_(i8* %ptr0, i8* %ptr0_end, i8* %ptr1) {
1330; CHECK-LABEL: @_Z23three_pointer_iterationPKcS0_S0_(
1331; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001332; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i8* [[PTR0:%.*]], [[PTR0_END:%.*]]
1333; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1334; CHECK: for.body.i.i.preheader:
1335; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1336; CHECK: for.body.i.i:
1337; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
1338; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
1339; CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1340; CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1341; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T0]], [[T1]]
1342; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
1343; CHECK: for.inc.i.i:
1344; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1345; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1346; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[PTR0_END]]
1347; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001348; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001349; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001350; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
1351; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
1352; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1353; CHECK-NEXT: ret i1 [[RETVAL_0_I_I]]
1354;
1355entry:
1356 %cmp5.i.i = icmp eq i8* %ptr0, %ptr0_end
1357 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1358
1359for.body.i.i: ; preds = %entry, %for.inc.i.i
1360 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
1361 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
1362 %t0 = load i8, i8* %__first1.addr.06.i.i
1363 %t1 = load i8, i8* %__first2.addr.07.i.i
1364 %cmp.i.i.i = icmp eq i8 %t0, %t1
1365 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
1366
1367for.inc.i.i: ; preds = %for.body.i.i
1368 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1369 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1370 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %ptr0_end
1371 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1372
1373_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %entry
1374 %retval.0.i.i = phi i1 [ true, %entry ], [ true, %for.inc.i.i ], [ false, %for.body.i.i ]
1375 ret i1 %retval.0.i.i
1376}
1377
1378define i32 @_Z17value_propagationPKcS0_mii(i8* %ptr0, i8* %ptr1, i64 %count, i32 %on_equal, i32 %on_unequal) {
1379; CHECK-LABEL: @_Z17value_propagationPKcS0_mii(
1380; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001381; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[COUNT:%.*]]
1382; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
1383; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1384; CHECK: for.body.i.i.preheader:
1385; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1386; CHECK: for.body.i.i:
1387; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
1388; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
1389; CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1390; CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1391; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T0]], [[T1]]
1392; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
1393; CHECK: for.inc.i.i:
1394; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1395; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1396; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1397; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001398; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001399; CHECK-NEXT: [[T2_PH:%.*]] = phi i32 [ [[ON_UNEQUAL:%.*]], [[FOR_BODY_I_I]] ], [ [[ON_EQUAL:%.*]], [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001400; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
1401; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
1402; CHECK-NEXT: [[T2:%.*]] = phi i32 [ [[ON_EQUAL]], [[ENTRY:%.*]] ], [ [[T2_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1403; CHECK-NEXT: ret i32 [[T2]]
1404;
1405entry:
1406 %add.ptr = getelementptr inbounds i8, i8* %ptr0, i64 %count
1407 %cmp5.i.i = icmp eq i64 %count, 0
1408 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1409
1410for.body.i.i: ; preds = %entry, %for.inc.i.i
1411 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
1412 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
1413 %t0 = load i8, i8* %__first1.addr.06.i.i
1414 %t1 = load i8, i8* %__first2.addr.07.i.i
1415 %cmp.i.i.i = icmp eq i8 %t0, %t1
1416 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
1417
1418for.inc.i.i: ; preds = %for.body.i.i
1419 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1420 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1421 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
1422 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1423
1424_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.inc.i.i, %for.body.i.i, %entry
1425 %t2 = phi i32 [ %on_equal, %entry ], [ %on_equal, %for.inc.i.i ], [ %on_unequal, %for.body.i.i ]
1426 ret i32 %t2
1427}
1428
1429define void @_Z20multiple_exit_blocksPKcS0_m(i8* %ptr0, i8* %ptr1, i64 %count) {
1430; CHECK-LABEL: @_Z20multiple_exit_blocksPKcS0_m(
1431; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001432; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[COUNT:%.*]]
1433; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
1434; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[IF_END:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1435; CHECK: for.body.i.i.preheader:
1436; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1437; CHECK: for.body.i.i:
1438; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
1439; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
1440; CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1441; CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1442; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T0]], [[T1]]
1443; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[IF_THEN:%.*]]
1444; CHECK: for.inc.i.i:
1445; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1446; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1447; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1448; CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_END_LOOPEXIT:%.*]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001449; CHECK: if.then:
1450; CHECK-NEXT: tail call void @_Z17callee_on_unequalv()
1451; CHECK-NEXT: br label [[RETURN:%.*]]
1452; CHECK: if.end.loopexit:
1453; CHECK-NEXT: br label [[IF_END]]
1454; CHECK: if.end:
1455; CHECK-NEXT: tail call void @_Z17callee_on_successv()
1456; CHECK-NEXT: br label [[RETURN]]
1457; CHECK: return:
1458; CHECK-NEXT: ret void
1459;
1460entry:
1461 %add.ptr = getelementptr inbounds i8, i8* %ptr0, i64 %count
1462 %cmp5.i.i = icmp eq i64 %count, 0
1463 br i1 %cmp5.i.i, label %if.end, label %for.body.i.i
1464
1465for.body.i.i: ; preds = %entry, %for.inc.i.i
1466 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
1467 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
1468 %t0 = load i8, i8* %__first1.addr.06.i.i
1469 %t1 = load i8, i8* %__first2.addr.07.i.i
1470 %cmp.i.i.i = icmp eq i8 %t0, %t1
1471 br i1 %cmp.i.i.i, label %for.inc.i.i, label %if.then
1472
1473for.inc.i.i: ; preds = %for.body.i.i
1474 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1475 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1476 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
1477 br i1 %cmp.i.i, label %if.end, label %for.body.i.i
1478
1479if.then: ; preds = %for.body.i.i
1480 tail call void @_Z17callee_on_unequalv()
1481 br label %return
1482
1483if.end: ; preds = %for.inc.i.i, %entry
1484 tail call void @_Z17callee_on_successv()
1485 br label %return
1486
1487return: ; preds = %if.end, %if.then
1488 ret void
1489}
1490declare void @_Z17callee_on_unequalv()
1491declare void @_Z17callee_on_successv()
1492
1493define void @_Z13multiple_phisPKcS0_mS0_S0_S0_S0_PS0_S1_(i8* %ptr0, i8* %ptr1, i64 %count, i8* %v0, i8* %v1, i8* %v2, i8* %v3, i8** %out0, i8** %out1) {
1494; CHECK-LABEL: @_Z13multiple_phisPKcS0_mS0_S0_S0_S0_PS0_S1_(
1495; CHECK-NEXT: entry:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001496; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[PTR0:%.*]], i64 [[COUNT:%.*]]
1497; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[COUNT]], 0
1498; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1499; CHECK: for.body.i.i.preheader:
1500; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1501; CHECK: for.body.i.i:
1502; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[PTR1:%.*]], [[FOR_BODY_I_I_PREHEADER]] ]
1503; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[PTR0]], [[FOR_BODY_I_I_PREHEADER]] ]
1504; CHECK-NEXT: [[T0:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1505; CHECK-NEXT: [[T1:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1506; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T0]], [[T1]]
1507; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
1508; CHECK: for.inc.i.i:
1509; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1510; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1511; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1512; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001513; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001514; CHECK-NEXT: [[T2_PH:%.*]] = phi i8* [ [[V2:%.*]], [[FOR_BODY_I_I]] ], [ [[V0:%.*]], [[FOR_INC_I_I]] ]
1515; CHECK-NEXT: [[T3_PH:%.*]] = phi i8* [ [[V3:%.*]], [[FOR_BODY_I_I]] ], [ [[V1:%.*]], [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001516; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
1517; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
1518; CHECK-NEXT: [[T2:%.*]] = phi i8* [ [[V0]], [[ENTRY:%.*]] ], [ [[T2_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1519; CHECK-NEXT: [[T3:%.*]] = phi i8* [ [[V1]], [[ENTRY]] ], [ [[T3_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1520; CHECK-NEXT: store i8* [[T2]], i8** [[OUT0:%.*]]
1521; CHECK-NEXT: store i8* [[T3]], i8** [[OUT1:%.*]]
1522; CHECK-NEXT: ret void
1523;
1524entry:
1525 %add.ptr = getelementptr inbounds i8, i8* %ptr0, i64 %count
1526 %cmp5.i.i = icmp eq i64 %count, 0
1527 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1528
1529for.body.i.i: ; preds = %entry, %for.inc.i.i
1530 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %ptr1, %entry ]
1531 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %ptr0, %entry ]
1532 %t0 = load i8, i8* %__first1.addr.06.i.i
1533 %t1 = load i8, i8* %__first2.addr.07.i.i
1534 %cmp.i.i.i = icmp eq i8 %t0, %t1
1535 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
1536
1537for.inc.i.i: ; preds = %for.body.i.i
1538 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1539 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1540 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
1541 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1542
1543_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.inc.i.i, %for.body.i.i, %entry
1544 %t2 = phi i8* [ %v0, %entry ], [ %v0, %for.inc.i.i ], [ %v2, %for.body.i.i ]
1545 %t3 = phi i8* [ %v1, %entry ], [ %v1, %for.inc.i.i ], [ %v3, %for.body.i.i ]
1546 store i8* %t2, i8** %out0
1547 store i8* %t3, i8** %out1
1548 ret void
1549}
1550
1551define void @_Z16loop_within_loopmPPKcS1_Pm(i64 %outer_count, i8** %ptr0, i8** %ptr1, i64* %count) {
1552; CHECK-LABEL: @_Z16loop_within_loopmPPKcS1_Pm(
1553; CHECK-NEXT: entry:
1554; CHECK-NEXT: [[CMP11:%.*]] = icmp eq i64 [[OUTER_COUNT:%.*]], 0
1555; CHECK-NEXT: br i1 [[CMP11]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1556; CHECK: for.body.preheader:
1557; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1558; CHECK: for.cond.cleanup.loopexit:
1559; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
1560; CHECK: for.cond.cleanup:
1561; CHECK-NEXT: ret void
1562; CHECK: for.body:
1563; CHECK-NEXT: [[I_012:%.*]] = phi i64 [ [[INC:%.*]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1564; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[PTR0:%.*]], i64 [[I_012]]
1565; CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[ARRAYIDX]]
1566; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i64, i64* [[COUNT:%.*]], i64 [[I_012]]
Roman Lebedevbdd65352019-09-03 17:14:56 +00001567; CHECK-NEXT: [[T1:%.*]] = load i64, i64* [[ARRAYIDX2]]
1568; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[T1]]
1569; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[T1]], 0
Roman Lebedev445c22b2019-04-25 08:33:47 +00001570; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1571; CHECK: for.body.i.i.preheader:
1572; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8*, i8** [[PTR1:%.*]], i64 [[I_012]]
1573; CHECK-NEXT: [[T2:%.*]] = load i8*, i8** [[ARRAYIDX3]]
Roman Lebedevbdd65352019-09-03 17:14:56 +00001574; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1575; CHECK: for.body.i.i:
1576; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[T2]], [[FOR_BODY_I_I_PREHEADER]] ]
1577; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[T0]], [[FOR_BODY_I_I_PREHEADER]] ]
1578; CHECK-NEXT: [[T3:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1579; CHECK-NEXT: [[T4:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1580; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T3]], [[T4]]
1581; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT:%.*]]
1582; CHECK: for.inc.i.i:
1583; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1584; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1585; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1586; CHECK-NEXT: br i1 [[CMP_I_I]], label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001587; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001588; CHECK-NEXT: [[RETVAL_0_I_I_PH:%.*]] = phi i1 [ false, [[FOR_BODY_I_I]] ], [ true, [[FOR_INC_I_I]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001589; CHECK-NEXT: br label [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT]]
1590; CHECK: _ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit:
1591; CHECK-NEXT: [[RETVAL_0_I_I:%.*]] = phi i1 [ true, [[FOR_BODY]] ], [ [[RETVAL_0_I_I_PH]], [[_ZNST3__15EQUALIPKCS2_EEBT_S3_T0__EXIT_LOOPEXIT]] ]
1592; CHECK-NEXT: tail call void @_Z4sinkb(i1 [[RETVAL_0_I_I]])
1593; CHECK-NEXT: [[INC]] = add nuw i64 [[I_012]], 1
1594; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[INC]], [[OUTER_COUNT]]
1595; CHECK-NEXT: br i1 [[CMP]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]]
1596;
1597entry:
1598 %cmp11 = icmp eq i64 %outer_count, 0
1599 br i1 %cmp11, label %for.cond.cleanup, label %for.body
1600
1601for.cond.cleanup: ; preds = %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, %entry
1602 ret void
1603
1604for.body: ; preds = %entry, %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
1605 %i.012 = phi i64 [ %inc, %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit ], [ 0, %entry ]
1606 %arrayidx = getelementptr inbounds i8*, i8** %ptr0, i64 %i.012
1607 %t0 = load i8*, i8** %arrayidx
1608 %arrayidx2 = getelementptr inbounds i64, i64* %count, i64 %i.012
1609 %t1 = load i64, i64* %arrayidx2
1610 %add.ptr = getelementptr inbounds i8, i8* %t0, i64 %t1
1611 %cmp5.i.i = icmp eq i64 %t1, 0
1612 br i1 %cmp5.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i.preheader
1613
1614for.body.i.i.preheader: ; preds = %for.body
1615 %arrayidx3 = getelementptr inbounds i8*, i8** %ptr1, i64 %i.012
1616 %t2 = load i8*, i8** %arrayidx3
1617 br label %for.body.i.i
1618
1619for.body.i.i: ; preds = %for.body.i.i.preheader, %for.inc.i.i
1620 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %t2, %for.body.i.i.preheader ]
1621 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %t0, %for.body.i.i.preheader ]
1622 %t3 = load i8, i8* %__first1.addr.06.i.i
1623 %t4 = load i8, i8* %__first2.addr.07.i.i
1624 %cmp.i.i.i = icmp eq i8 %t3, %t4
1625 br i1 %cmp.i.i.i, label %for.inc.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit
1626
1627for.inc.i.i: ; preds = %for.body.i.i
1628 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1629 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1630 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
1631 br i1 %cmp.i.i, label %_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit, label %for.body.i.i
1632
1633_ZNSt3__15equalIPKcS2_EEbT_S3_T0_.exit: ; preds = %for.body.i.i, %for.inc.i.i, %for.body
1634 %retval.0.i.i = phi i1 [ true, %for.body ], [ true, %for.inc.i.i ], [ false, %for.body.i.i ]
1635 tail call void @_Z4sinkb(i1 %retval.0.i.i)
1636 %inc = add nuw i64 %i.012, 1
1637 %cmp = icmp eq i64 %inc, %outer_count
1638 br i1 %cmp, label %for.cond.cleanup, label %for.body
1639}
1640declare void @_Z4sinkb(i1)
1641
1642define void @_Z42loop_within_loop_with_multiple_exit_blocksmPPKcS1_Pm(i64 %outer_count, i8** %ptr0, i8** %ptr1, i64* %count) {
1643; CHECK-LABEL: @_Z42loop_within_loop_with_multiple_exit_blocksmPPKcS1_Pm(
1644; CHECK-NEXT: entry:
1645; CHECK-NEXT: [[CMP11:%.*]] = icmp eq i64 [[OUTER_COUNT:%.*]], 0
1646; CHECK-NEXT: br i1 [[CMP11]], label [[CLEANUP:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1647; CHECK: for.body.preheader:
1648; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1649; CHECK: for.body:
1650; CHECK-NEXT: [[I_012:%.*]] = phi i64 [ [[INC:%.*]], [[IF_END:%.*]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1651; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8*, i8** [[PTR0:%.*]], i64 [[I_012]]
1652; CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[ARRAYIDX]]
1653; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i64, i64* [[COUNT:%.*]], i64 [[I_012]]
Roman Lebedevbdd65352019-09-03 17:14:56 +00001654; CHECK-NEXT: [[T1:%.*]] = load i64, i64* [[ARRAYIDX2]]
1655; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[T0]], i64 [[T1]]
1656; CHECK-NEXT: [[CMP5_I_I:%.*]] = icmp eq i64 [[T1]], 0
Roman Lebedev445c22b2019-04-25 08:33:47 +00001657; CHECK-NEXT: br i1 [[CMP5_I_I]], label [[IF_END]], label [[FOR_BODY_I_I_PREHEADER:%.*]]
1658; CHECK: for.body.i.i.preheader:
1659; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i8*, i8** [[PTR1:%.*]], i64 [[I_012]]
1660; CHECK-NEXT: [[T2:%.*]] = load i8*, i8** [[ARRAYIDX3]]
Roman Lebedevbdd65352019-09-03 17:14:56 +00001661; CHECK-NEXT: br label [[FOR_BODY_I_I:%.*]]
1662; CHECK: for.body.i.i:
1663; CHECK-NEXT: [[__FIRST2_ADDR_07_I_I:%.*]] = phi i8* [ [[INCDEC_PTR1_I_I:%.*]], [[FOR_INC_I_I:%.*]] ], [ [[T2]], [[FOR_BODY_I_I_PREHEADER]] ]
1664; CHECK-NEXT: [[__FIRST1_ADDR_06_I_I:%.*]] = phi i8* [ [[INCDEC_PTR_I_I:%.*]], [[FOR_INC_I_I]] ], [ [[T0]], [[FOR_BODY_I_I_PREHEADER]] ]
1665; CHECK-NEXT: [[T3:%.*]] = load i8, i8* [[__FIRST1_ADDR_06_I_I]]
1666; CHECK-NEXT: [[T4:%.*]] = load i8, i8* [[__FIRST2_ADDR_07_I_I]]
1667; CHECK-NEXT: [[CMP_I_I_I:%.*]] = icmp eq i8 [[T3]], [[T4]]
1668; CHECK-NEXT: br i1 [[CMP_I_I_I]], label [[FOR_INC_I_I]], label [[IF_THEN:%.*]]
1669; CHECK: for.inc.i.i:
1670; CHECK-NEXT: [[INCDEC_PTR_I_I]] = getelementptr inbounds i8, i8* [[__FIRST1_ADDR_06_I_I]], i64 1
1671; CHECK-NEXT: [[INCDEC_PTR1_I_I]] = getelementptr inbounds i8, i8* [[__FIRST2_ADDR_07_I_I]], i64 1
1672; CHECK-NEXT: [[CMP_I_I:%.*]] = icmp eq i8* [[INCDEC_PTR_I_I]], [[ADD_PTR]]
1673; CHECK-NEXT: br i1 [[CMP_I_I]], label [[IF_END_LOOPEXIT:%.*]], label [[FOR_BODY_I_I]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001674; CHECK: if.then:
1675; CHECK-NEXT: tail call void @_Z17callee_on_unequalv()
1676; CHECK-NEXT: br label [[CLEANUP]]
1677; CHECK: if.end.loopexit:
1678; CHECK-NEXT: br label [[IF_END]]
1679; CHECK: if.end:
1680; CHECK-NEXT: tail call void @_Z17callee_on_successv()
1681; CHECK-NEXT: [[INC]] = add nuw i64 [[I_012]], 1
1682; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[INC]], [[OUTER_COUNT]]
1683; CHECK-NEXT: br i1 [[CMP]], label [[CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]]
1684; CHECK: cleanup.loopexit:
1685; CHECK-NEXT: br label [[CLEANUP]]
1686; CHECK: cleanup:
1687; CHECK-NEXT: ret void
1688;
1689entry:
1690 %cmp11 = icmp eq i64 %outer_count, 0
1691 br i1 %cmp11, label %cleanup, label %for.body
1692
1693for.body: ; preds = %entry, %if.end
1694 %i.012 = phi i64 [ %inc, %if.end ], [ 0, %entry ]
1695 %arrayidx = getelementptr inbounds i8*, i8** %ptr0, i64 %i.012
1696 %t0 = load i8*, i8** %arrayidx
1697 %arrayidx2 = getelementptr inbounds i64, i64* %count, i64 %i.012
1698 %t1 = load i64, i64* %arrayidx2
1699 %add.ptr = getelementptr inbounds i8, i8* %t0, i64 %t1
1700 %cmp5.i.i = icmp eq i64 %t1, 0
1701 br i1 %cmp5.i.i, label %if.end, label %for.body.i.i.preheader
1702
1703for.body.i.i.preheader: ; preds = %for.body
1704 %arrayidx3 = getelementptr inbounds i8*, i8** %ptr1, i64 %i.012
1705 %t2 = load i8*, i8** %arrayidx3
1706 br label %for.body.i.i
1707
1708for.body.i.i: ; preds = %for.body.i.i.preheader, %for.inc.i.i
1709 %__first2.addr.07.i.i = phi i8* [ %incdec.ptr1.i.i, %for.inc.i.i ], [ %t2, %for.body.i.i.preheader ]
1710 %__first1.addr.06.i.i = phi i8* [ %incdec.ptr.i.i, %for.inc.i.i ], [ %t0, %for.body.i.i.preheader ]
1711 %t3 = load i8, i8* %__first1.addr.06.i.i
1712 %t4 = load i8, i8* %__first2.addr.07.i.i
1713 %cmp.i.i.i = icmp eq i8 %t3, %t4
1714 br i1 %cmp.i.i.i, label %for.inc.i.i, label %if.then
1715
1716for.inc.i.i: ; preds = %for.body.i.i
1717 %incdec.ptr.i.i = getelementptr inbounds i8, i8* %__first1.addr.06.i.i, i64 1
1718 %incdec.ptr1.i.i = getelementptr inbounds i8, i8* %__first2.addr.07.i.i, i64 1
1719 %cmp.i.i = icmp eq i8* %incdec.ptr.i.i, %add.ptr
1720 br i1 %cmp.i.i, label %if.end, label %for.body.i.i
1721
1722if.then: ; preds = %for.body.i.i
1723 tail call void @_Z17callee_on_unequalv()
1724 br label %cleanup
1725
1726if.end: ; preds = %for.inc.i.i, %for.body
1727 tail call void @_Z17callee_on_successv()
1728 %inc = add nuw i64 %i.012, 1
1729 %cmp = icmp eq i64 %inc, %outer_count
1730 br i1 %cmp, label %cleanup, label %for.body
1731
1732cleanup: ; preds = %if.end, %entry, %if.then
1733 ret void
1734}
1735
1736define void @_Z21endless_loop_if_equalPiS_(i32* %a, i32* %b) {
1737; CHECK-LABEL: @_Z21endless_loop_if_equalPiS_(
1738; CHECK-NEXT: entry:
1739; CHECK-NEXT: br label [[FOR_COND:%.*]]
1740; CHECK: for.cond.loopexit:
1741; CHECK-NEXT: br label [[FOR_COND]]
1742; CHECK: for.cond:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001743; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1744; CHECK: for.cond1:
1745; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INDVARS_IV_NEXT:%.*]], 4
1746; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_LOOPEXIT:%.*]]
1747; CHECK: for.body:
1748; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[FOR_COND]] ], [ [[INDVARS_IV_NEXT]], [[FOR_COND1:%.*]] ]
1749; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[A:%.*]], i64 [[INDVARS_IV]]
1750; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* [[ARRAYIDX]]
1751; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[B:%.*]], i64 [[INDVARS_IV]]
1752; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[ARRAYIDX3]]
1753; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]
1754; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
1755; CHECK-NEXT: br i1 [[CMP4]], label [[FOR_COND1]], label [[RETURN:%.*]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001756; CHECK: return:
1757; CHECK-NEXT: ret void
1758;
1759entry:
1760 br label %for.cond
1761
1762for.cond: ; preds = %for.cond1, %entry
1763 br label %for.body
1764
1765for.cond1: ; preds = %for.body
1766 %cmp = icmp ult i64 %indvars.iv.next, 4
1767 br i1 %cmp, label %for.body, label %for.cond
1768
1769for.body: ; preds = %for.cond, %for.cond1
1770 %indvars.iv = phi i64 [ 0, %for.cond ], [ %indvars.iv.next, %for.cond1 ]
1771 %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
1772 %0 = load i32, i32* %arrayidx
1773 %arrayidx3 = getelementptr inbounds i32, i32* %b, i64 %indvars.iv
1774 %1 = load i32, i32* %arrayidx3
1775 %cmp4 = icmp eq i32 %0, %1
1776 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
1777 br i1 %cmp4, label %for.cond1, label %return
1778
1779return: ; preds = %for.body
1780 ret void
1781}
1782
1783define i1 @_Z21load_of_bitcastsPKcPKfm(i8* %ptr0, float* %ptr1, i64 %count) {
1784; CHECK-LABEL: @_Z21load_of_bitcastsPKcPKfm(
1785; CHECK-NEXT: entry:
1786; CHECK-NEXT: [[CMP13:%.*]] = icmp eq i64 [[COUNT:%.*]], 0
Roman Lebedevbdd65352019-09-03 17:14:56 +00001787; CHECK-NEXT: br i1 [[CMP13]], label [[CLEANUP3:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1788; CHECK: for.body.preheader:
1789; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1790; CHECK: for.body:
1791; CHECK-NEXT: [[PTR0_ADDR_016:%.*]] = phi i8* [ [[ADD_PTR:%.*]], [[FOR_INC:%.*]] ], [ [[PTR0:%.*]], [[FOR_BODY_PREHEADER]] ]
1792; CHECK-NEXT: [[I_015:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_INC]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1793; CHECK-NEXT: [[PTR1_ADDR_014:%.*]] = phi float* [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ], [ [[PTR1:%.*]], [[FOR_BODY_PREHEADER]] ]
1794; CHECK-NEXT: [[V0_0__SROA_CAST:%.*]] = bitcast i8* [[PTR0_ADDR_016]] to i32*
1795; CHECK-NEXT: [[V0_0_COPYLOAD:%.*]] = load i32, i32* [[V0_0__SROA_CAST]]
1796; CHECK-NEXT: [[V1_0__SROA_CAST:%.*]] = bitcast float* [[PTR1_ADDR_014]] to i32*
1797; CHECK-NEXT: [[V1_0_COPYLOAD:%.*]] = load i32, i32* [[V1_0__SROA_CAST]]
1798; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[V0_0_COPYLOAD]], [[V1_0_COPYLOAD]]
1799; CHECK-NEXT: br i1 [[CMP1]], label [[FOR_INC]], label [[CLEANUP3_LOOPEXIT:%.*]]
1800; CHECK: for.inc:
1801; CHECK-NEXT: [[INC]] = add nuw i64 [[I_015]], 1
1802; CHECK-NEXT: [[ADD_PTR]] = getelementptr inbounds i8, i8* [[PTR0_ADDR_016]], i64 4
1803; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds float, float* [[PTR1_ADDR_014]], i64 1
1804; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], [[COUNT]]
1805; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP3_LOOPEXIT]]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001806; CHECK: cleanup3.loopexit:
Roman Lebedevbdd65352019-09-03 17:14:56 +00001807; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
Roman Lebedev445c22b2019-04-25 08:33:47 +00001808; CHECK-NEXT: br label [[CLEANUP3]]
1809; CHECK: cleanup3:
1810; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP3_LOOPEXIT]] ]
1811; CHECK-NEXT: ret i1 [[RES]]
1812;
1813entry:
1814 %cmp13 = icmp eq i64 %count, 0
1815 br i1 %cmp13, label %cleanup3, label %for.body
1816
1817for.body: ; preds = %entry, %for.inc
1818 %ptr0.addr.016 = phi i8* [ %add.ptr, %for.inc ], [ %ptr0, %entry ]
1819 %i.015 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
1820 %ptr1.addr.014 = phi float* [ %incdec.ptr, %for.inc ], [ %ptr1, %entry ]
1821 %v0.0..sroa_cast = bitcast i8* %ptr0.addr.016 to i32*
1822 %v0.0.copyload = load i32, i32* %v0.0..sroa_cast
1823 %v1.0..sroa_cast = bitcast float* %ptr1.addr.014 to i32*
1824 %v1.0.copyload = load i32, i32* %v1.0..sroa_cast
1825 %cmp1 = icmp eq i32 %v0.0.copyload, %v1.0.copyload
1826 br i1 %cmp1, label %for.inc, label %cleanup3
1827
1828for.inc: ; preds = %for.body
1829 %inc = add nuw i64 %i.015, 1
1830 %add.ptr = getelementptr inbounds i8, i8* %ptr0.addr.016, i64 4
1831 %incdec.ptr = getelementptr inbounds float, float* %ptr1.addr.014, i64 1
1832 %cmp = icmp ult i64 %inc, %count
1833 br i1 %cmp, label %for.body, label %cleanup3
1834
1835cleanup3: ; preds = %for.body, %for.inc, %entry
1836 %res = phi i1 [ true, %entry ], [ true, %for.inc ], [ false, %for.body ]
1837 ret i1 %res
1838}
1839
1840; FIXME
1841define i1 @_Z17overlapping_loadsPKcS0_m(i8* %ptr0, i8* %ptr1, i64 %count) {
1842; CHECK-LABEL: @_Z17overlapping_loadsPKcS0_m(
1843; CHECK-NEXT: entry:
1844; CHECK-NEXT: [[CMP14:%.*]] = icmp eq i64 [[COUNT:%.*]], 0
1845; CHECK-NEXT: br i1 [[CMP14]], label [[CLEANUP4:%.*]], label [[FOR_BODY_PREHEADER:%.*]]
1846; CHECK: for.body.preheader:
1847; CHECK-NEXT: br label [[FOR_BODY:%.*]]
1848; CHECK: for.body:
1849; CHECK-NEXT: [[PTR0_ADDR_017:%.*]] = phi i8* [ [[INCDEC_PTR:%.*]], [[FOR_INC:%.*]] ], [ [[PTR0:%.*]], [[FOR_BODY_PREHEADER]] ]
1850; CHECK-NEXT: [[I_016:%.*]] = phi i64 [ [[INC:%.*]], [[FOR_INC]] ], [ 0, [[FOR_BODY_PREHEADER]] ]
1851; CHECK-NEXT: [[PTR1_ADDR_015:%.*]] = phi i8* [ [[INCDEC_PTR3:%.*]], [[FOR_INC]] ], [ [[PTR1:%.*]], [[FOR_BODY_PREHEADER]] ]
1852; CHECK-NEXT: [[V0_0__SROA_CAST:%.*]] = bitcast i8* [[PTR0_ADDR_017]] to i32*
1853; CHECK-NEXT: [[V0_0_COPYLOAD:%.*]] = load i32, i32* [[V0_0__SROA_CAST]]
1854; CHECK-NEXT: [[V1_0__SROA_CAST:%.*]] = bitcast i8* [[PTR1_ADDR_015]] to i32*
1855; CHECK-NEXT: [[V1_0_COPYLOAD:%.*]] = load i32, i32* [[V1_0__SROA_CAST]]
1856; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[V0_0_COPYLOAD]], [[V1_0_COPYLOAD]]
1857; CHECK-NEXT: br i1 [[CMP1]], label [[FOR_INC]], label [[CLEANUP4_LOOPEXIT:%.*]]
1858; CHECK: for.inc:
1859; CHECK-NEXT: [[INC]] = add nuw i64 [[I_016]], 1
1860; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr inbounds i8, i8* [[PTR0_ADDR_017]], i64 1
1861; CHECK-NEXT: [[INCDEC_PTR3]] = getelementptr inbounds i8, i8* [[PTR1_ADDR_015]], i64 1
1862; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[INC]], [[COUNT]]
1863; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[CLEANUP4_LOOPEXIT]]
1864; CHECK: cleanup4.loopexit:
1865; CHECK-NEXT: [[RES_PH:%.*]] = phi i1 [ false, [[FOR_BODY]] ], [ true, [[FOR_INC]] ]
1866; CHECK-NEXT: br label [[CLEANUP4]]
1867; CHECK: cleanup4:
1868; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ [[RES_PH]], [[CLEANUP4_LOOPEXIT]] ]
1869; CHECK-NEXT: ret i1 [[RES]]
1870;
1871entry:
1872 %cmp14 = icmp eq i64 %count, 0
1873 br i1 %cmp14, label %cleanup4, label %for.body
1874
1875for.body: ; preds = %entry, %for.inc
1876 %ptr0.addr.017 = phi i8* [ %incdec.ptr, %for.inc ], [ %ptr0, %entry ]
1877 %i.016 = phi i64 [ %inc, %for.inc ], [ 0, %entry ]
1878 %ptr1.addr.015 = phi i8* [ %incdec.ptr3, %for.inc ], [ %ptr1, %entry ]
1879 %v0.0..sroa_cast = bitcast i8* %ptr0.addr.017 to i32*
1880 %v0.0.copyload = load i32, i32* %v0.0..sroa_cast
1881 %v1.0..sroa_cast = bitcast i8* %ptr1.addr.015 to i32*
1882 %v1.0.copyload = load i32, i32* %v1.0..sroa_cast
1883 %cmp1 = icmp eq i32 %v0.0.copyload, %v1.0.copyload
1884 br i1 %cmp1, label %for.inc, label %cleanup4
1885
1886for.inc: ; preds = %for.body
1887 %inc = add nuw i64 %i.016, 1
1888 %incdec.ptr = getelementptr inbounds i8, i8* %ptr0.addr.017, i64 1
1889 %incdec.ptr3 = getelementptr inbounds i8, i8* %ptr1.addr.015, i64 1
1890 %cmp = icmp ult i64 %inc, %count
1891 br i1 %cmp, label %for.body, label %cleanup4
1892
1893cleanup4: ; preds = %for.body, %for.inc, %entry
1894 %res = phi i1 [ true, %entry ], [ true, %for.inc ], [ false, %for.body ]
1895 ret i1 %res
1896}