xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/trivial-phis.ll (revision 079c525f206228c3343048bb5a74a8e9a428de1a)
1; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s
2
3; CHECK-LABEL: @test1
4; CHECK:       %add.lcssa.wide = phi i64 [ %indvars.iv.next, %do.body ]
5; CHECK-NEXT:  -->  {1,+,1}<nuw><nsw><%do.body> U: [1,2147483648) S: [1,2147483648)
6
7define i64 @test1(i32 signext %n, ptr %A) {
8entry:
9  %0 = sext i32 %n to i64
10  br label %do.body
11
12do.body:                                          ; preds = %do.body, %entry
13  %indvars.iv = phi i64 [ %indvars.iv.next, %do.body ], [ 0, %entry ]
14  %arrayidx = getelementptr inbounds float, ptr %A, i64 %indvars.iv
15  store float 1.000000e+00, ptr %arrayidx, align 4
16  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
17  %cmp = icmp slt i64 %indvars.iv.next, %0
18  br i1 %cmp, label %do.body, label %do.end
19
20do.end:                                           ; preds = %do.body
21  %add.lcssa.wide = phi i64 [ %indvars.iv.next, %do.body ]
22  ret i64 %add.lcssa.wide
23}
24
25; CHECK-LABEL: @test2
26; CHECK:      %tmp24 = phi i64 [ %tmp14, %bb22 ], [ %tmp14, %bb13 ]
27; CHECK-NEXT: -->  {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807) Exits: (-2 + %arg)
28
29define void @test2(i64 %arg, ptr noalias %arg1) {
30bb:
31  %tmp = icmp slt i64 0, %arg
32  br i1 %tmp, label %bb7, label %bb48
33
34bb7:                                              ; preds = %bb
35  br label %bb8
36
37bb8:                                              ; preds = %bb44, %bb7
38  %tmp9 = phi i64 [ 0, %bb7 ], [ %tmp45, %bb44 ]
39  %tmp10 = add nsw i64 %arg, -1
40  %tmp11 = icmp slt i64 1, %tmp10
41  br i1 %tmp11, label %bb12, label %bb43
42
43bb12:                                             ; preds = %bb8
44  br label %bb13
45
46bb13:                                             ; preds = %bb39, %bb12
47  %tmp14 = phi i64 [ 1, %bb12 ], [ %tmp40, %bb39 ]
48  %tmp15 = icmp slt i64 0, %arg
49  br i1 %tmp15, label %bb16, label %bb23
50
51bb16:                                             ; preds = %bb13
52  br label %bb17
53
54bb17:                                             ; preds = %bb19, %bb16
55  %tmp18 = phi i64 [ 0, %bb16 ], [ %tmp20, %bb19 ]
56  br label %bb19
57
58bb19:                                             ; preds = %bb17
59  %tmp20 = add nuw nsw i64 %tmp18, 1
60  %tmp21 = icmp slt i64 %tmp20, %arg
61  br i1 %tmp21, label %bb17, label %bb22
62
63bb22:                                             ; preds = %bb19
64  br label %bb23
65
66bb23:                                             ; preds = %bb22, %bb13
67  %tmp24 = phi i64 [ %tmp14, %bb22 ], [ %tmp14, %bb13 ]
68  %tmp25 = icmp slt i64 0, %arg
69  br i1 %tmp25, label %bb26, label %bb37
70
71bb26:                                             ; preds = %bb23
72  br label %bb27
73
74bb27:                                             ; preds = %bb33, %bb26
75  %tmp28 = phi i64 [ 0, %bb26 ], [ %tmp34, %bb33 ]
76  %tmp29 = mul nsw i64 %tmp9, %arg
77  %tmp30 = getelementptr inbounds i32, ptr %arg1, i64 %tmp24
78  %tmp31 = getelementptr inbounds i32, ptr %tmp30, i64 %tmp29
79  %tmp32 = load i32, ptr %tmp31, align 4
80  br label %bb33
81
82bb33:                                             ; preds = %bb27
83  %tmp34 = add nuw nsw i64 %tmp28, 1
84  %tmp35 = icmp slt i64 %tmp34, %arg
85  br i1 %tmp35, label %bb27, label %bb36
86
87bb36:                                             ; preds = %bb33
88  br label %bb37
89
90bb37:                                             ; preds = %bb36, %bb23
91  %tmp38 = phi i64 [ %tmp24, %bb36 ], [ %tmp24, %bb23 ]
92  br label %bb39
93
94bb39:                                             ; preds = %bb37
95  %tmp40 = add nuw nsw i64 %tmp38, 1
96  %tmp41 = icmp slt i64 %tmp40, %tmp10
97  br i1 %tmp41, label %bb13, label %bb42
98
99bb42:                                             ; preds = %bb39
100  br label %bb43
101
102bb43:                                             ; preds = %bb42, %bb8
103  br label %bb44
104
105bb44:                                             ; preds = %bb43
106  %tmp45 = add nuw nsw i64 %tmp9, 1
107  %tmp46 = icmp slt i64 %tmp45, %arg
108  br i1 %tmp46, label %bb8, label %bb47
109
110bb47:                                             ; preds = %bb44
111  br label %bb48
112
113bb48:                                             ; preds = %bb47, %bb
114  ret void
115}
116
117; CHECK-LABEL: @test3
118
119; CHECK:      %tmp14 = phi i64 [ %tmp40, %bb39 ], [ 1, %bb8 ]
120; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807)
121; CHECK-SAME:      Exits: (-2 + %arg)       LoopDispositions: { %bb13: Computable, %bb8: Variant, %bb17_a: Invariant, %bb27: Invariant }
122; CHECK:      %tmp18 = phi i64 [ %tmp20, %bb17 ], [ 0, %bb13 ]
123; CHECK-NEXT: -->  {0,+,1}<nuw><nsw><%bb17_a> U: [0,9223372036854775807) S: [0,9223372036854775807)
124; CHECK-SAME:      Exits: (-1 + %arg)       LoopDispositions: { %bb17_a: Computable, %bb13: Variant, %bb8: Variant }
125
126; CHECK:      %tmp24 = phi i64 [ %tmp14, %bb13 ], [ %tmp14, %bb17 ]
127; CHECK-NEXT: -->  {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807)
128; CHECK-SAME:      Exits: (-2 + %arg)       LoopDispositions: { %bb13: Computable, %bb8: Variant, %bb17_a: Invariant, %bb27: Invariant }
129; CHECK:       %tmp28 = phi i64 [ %tmp34, %bb27 ], [ 0, %bb23 ]
130; CHECK-NEXT:  -->  {0,+,1}<nuw><nsw><%bb27> U: [0,9223372036854775807) S: [0,9223372036854775807)
131; CHECK-SAME:       Exits: (-1 + %arg)      LoopDispositions: { %bb27: Computable, %bb13: Variant, %bb8: Variant }
132
133; CHECK:      %tmp38 = phi i64 [ %tmp24, %bb23 ], [ %tmp24, %bb27 ]
134; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb13> U: [1,9223372036854775807) S: [1,9223372036854775807)
135; CHECK-SAME:      Exits: (-2 + %arg)       LoopDispositions: { %bb13: Computable, %bb8: Variant, %bb17_a: Invariant, %bb27: Invariant }
136
137define void @test3(i64 %arg, ptr %arg1) {
138bb:
139  %tmp = icmp slt i64 0, %arg
140  br i1 %tmp, label %bb8, label %bb48
141
142bb8:                                              ; preds = %bb, %bb44
143  %tmp9 = phi i64 [ %tmp45, %bb44 ], [ 0, %bb ]
144  %tmp10 = add nsw i64 %arg, -1
145  %tmp11 = icmp slt i64 1, %tmp10
146  br i1 %tmp11, label %bb13, label %bb44
147
148bb13:                                             ; preds = %bb8, %bb39
149  %tmp14 = phi i64 [ %tmp40, %bb39 ], [ 1, %bb8 ]
150  %tmp15 = icmp slt i64 0, %arg
151  br i1 %tmp15, label %bb17_a, label %bb23
152
153bb17_a:
154  %tmp18 = phi i64 [ %tmp20, %bb17 ], [ 0, %bb13 ]
155  %tmp20 = add nuw nsw i64 %tmp18, 1
156
157  br label %bb17
158
159bb17:                                             ; preds = %bb13, %bb17
160  %tmp21 = icmp slt i64 %tmp20, %arg
161  br i1 %tmp21, label %bb17_a, label %bb23
162
163bb23:                                             ; preds = %bb17, %bb13
164  %tmp24 = phi i64 [ %tmp14, %bb13 ], [ %tmp14, %bb17 ]
165  %tmp25 = icmp slt i64 0, %arg
166  br i1 %tmp25, label %bb27, label %bb39
167
168bb27:                                             ; preds = %bb23, %bb27
169  %tmp28 = phi i64 [ %tmp34, %bb27 ], [ 0, %bb23 ]
170  %tmp29 = mul nsw i64 %tmp9, %arg
171  %tmp30 = getelementptr inbounds i32, ptr %arg1, i64 %tmp24
172  %tmp31 = getelementptr inbounds i32, ptr %tmp30, i64 %tmp29
173  %tmp32 = load i32, ptr %tmp31, align 4
174  %tmp34 = add nuw nsw i64 %tmp28, 1
175  %tmp35 = icmp slt i64 %tmp34, %arg
176  br i1 %tmp35, label %bb27, label %bb39
177
178bb39:                                             ; preds = %bb23, %bb27
179  %tmp38 = phi i64 [ %tmp24, %bb23 ], [ %tmp24, %bb27 ]
180  %tmp40 = add nuw nsw i64 %tmp38, 1
181  %tmp41 = icmp slt i64 %tmp40, %tmp10
182  br i1 %tmp41, label %bb13, label %bb44
183
184bb44:                                             ; preds = %bb8, %bb39
185  %tmp45 = add nuw nsw i64 %tmp9, 1
186  %tmp46 = icmp slt i64 %tmp45, %arg
187  br i1 %tmp46, label %bb8, label %bb48
188
189bb48:                                             ; preds = %bb44, %bb
190  ret void
191}
192