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