brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.6 KiB · f19e199 Raw
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