339 lines · plain
1; RUN: opt < %s -passes=bounds-checking -S | FileCheck %s2target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"3 4; CHECK-LABEL: @sumSize5define dso_local i32 @sumSize(i32 %n) {6entry:7 %foo = alloca [1000 x i32], align 168 call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %foo)9 call void @fill(ptr nonnull %foo, i32 %n)10 br label %for.body.i11 12for.body.i: ; preds = %for.body.i, %entry13 %indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.body.i ]14 %sum.07.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]15 %arrayidx.i = getelementptr inbounds [1000 x i32], ptr %foo, i64 0, i64 %indvars.iv.i16; CHECK-NOT: trap17 %0 = load i32, ptr %arrayidx.i, align 418 %add.i = add nsw i32 %0, %sum.07.i19 %indvars.iv.next.i = add nuw nsw i64 %indvars.iv.i, 120 %exitcond.i = icmp eq i64 %indvars.iv.next.i, 100021 br i1 %exitcond.i, label %accumulate.exit, label %for.body.i22 23accumulate.exit: ; preds = %for.body.i24 call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %foo)25 ret i32 %add.i26}27 28declare void @llvm.lifetime.start.p0(i64, ptr nocapture)29 30declare dso_local void @fill(ptr, i32)31 32declare void @llvm.lifetime.end.p0(i64, ptr nocapture)33 34; CHECK-LABEL: @sumSizePlusOne35define dso_local i32 @sumSizePlusOne(i32 %n) {36entry:37 %foo = alloca [1000 x i32], align 1638 call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %foo)39 call void @fill(ptr nonnull %foo, i32 %n)40 br label %for.body.i41 42for.body.i: ; preds = %for.body.i, %entry43 %indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.body.i ]44 %sum.01.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]45 %arrayidx.i = getelementptr inbounds [1000 x i32], ptr %foo, i64 0, i64 %indvars.iv.i46; CHECK: mul i64 {{.*}}, 447; CHECK: sub i64 4000, %48; CHECK-NEXT: icmp ult i64 {{.*}}, 449; CHECK-NEXT: or i150; CHECK: trap51 %0 = load i32, ptr %arrayidx.i, align 452 %add.i = add nsw i32 %0, %sum.01.i53 %indvars.iv.next.i = add nuw nsw i64 %indvars.iv.i, 154 %exitcond.i = icmp eq i64 %indvars.iv.next.i, 100155 br i1 %exitcond.i, label %accumulate.exit, label %for.body.i56 57accumulate.exit: ; preds = %for.body.i58 call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %foo)59 ret i32 %add.i60}61 62; CHECK-LABEL: @sumLarger63define dso_local i32 @sumLarger(i32 %n) {64entry:65 %foo = alloca [1000 x i32], align 1666 call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %foo)67 call void @fill(ptr nonnull %foo, i32 %n)68 br label %for.body.i69 70for.body.i: ; preds = %for.body.i, %entry71 %indvars.iv.i = phi i64 [ 0, %entry ], [ %indvars.iv.next.i, %for.body.i ]72 %sum.07.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]73 %arrayidx.i = getelementptr inbounds [1000 x i32], ptr %foo, i64 0, i64 %indvars.iv.i74; CHECK: mul i64 {{.*}}, 475; CHECK: sub i64 4000, %76; CHECK-NEXT: icmp ult i64 4000, %77; CHECK-NEXT: icmp ult i64 {{.*}}, 478; CHECK-NEXT: or i179; CHECK: trap80 %0 = load i32, ptr %arrayidx.i, align 481 %add.i = add nsw i32 %0, %sum.07.i82 %indvars.iv.next.i = add nuw nsw i64 %indvars.iv.i, 183 %exitcond.i = icmp eq i64 %indvars.iv.next.i, 200084 br i1 %exitcond.i, label %accumulate.exit, label %for.body.i85 86accumulate.exit: ; preds = %for.body.i87 call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %foo)88 ret i32 %add.i89}90 91; CHECK-LABEL: @sumUnknown92define dso_local i32 @sumUnknown(i32 %n) {93entry:94 %foo = alloca [1000 x i32], align 1695 call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %foo)96 call void @fill(ptr nonnull %foo, i32 %n)97 %cmp6.i = icmp eq i32 %n, 098 br i1 %cmp6.i, label %accumulate.exit, label %for.body.preheader.i99 100for.body.preheader.i: ; preds = %entry101 %wide.trip.count.i = zext i32 %n to i64102 br label %for.body.i103 104for.body.i: ; preds = %for.body.i, %for.body.preheader.i105 %indvars.iv.i = phi i64 [ 0, %for.body.preheader.i ], [ %indvars.iv.next.i, %for.body.i ]106 %sum.07.i = phi i32 [ 0, %for.body.preheader.i ], [ %add.i, %for.body.i ]107 %arrayidx.i = getelementptr inbounds [1000 x i32], ptr %foo, i64 0, i64 %indvars.iv.i108; CHECK: mul i64 {{.*}}, 4109; CHECK: sub i64 4000, %110; CHECK-NEXT: icmp ult i64 4000, %111; CHECK-NEXT: icmp ult i64 {{.*}}, 4112; CHECK-NEXT: or i1113; CHECK: trap114 %0 = load i32, ptr %arrayidx.i, align 4115 %add.i = add nsw i32 %0, %sum.07.i116 %indvars.iv.next.i = add nuw nsw i64 %indvars.iv.i, 1117 %exitcond.i = icmp eq i64 %indvars.iv.next.i, %wide.trip.count.i118 br i1 %exitcond.i, label %accumulate.exit, label %for.body.i119 120accumulate.exit: ; preds = %for.body.i, %entry121 %sum.0.lcssa.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]122 call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %foo)123 ret i32 %sum.0.lcssa.i124}125 126; CHECK-LABEL: @twoDimSize127define dso_local i32 @twoDimSize(i32 %n) {128entry:129 %foo = alloca [2 x [2 x i32]], align 16130 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %foo)131 call void @fill(ptr nonnull %foo, i32 %n)132 br label %for.cond1.preheader133 134for.cond1.preheader: ; preds = %for.cond.cleanup3, %entry135 %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.cond.cleanup3 ]136 %sum.021 = phi i32 [ 0, %entry ], [ %add, %for.cond.cleanup3 ]137 br label %for.body4138 139for.cond.cleanup: ; preds = %for.cond.cleanup3140 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %foo)141 ret i32 %add142 143for.cond.cleanup3: ; preds = %for.body4144 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1145 %exitcond25 = icmp eq i64 %indvars.iv.next24, 2146 br i1 %exitcond25, label %for.cond.cleanup, label %for.cond1.preheader147 148for.body4: ; preds = %for.body4, %for.cond1.preheader149 %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body4 ]150 %sum.119 = phi i32 [ %sum.021, %for.cond1.preheader ], [ %add, %for.body4 ]151 %arrayidx7 = getelementptr inbounds [2 x [2 x i32]], ptr %foo, i64 0, i64 %indvars.iv23, i64 %indvars.iv152; CHECK-NOT: trap153 %0 = load i32, ptr %arrayidx7, align 4154 %add = add nsw i32 %0, %sum.119155 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1156 %exitcond = icmp eq i64 %indvars.iv.next, 2157 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4158}159 160; CHECK-LABEL: @twoDimLarger1161define dso_local i32 @twoDimLarger1(i32 %n) {162entry:163 %foo = alloca [2 x [2 x i32]], align 16164 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %foo)165 call void @fill(ptr nonnull %foo, i32 %n)166 br label %for.cond1.preheader167 168for.cond1.preheader: ; preds = %for.cond.cleanup3, %entry169 %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.cond.cleanup3 ]170 %sum.021 = phi i32 [ 0, %entry ], [ %add, %for.cond.cleanup3 ]171 br label %for.body4172 173for.cond.cleanup: ; preds = %for.cond.cleanup3174 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %foo)175 ret i32 %add176 177for.cond.cleanup3: ; preds = %for.body4178 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1179 %exitcond25 = icmp eq i64 %indvars.iv.next24, 3180 br i1 %exitcond25, label %for.cond.cleanup, label %for.cond1.preheader181 182for.body4: ; preds = %for.body4, %for.cond1.preheader183 %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body4 ]184 %sum.119 = phi i32 [ %sum.021, %for.cond1.preheader ], [ %add, %for.body4 ]185 %arrayidx7 = getelementptr inbounds [2 x [2 x i32]], ptr %foo, i64 0, i64 %indvars.iv23, i64 %indvars.iv186; CHECK: mul i64 {{.*}}, 8187; CHECK: mul i64 {{.*}}, 4188; CHECK: add i64189; CHECK: sub i64 16, %190; CHECK-NEXT: icmp ult i64 16, %191; CHECK-NEXT: icmp ult i64 {{.*}}, 4192; CHECK-NEXT: or i1193; CHECK: trap194 %0 = load i32, ptr %arrayidx7, align 4195 %add = add nsw i32 %0, %sum.119196 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1197 %exitcond = icmp eq i64 %indvars.iv.next, 2198 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4199}200 201; CHECK-LABEL: @twoDimLarger2202define dso_local i32 @twoDimLarger2(i32 %n) {203entry:204 %foo = alloca [2 x [2 x i32]], align 16205 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %foo)206 call void @fill(ptr nonnull %foo, i32 %n)207 br label %for.cond1.preheader208 209for.cond1.preheader: ; preds = %for.cond.cleanup3, %entry210 %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.cond.cleanup3 ]211 %sum.021 = phi i32 [ 0, %entry ], [ %add, %for.cond.cleanup3 ]212 br label %for.body4213 214for.cond.cleanup: ; preds = %for.cond.cleanup3215 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %foo)216 ret i32 %add217 218for.cond.cleanup3: ; preds = %for.body4219 %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1220 %exitcond25 = icmp eq i64 %indvars.iv.next24, 2221 br i1 %exitcond25, label %for.cond.cleanup, label %for.cond1.preheader222 223for.body4: ; preds = %for.body4, %for.cond1.preheader224 %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body4 ]225 %sum.119 = phi i32 [ %sum.021, %for.cond1.preheader ], [ %add, %for.body4 ]226 %arrayidx7 = getelementptr inbounds [2 x [2 x i32]], ptr %foo, i64 0, i64 %indvars.iv23, i64 %indvars.iv227; CHECK: mul i64 {{.*}}, 8228; CHECK: mul i64 {{.*}}, 4229; CHECK: add i64230; CHECK: sub i64 16, %231; CHECK-NEXT: icmp ult i64 {{.*}}, 4232; CHECK-NEXT: or i1233; CHECK: trap234 %0 = load i32, ptr %arrayidx7, align 4235 %add = add nsw i32 %0, %sum.119236 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1237 %exitcond = icmp eq i64 %indvars.iv.next, 3238 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4239}240 241; CHECK-LABEL: @twoDimUnknown242define dso_local i32 @twoDimUnknown(i32 %n) {243entry:244 %foo = alloca [2 x [2 x i32]], align 16245 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %foo)246 call void @fill(ptr nonnull %foo, i32 %n)247 %cmp24 = icmp eq i32 %n, 0248 br i1 %cmp24, label %for.cond.cleanup, label %for.cond1.preheader.lr.ph249 250for.cond1.preheader.lr.ph: ; preds = %entry251 %wide.trip.count = zext i32 %n to i64252 %wide.trip.count.le = zext i32 %n to i64253 br label %for.body4.lr.ph254 255for.body4.lr.ph: ; preds = %for.cond1.preheader.lr.ph, %for.cond.cleanup3256 %indvars.iv28 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next29, %for.cond.cleanup3 ]257 %sum.025 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %add, %for.cond.cleanup3 ]258 br label %for.body4259 260for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry261 %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.cond.cleanup3 ]262 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %foo)263 ret i32 %sum.0.lcssa264 265for.cond.cleanup3: ; preds = %for.body4266 %indvars.iv.next29 = add nuw nsw i64 %indvars.iv28, 1267 %exitcond31 = icmp eq i64 %indvars.iv.next29, %wide.trip.count.le268 br i1 %exitcond31, label %for.cond.cleanup, label %for.body4.lr.ph269 270for.body4: ; preds = %for.body4, %for.body4.lr.ph271 %indvars.iv = phi i64 [ 0, %for.body4.lr.ph ], [ %indvars.iv.next, %for.body4 ]272 %sum.122 = phi i32 [ %sum.025, %for.body4.lr.ph ], [ %add, %for.body4 ]273 %arrayidx7 = getelementptr inbounds [2 x [2 x i32]], ptr %foo, i64 0, i64 %indvars.iv28, i64 %indvars.iv274; CHECK: mul i64 {{.*}}, 8275; CHECK: mul i64 {{.*}}, 4276; CHECK: add i64277; CHECK: sub i64 16, %278; CHECK-NEXT: icmp ult i64 16, %279; CHECK-NEXT: icmp ult i64 {{.*}}, 4280; CHECK-NEXT: or i1281; CHECK: trap282 %0 = load i32, ptr %arrayidx7, align 4283 %add = add nsw i32 %0, %sum.122284 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1285 %exitcond = icmp eq i64 %indvars.iv.next, %wide.trip.count286 br i1 %exitcond, label %for.cond.cleanup3, label %for.body4287}288 289; CHECK-LABEL: @countDownGood290define dso_local i32 @countDownGood(i32 %n) {291entry:292 %foo = alloca [1000 x i32], align 16293 call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %foo)294 call void @fill(ptr nonnull %foo, i32 %n)295 br label %for.body296 297for.cond.cleanup: ; preds = %for.body298 call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %foo)299 ret i32 %add300 301for.body: ; preds = %for.body, %entry302 %indvars.iv = phi i64 [ 999, %entry ], [ %indvars.iv.next, %for.body ]303 %sum.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]304 %arrayidx = getelementptr inbounds [1000 x i32], ptr %foo, i64 0, i64 %indvars.iv305; CHECK-NOT: trap306 %0 = load i32, ptr %arrayidx, align 4307 %add = add nsw i32 %0, %sum.06308 %indvars.iv.next = add nsw i64 %indvars.iv, -1309 %cmp = icmp eq i64 %indvars.iv, 0310 br i1 %cmp, label %for.cond.cleanup, label %for.body311}312 313; CHECK-LABEL: @countDownBad314define dso_local i32 @countDownBad(i32 %n) {315entry:316 %foo = alloca [1000 x i32], align 16317 call void @llvm.lifetime.start.p0(i64 4000, ptr nonnull %foo)318 call void @fill(ptr nonnull %foo, i32 %n)319 br label %for.body320 321for.cond.cleanup: ; preds = %for.body322 call void @llvm.lifetime.end.p0(i64 4000, ptr nonnull %foo)323 ret i32 %add324 325for.body: ; preds = %entry, %for.body326 %indvars.iv = phi i64 [ 999, %entry ], [ %indvars.iv.next, %for.body ]327 %sum.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]328 %arrayidx = getelementptr inbounds [1000 x i32], ptr %foo, i64 0, i64 %indvars.iv329; CHECK: mul i64 {{.*}}, 4330; CHECK: sub i64 4000, %331; CHECK-NEXT: icmp ult i64 4000, %332; CHECK: trap333 %0 = load i32, ptr %arrayidx, align 4334 %add = add nsw i32 %0, %sum.06335 %indvars.iv.next = add nsw i64 %indvars.iv, -1336 %cmp = icmp sgt i64 %indvars.iv, -1337 br i1 %cmp, label %for.body, label %for.cond.cleanup338}339