1 ; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s
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)
7 define i64 @test1(i32 signext %n, ptr %A) {
9 %0 = sext i32 %n to i64
12 do.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
20 do.end: ; preds = %do.body
21 %add.lcssa.wide = phi i64 [ %indvars.iv.next, %do.body ]
22 ret i64 %add.lcssa.wide
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)
29 define void @test2(i64 %arg, ptr noalias %arg1) {
31 %tmp = icmp slt i64 0, %arg
32 br i1 %tmp, label %bb7, label %bb48
37 bb8: ; 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
46 bb13: ; 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
54 bb17: ; preds = %bb19, %bb16
55 %tmp18 = phi i64 [ 0, %bb16 ], [ %tmp20, %bb19 ]
59 %tmp20 = add nuw nsw i64 %tmp18, 1
60 %tmp21 = icmp slt i64 %tmp20, %arg
61 br i1 %tmp21, label %bb17, label %bb22
66 bb23: ; 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
74 bb27: ; 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
83 %tmp34 = add nuw nsw i64 %tmp28, 1
84 %tmp35 = icmp slt i64 %tmp34, %arg
85 br i1 %tmp35, label %bb27, label %bb36
90 bb37: ; preds = %bb36, %bb23
91 %tmp38 = phi i64 [ %tmp24, %bb36 ], [ %tmp24, %bb23 ]
95 %tmp40 = add nuw nsw i64 %tmp38, 1
96 %tmp41 = icmp slt i64 %tmp40, %tmp10
97 br i1 %tmp41, label %bb13, label %bb42
102 bb43: ; preds = %bb42, %bb8
105 bb44: ; 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
110 bb47: ; preds = %bb44
113 bb48: ; preds = %bb47, %bb
117 ; CHECK-LABEL: @test3
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 }
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 }
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 }
137 define void @test3(i64 %arg, ptr %arg1) {
139 %tmp = icmp slt i64 0, %arg
140 br i1 %tmp, label %bb8, label %bb48
142 bb8: ; 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
148 bb13: ; 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
154 %tmp18 = phi i64 [ %tmp20, %bb17 ], [ 0, %bb13 ]
155 %tmp20 = add nuw nsw i64 %tmp18, 1
159 bb17: ; preds = %bb13, %bb17
160 %tmp21 = icmp slt i64 %tmp20, %arg
161 br i1 %tmp21, label %bb17_a, label %bb23
163 bb23: ; 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
168 bb27: ; 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
178 bb39: ; 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
184 bb44: ; 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
189 bb48: ; preds = %bb44, %bb