xref: /llvm-project/llvm/test/Transforms/IRCE/unhandled.ll (revision 483e92468e597b73c646182bd755a0d5ef67d327)
1; RUN: opt -irce-print-changed-loops -verify-loop-info -passes=irce -S < %s 2>&1 | FileCheck %s
2; RUN: opt -irce-print-changed-loops -verify-loop-info -passes='require<branch-prob>,irce' -S < %s 2>&1 | FileCheck %s
3
4; CHECK-NOT: constrained Loop at depth
5
6; Demonstrates that we don't currently handle the general expression
7; `A * I + B'.
8
9define void @general_affine_expressions(ptr %arr, ptr %a_len_ptr, i32 %n,
10                                        i32 %scale, i32 %offset) {
11 entry:
12  %len = load i32, ptr %a_len_ptr, !range !0
13  %first.itr.check = icmp sgt i32 %n, 0
14  br i1 %first.itr.check, label %loop, label %exit
15
16 loop:
17  %idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]
18  %idx.next = add i32 %idx, 1
19  %idx.mul = mul i32 %idx, %scale
20  %array.idx = add i32 %idx.mul, %offset
21  %abc.high = icmp slt i32 %array.idx, %len
22  %abc.low = icmp sge i32 %array.idx, 0
23  %abc = and i1 %abc.low, %abc.high
24  br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
25
26 in.bounds:
27  %addr = getelementptr i32, ptr %arr, i32 %array.idx
28  store i32 0, ptr %addr
29  %next = icmp slt i32 %idx.next, %n
30  br i1 %next, label %loop, label %exit
31
32 out.of.bounds:
33  ret void
34
35 exit:
36  ret void
37}
38
39; Check that we do the right thing for a loop that could not be
40; simplified due to an indirectbr.
41
42define void @multiple_latches(ptr %arr, ptr %a_len_ptr, i32 %n) {
43 entry:
44  %len = load i32, ptr %a_len_ptr, !range !0
45  %n.add.1 = add i32 %n, 1
46  %first.itr.check = icmp sgt i32 %n, 0
47  br i1 %first.itr.check, label %loop, label %exit
48
49 loop:
50  %idx = phi i32 [ 0, %entry ], [ %idx.next, %in.bounds ], [ %idx.next, %continue ]
51  %idx.next = add i32 %idx, 1
52  %idx.next2 = add i32 %idx, 2
53  %abc = icmp slt i32 %idx, %len
54  br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
55
56 in.bounds:
57  %addr = getelementptr i32, ptr %arr, i32 %idx
58  store i32 0, ptr %addr
59  %next = icmp slt i32 %idx.next, %n
60  br i1 %next, label %loop, label %continue
61
62 continue:
63  %next2 = icmp slt i32 %idx.next, %n.add.1
64  %dest = select i1 %next2, ptr blockaddress(@multiple_latches, %loop), ptr blockaddress(@multiple_latches, %exit)
65  indirectbr ptr %dest, [ label %loop, label %exit]
66
67 out.of.bounds:
68  ret void
69
70 exit:
71  ret void
72}
73
74define void @already_cloned(ptr %arr, ptr %a_len_ptr, i32 %n) {
75 entry:
76  %len = load i32, ptr %a_len_ptr, !range !0
77  %first.itr.check = icmp sgt i32 %n, 0
78  br i1 %first.itr.check, label %loop, label %exit
79
80 loop:
81  %idx = phi i32 [ 0, %entry ] , [ %idx.next, %in.bounds ]
82  %idx.next = add i32 %idx, 1
83  %abc = icmp slt i32 %idx, %len
84  br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1
85
86 in.bounds:
87  %addr = getelementptr i32, ptr %arr, i32 %idx
88  store i32 0, ptr %addr
89  %next = icmp slt i32 %idx.next, %n
90  br i1 %next, label %loop, label %exit, !loop_constrainer.loop.clone !{}
91
92 out.of.bounds:
93  ret void
94
95 exit:
96  ret void
97}
98
99!0 = !{i32 0, i32 2147483647}
100!1 = !{!"branch_weights", i32 64, i32 4}
101