blob: 4b93122b6e729d0c2534b54f530400e043c21df7 [file] [log] [blame]
Sanjoy Das21434472016-08-14 01:04:46 +00001; RUN: opt -verify-loop-info -irce -S < %s | FileCheck %s
Sanjoy Dasa1837a32015-01-16 01:03:22 +00002
3define void @single_access_with_preloop(i32 *%arr, i32 *%a_len_ptr, i32 %n, i32 %offset) {
4 entry:
David Blaikiea79ac142015-02-27 21:17:42 +00005 %len = load i32, i32* %a_len_ptr, !range !0
Sanjoy Dasa1837a32015-01-16 01:03:22 +00006 %first.itr.check = icmp sgt i32 %n, 0
7 br i1 %first.itr.check, label %loop, label %exit
8
9 loop:
10 %idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]
11 %idx.next = add i32 %idx, 1
12 %array.idx = add i32 %idx, %offset
13 %abc.high = icmp slt i32 %array.idx, %len
14 %abc.low = icmp sge i32 %array.idx, 0
15 %abc = and i1 %abc.low, %abc.high
Sanjoy Dasdcf26512015-01-27 21:38:12 +000016 br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
Sanjoy Dasa1837a32015-01-16 01:03:22 +000017
18 in.bounds:
David Blaikie79e6c742015-02-27 19:29:02 +000019 %addr = getelementptr i32, i32* %arr, i32 %array.idx
Sanjoy Dasa1837a32015-01-16 01:03:22 +000020 store i32 0, i32* %addr
21 %next = icmp slt i32 %idx.next, %n
22 br i1 %next, label %loop, label %exit
23
24 out.of.bounds:
25 ret void
26
27 exit:
28 ret void
29}
30
Sanjoy Dasaae623f2016-07-22 00:41:02 +000031; CHECK-LABEL: @single_access_with_preloop(
32; CHECK: loop.preheader:
Max Kazantsev26846782017-11-20 06:07:57 +000033; CHECK: [[check_min_sint_offset:[^ ]+]] = icmp sgt i32 %offset, -2147483647
34; CHECK: [[safe_offset_preloop:[^ ]+]] = select i1 [[check_min_sint_offset]], i32 %offset, i32 -2147483647
35; If Offset was a SINT_MIN, we could have an overflow here. That is why we calculated its safe version.
36; CHECK: [[not_safe_start:[^ ]+]] = add i32 [[safe_offset_preloop]], -1
Sanjoy Das7fc60da2015-02-21 22:07:32 +000037; CHECK: [[not_n:[^ ]+]] = sub i32 -1, %n
Sanjoy Dase75ed922015-02-26 08:19:31 +000038; CHECK: [[not_exit_preloop_at_cond_loclamp:[^ ]+]] = icmp sgt i32 [[not_safe_start]], [[not_n]]
39; CHECK: [[not_exit_preloop_at_loclamp:[^ ]+]] = select i1 [[not_exit_preloop_at_cond_loclamp]], i32 [[not_safe_start]], i32 [[not_n]]
40; CHECK: [[exit_preloop_at_loclamp:[^ ]+]] = sub i32 -1, [[not_exit_preloop_at_loclamp]]
41; CHECK: [[exit_preloop_at_cond:[^ ]+]] = icmp sgt i32 [[exit_preloop_at_loclamp]], 0
42; CHECK: [[exit_preloop_at:[^ ]+]] = select i1 [[exit_preloop_at_cond]], i32 [[exit_preloop_at_loclamp]], i32 0
Sanjoy Das7fc60da2015-02-21 22:07:32 +000043
Sanjoy Dase75ed922015-02-26 08:19:31 +000044
Max Kazantsev26846782017-11-20 06:07:57 +000045; CHECK: [[len_minus_sint_max:[^ ]+]] = add i32 %len, -2147483647
46; CHECK: [[check_len_min_sint_offset:[^ ]+]] = icmp sgt i32 %offset, [[len_minus_sint_max]]
47; CHECK: [[safe_offset_mainloop:[^ ]+]] = select i1 [[check_len_min_sint_offset]], i32 %offset, i32 [[len_minus_sint_max]]
48; CHECK: [[not_safe_start_2:[^ ]+]] = add i32 [[safe_offset_mainloop]], -1
49; If Offset was a SINT_MIN, we could have an overflow here. That is why we calculated its safe version.
Max Kazantsev1ac6e8a2017-11-17 06:49:26 +000050; CHECK: [[not_safe_upper_end:[^ ]+]] = sub i32 [[not_safe_start_2]], %len
51; CHECK: [[not_exit_mainloop_at_cond_loclamp:[^ ]+]] = icmp sgt i32 [[not_safe_upper_end]], [[not_n]]
52; CHECK: [[not_exit_mainloop_at_loclamp:[^ ]+]] = select i1 [[not_exit_mainloop_at_cond_loclamp]], i32 [[not_safe_upper_end]], i32 [[not_n]]
Max Kazantsev26846782017-11-20 06:07:57 +000053; CHECK: [[check_offset_mainloop_2:[^ ]+]] = icmp sgt i32 %offset, 0
54; CHECK: [[safe_offset_mainloop_2:[^ ]+]] = select i1 [[check_offset_mainloop_2]], i32 %offset, i32 0
55; CHECK: [[not_safe_lower_end:[^ ]+]] = add i32 [[safe_offset_mainloop_2]], -2147483648
Max Kazantsev1ac6e8a2017-11-17 06:49:26 +000056; CHECK: [[not_exit_mainloop_at_cond_hiclamp:[^ ]+]] = icmp sgt i32 [[not_exit_mainloop_at_loclamp]], [[not_safe_lower_end]]
57; CHECK: [[not_exit_mainloop_at_hiclamp:[^ ]+]] = select i1 [[not_exit_mainloop_at_cond_hiclamp]], i32 [[not_exit_mainloop_at_loclamp]], i32 [[not_safe_lower_end]]
58; CHECK: [[exit_mainloop_at_hiclamp:[^ ]+]] = sub i32 -1, [[not_exit_mainloop_at_hiclamp]]
59; CHECK: [[exit_mainloop_at_cmp:[^ ]+]] = icmp sgt i32 [[exit_mainloop_at_hiclamp]], 0
60; CHECK: [[exit_mainloop_at:[^ ]+]] = select i1 [[exit_mainloop_at_cmp]], i32 [[exit_mainloop_at_hiclamp]], i32 0
Sanjoy Dase75ed922015-02-26 08:19:31 +000061
Max Kazantsev1ac6e8a2017-11-17 06:49:26 +000062; CHECK: mainloop:
63; CHECK: br label %loop
64
65; CHECK: loop:
66; CHECK: %abc.high = icmp slt i32 %array.idx, %len
67; CHECK: %abc.low = icmp sge i32 %array.idx, 0
68; CHECK: %abc = and i1 true, true
Max Kazantsev26846782017-11-20 06:07:57 +000069; CHECK: br i1 %abc, label %in.bounds, label %out.of.bounds.loopexit11
Sanjoy Dasa1837a32015-01-16 01:03:22 +000070
Sanjoy Dasaae623f2016-07-22 00:41:02 +000071; CHECK: in.bounds:
Sanjoy Dasa1837a32015-01-16 01:03:22 +000072; CHECK: [[continue_mainloop_cond:[^ ]+]] = icmp slt i32 %idx.next, [[exit_mainloop_at]]
73; CHECK: br i1 [[continue_mainloop_cond]], label %loop, label %main.exit.selector
74
Sanjoy Dasaae623f2016-07-22 00:41:02 +000075; CHECK: main.exit.selector:
Sanjoy Dasf45e03e2016-08-02 19:31:54 +000076; CHECK: [[mainloop_its_left:[^ ]+]] = icmp slt i32 %idx.next.lcssa, %n
Sanjoy Dasa1837a32015-01-16 01:03:22 +000077; CHECK: br i1 [[mainloop_its_left]], label %main.pseudo.exit, label %exit.loopexit
78
Sanjoy Dasaae623f2016-07-22 00:41:02 +000079; CHECK: in.bounds.preloop:
Sanjoy Dasa1837a32015-01-16 01:03:22 +000080; CHECK: [[continue_preloop_cond:[^ ]+]] = icmp slt i32 %idx.next.preloop, [[exit_preloop_at]]
81; CHECK: br i1 [[continue_preloop_cond]], label %loop.preloop, label %preloop.exit.selector
82
Sanjoy Dasaae623f2016-07-22 00:41:02 +000083; CHECK: preloop.exit.selector:
Sanjoy Das21434472016-08-14 01:04:46 +000084; CHECK: [[preloop_its_left:[^ ]+]] = icmp slt i32 %idx.next.preloop.lcssa, %n
Sanjoy Dasa1837a32015-01-16 01:03:22 +000085; CHECK: br i1 [[preloop_its_left]], label %preloop.pseudo.exit, label %exit.loopexit
86
Sanjoy Dasaae623f2016-07-22 00:41:02 +000087; CHECK: in.bounds.postloop:
Sanjoy Dasa1837a32015-01-16 01:03:22 +000088; CHECK: %next.postloop = icmp slt i32 %idx.next.postloop, %n
89; CHECK: br i1 %next.postloop, label %loop.postloop, label %exit.loopexit
90
91!0 = !{i32 0, i32 2147483647}
Sanjoy Dasdcf26512015-01-27 21:38:12 +000092!1 = !{!"branch_weights", i32 64, i32 4}