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