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