xref: /aosp_15_r20/external/llvm/test/Analysis/ScalarEvolution/trip-count10.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Trip counts with trivial exit conditions.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @a
6*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: Unpredictable backedge-taken count.
7*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: Unpredictable max backedge-taken count.
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @b
10*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: backedge-taken count is false
11*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: max backedge-taken count is false
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @c
14*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: backedge-taken count is false
15*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: max backedge-taken count is false
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @d
18*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: Unpredictable backedge-taken count.
19*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: Unpredictable max backedge-taken count.
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine void @a(i64 %n) nounwind {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker  %t0 = icmp sgt i64 %n, 0
24*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %loop, label %return
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerloop:
27*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
28*9880d681SAndroid Build Coastguard Worker  %i.next = add nsw i64 %i, 1
29*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %i.next, %n
30*9880d681SAndroid Build Coastguard Worker  br i1 false, label %return, label %loop
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerreturn:
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Workerdefine void @b(i64 %n) nounwind {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker  %t0 = icmp sgt i64 %n, 0
38*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %loop, label %return
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerloop:
41*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
42*9880d681SAndroid Build Coastguard Worker  %i.next = add nsw i64 %i, 1
43*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %i.next, %n
44*9880d681SAndroid Build Coastguard Worker  br i1 true, label %return, label %loop
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerreturn:
47*9880d681SAndroid Build Coastguard Worker  ret void
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Workerdefine void @c(i64 %n) nounwind {
50*9880d681SAndroid Build Coastguard Workerentry:
51*9880d681SAndroid Build Coastguard Worker  %t0 = icmp sgt i64 %n, 0
52*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %loop, label %return
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerloop:
55*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
56*9880d681SAndroid Build Coastguard Worker  %i.next = add nsw i64 %i, 1
57*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %i.next, %n
58*9880d681SAndroid Build Coastguard Worker  br i1 false, label %loop, label %return
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerreturn:
61*9880d681SAndroid Build Coastguard Worker  ret void
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Workerdefine void @d(i64 %n) nounwind {
64*9880d681SAndroid Build Coastguard Workerentry:
65*9880d681SAndroid Build Coastguard Worker  %t0 = icmp sgt i64 %n, 0
66*9880d681SAndroid Build Coastguard Worker  br i1 %t0, label %loop, label %return
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerloop:
69*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
70*9880d681SAndroid Build Coastguard Worker  %i.next = add nsw i64 %i, 1
71*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %i.next, %n
72*9880d681SAndroid Build Coastguard Worker  br i1 true, label %loop, label %return
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerreturn:
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; Trip counts for non-polynomial iterations. It's theoretically possible
79*9880d681SAndroid Build Coastguard Worker; to compute a maximum count for these, but short of that, ScalarEvolution
80*9880d681SAndroid Build Coastguard Worker; should return unknown.
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; PR7416
83*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @nonpolynomial
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Loop %loophead: Unpredictable backedge-taken count
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: Loop %loophead: Unpredictable max backedge-taken count
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdeclare i1 @g() nounwind
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine void @nonpolynomial() {
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker  br label %loophead
92*9880d681SAndroid Build Coastguard Workerloophead:
93*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [0, %entry], [%x.1, %bb1], [%x.2, %bb2]
94*9880d681SAndroid Build Coastguard Worker  %y = icmp slt i32 %x, 100
95*9880d681SAndroid Build Coastguard Worker  br i1 %y, label %loopbody, label %retbb
96*9880d681SAndroid Build Coastguard Workerloopbody:
97*9880d681SAndroid Build Coastguard Worker  %z = call i1 @g()
98*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %bb1, label %bb2
99*9880d681SAndroid Build Coastguard Workerbb1:
100*9880d681SAndroid Build Coastguard Worker  %x.1 = add i32 %x, 2
101*9880d681SAndroid Build Coastguard Worker  br label %loophead
102*9880d681SAndroid Build Coastguard Workerbb2:
103*9880d681SAndroid Build Coastguard Worker  %x.2 = add i32 %x, 3
104*9880d681SAndroid Build Coastguard Worker  br label %loophead
105*9880d681SAndroid Build Coastguard Workerretbb:
106*9880d681SAndroid Build Coastguard Worker  ret void
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; PHI nodes with all constant operands.
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @constant_phi_operands
112*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: backedge-taken count is 1
113*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %loop: max backedge-taken count is 1
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine void @constant_phi_operands() nounwind {
116*9880d681SAndroid Build Coastguard Workerentry:
117*9880d681SAndroid Build Coastguard Worker  br label %loop
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerloop:
120*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ 1, %loop ], [ 0, %entry ]
121*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %i, 1
122*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %return, label %loop
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerreturn:
125*9880d681SAndroid Build Coastguard Worker  ret void
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; PR16130: Loop exit depends on an 'or' expression.
129*9880d681SAndroid Build Coastguard Worker; One side of the expression test against a value that will be skipped.
130*9880d681SAndroid Build Coastguard Worker; We can't assume undefined behavior just because we have an NSW flag.
131*9880d681SAndroid Build Coastguard Worker;
132*9880d681SAndroid Build Coastguard Worker; CHECK: Determining loop execution counts for: @exit_orcond_nsw
133*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body.i: Unpredictable backedge-taken count.
134*9880d681SAndroid Build Coastguard Worker; CHECK: Loop %for.body.i: max backedge-taken count is 1
135*9880d681SAndroid Build Coastguard Workerdefine void @exit_orcond_nsw(i32 *%a) nounwind {
136*9880d681SAndroid Build Coastguard Workerentry:
137*9880d681SAndroid Build Coastguard Worker  br label %for.body.i
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerfor.body.i:                                       ; preds = %for.body.i, %entry
140*9880d681SAndroid Build Coastguard Worker  %b.01.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]
141*9880d681SAndroid Build Coastguard Worker  %tobool.i = icmp ne i32 %b.01.i, 0
142*9880d681SAndroid Build Coastguard Worker  %add.i = add nsw i32 %b.01.i, 8
143*9880d681SAndroid Build Coastguard Worker  %cmp.i = icmp eq i32 %add.i, 13
144*9880d681SAndroid Build Coastguard Worker  %or.cond = or i1 %tobool.i, %cmp.i
145*9880d681SAndroid Build Coastguard Worker  br i1 %or.cond, label %exit, label %for.body.i
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerexit:                                     ; preds = %for.body.i
148*9880d681SAndroid Build Coastguard Worker  %b.01.i.lcssa = phi i32 [ %b.01.i, %for.body.i ]
149*9880d681SAndroid Build Coastguard Worker  store i32 %b.01.i.lcssa, i32* %a, align 4
150*9880d681SAndroid Build Coastguard Worker  ret void
151*9880d681SAndroid Build Coastguard Worker}
152