349 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \3; RUN: | FileCheck %s4 5; ModuleID = 'WeakZeroSrcSIV.bc'6target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"7target triple = "x86_64-apple-macosx10.6.0"8 9 10;; for (int i = 0; i < N; i++) {11;; A[0] = 1;12;; A[i] = 2;13 14define void @dstzero(ptr nocapture %A, i32 %N) {15; CHECK-LABEL: 'dstzero'16; CHECK-NEXT: Src: store i32 0, ptr %A, align 4 --> Dst: store i32 0, ptr %A, align 417; CHECK-NEXT: da analyze - consistent output [S]!18; CHECK-NEXT: Src: store i32 0, ptr %A, align 4 --> Dst: store i32 1, ptr %arrayidx1, align 419; CHECK-NEXT: da analyze - output [p=>|<]!20; CHECK-NEXT: Src: store i32 1, ptr %arrayidx1, align 4 --> Dst: store i32 1, ptr %arrayidx1, align 421; CHECK-NEXT: da analyze - none!22;23entry:24 %cmp6 = icmp sgt i32 %N, 025 br i1 %cmp6, label %for.body, label %for.cond.cleanup26 27for.body: ; preds = %entry, %for.body28 %i.07 = phi i32 [ %add, %for.body ], [ 0, %entry ]29 store i32 0, ptr %A, align 430 %arrayidx1 = getelementptr inbounds i32, ptr %A, i32 %i.0731 store i32 1, ptr %arrayidx1, align 432 %add = add nuw nsw i32 %i.07, 133 %exitcond = icmp eq i32 %add, %N34 br i1 %exitcond, label %for.cond.cleanup, label %for.body35 36for.cond.cleanup: ; preds = %for.body, %entry37 ret void38}39 40 41;; for (long unsigned i = 0; i < 30; i++) {42;; A[10] = i;43;; *B++ = A[2*i + 10];44 45define void @weakzerosrc0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {46; CHECK-LABEL: 'weakzerosrc0'47; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 448; CHECK-NEXT: da analyze - consistent output [S]!49; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 450; CHECK-NEXT: da analyze - flow [p=>|<]!51; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 452; CHECK-NEXT: da analyze - confused!53; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 454; CHECK-NEXT: da analyze - none!55; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 456; CHECK-NEXT: da analyze - confused!57; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 458; CHECK-NEXT: da analyze - none!59;60entry:61 br label %for.body62 63for.body: ; preds = %entry, %for.body64 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]65 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]66 %conv = trunc i64 %i.02 to i3267 %arrayidx = getelementptr inbounds i32, ptr %A, i64 1068 store i32 %conv, ptr %arrayidx, align 469 %mul = shl i64 %i.02, 170 %add = add i64 %mul, 1071 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add72 %0 = load i32, ptr %arrayidx1, align 473 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 174 store i32 %0, ptr %B.addr.01, align 475 %inc = add i64 %i.02, 176 %exitcond = icmp ne i64 %inc, 3077 br i1 %exitcond, label %for.body, label %for.end78 79for.end: ; preds = %for.body80 ret void81}82 83 84;; for (long unsigned i = 0; i < n; i++) {85;; A[10] = i;86;; *B++ = A[n*i + 10];87 88define void @weakzerosrc1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {89; CHECK-LABEL: 'weakzerosrc1'90; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 491; CHECK-NEXT: da analyze - consistent output [S]!92; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 493; CHECK-NEXT: da analyze - flow [p=>|<]!94; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 495; CHECK-NEXT: da analyze - confused!96; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 497; CHECK-NEXT: da analyze - none!98; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 499; CHECK-NEXT: da analyze - confused!100; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4101; CHECK-NEXT: da analyze - none!102;103entry:104 %cmp1 = icmp eq i64 %n, 0105 br i1 %cmp1, label %for.end, label %for.body.preheader106 107for.body.preheader: ; preds = %entry108 br label %for.body109 110for.body: ; preds = %for.body.preheader, %for.body111 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]112 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]113 %conv = trunc i64 %i.03 to i32114 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10115 store i32 %conv, ptr %arrayidx, align 4116 %mul = mul i64 %i.03, %n117 %add = add i64 %mul, 10118 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %add119 %0 = load i32, ptr %arrayidx1, align 4120 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1121 store i32 %0, ptr %B.addr.02, align 4122 %inc = add i64 %i.03, 1123 %exitcond = icmp ne i64 %inc, %n124 br i1 %exitcond, label %for.body, label %for.end.loopexit125 126for.end.loopexit: ; preds = %for.body127 br label %for.end128 129for.end: ; preds = %for.end.loopexit, %entry130 ret void131}132 133 134;; for (long unsigned i = 0; i < 5; i++) {135;; A[10] = i;136;; *B++ = A[2*i];137 138define void @weakzerosrc2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {139; CHECK-LABEL: 'weakzerosrc2'140; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4141; CHECK-NEXT: da analyze - consistent output [S]!142; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4143; CHECK-NEXT: da analyze - none!144; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4145; CHECK-NEXT: da analyze - confused!146; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4147; CHECK-NEXT: da analyze - none!148; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4149; CHECK-NEXT: da analyze - confused!150; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4151; CHECK-NEXT: da analyze - none!152;153entry:154 br label %for.body155 156for.body: ; preds = %entry, %for.body157 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]158 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]159 %conv = trunc i64 %i.02 to i32160 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10161 store i32 %conv, ptr %arrayidx, align 4162 %mul = shl i64 %i.02, 1163 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul164 %0 = load i32, ptr %arrayidx1, align 4165 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1166 store i32 %0, ptr %B.addr.01, align 4167 %inc = add i64 %i.02, 1168 %exitcond = icmp ne i64 %inc, 5169 br i1 %exitcond, label %for.body, label %for.end170 171for.end: ; preds = %for.body172 ret void173}174 175 176;; for (long unsigned i = 0; i < 6; i++) {177;; A[10] = i;178;; *B++ = A[2*i];179 180define void @weakzerosrc3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {181; CHECK-LABEL: 'weakzerosrc3'182; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4183; CHECK-NEXT: da analyze - consistent output [S]!184; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4185; CHECK-NEXT: da analyze - flow [<=p|<]!186; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4187; CHECK-NEXT: da analyze - confused!188; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4189; CHECK-NEXT: da analyze - none!190; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4191; CHECK-NEXT: da analyze - confused!192; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4193; CHECK-NEXT: da analyze - none!194;195entry:196 br label %for.body197 198for.body: ; preds = %entry, %for.body199 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]200 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]201 %conv = trunc i64 %i.02 to i32202 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10203 store i32 %conv, ptr %arrayidx, align 4204 %mul = shl i64 %i.02, 1205 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul206 %0 = load i32, ptr %arrayidx1, align 4207 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1208 store i32 %0, ptr %B.addr.01, align 4209 %inc = add i64 %i.02, 1210 %exitcond = icmp ne i64 %inc, 6211 br i1 %exitcond, label %for.body, label %for.end212 213for.end: ; preds = %for.body214 ret void215}216 217 218;; for (long unsigned i = 0; i < 7; i++) {219;; A[10] = i;220;; *B++ = A[2*i];221 222define void @weakzerosrc4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {223; CHECK-LABEL: 'weakzerosrc4'224; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4225; CHECK-NEXT: da analyze - consistent output [S]!226; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4227; CHECK-NEXT: da analyze - flow [*|<]!228; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4229; CHECK-NEXT: da analyze - confused!230; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4231; CHECK-NEXT: da analyze - none!232; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4233; CHECK-NEXT: da analyze - confused!234; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4235; CHECK-NEXT: da analyze - none!236;237entry:238 br label %for.body239 240for.body: ; preds = %entry, %for.body241 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]242 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]243 %conv = trunc i64 %i.02 to i32244 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10245 store i32 %conv, ptr %arrayidx, align 4246 %mul = shl i64 %i.02, 1247 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul248 %0 = load i32, ptr %arrayidx1, align 4249 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1250 store i32 %0, ptr %B.addr.01, align 4251 %inc = add i64 %i.02, 1252 %exitcond = icmp ne i64 %inc, 7253 br i1 %exitcond, label %for.body, label %for.end254 255for.end: ; preds = %for.body256 ret void257}258 259 260;; for (long unsigned i = 0; i < 7; i++) {261;; A[-10] = i;262;; *B++ = A[2*i];263 264define void @weakzerosrc5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {265; CHECK-LABEL: 'weakzerosrc5'266; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4267; CHECK-NEXT: da analyze - consistent output [S]!268; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4269; CHECK-NEXT: da analyze - none!270; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4271; CHECK-NEXT: da analyze - confused!272; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4273; CHECK-NEXT: da analyze - none!274; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4275; CHECK-NEXT: da analyze - confused!276; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4277; CHECK-NEXT: da analyze - none!278;279entry:280 br label %for.body281 282for.body: ; preds = %entry, %for.body283 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]284 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]285 %conv = trunc i64 %i.02 to i32286 %arrayidx = getelementptr inbounds i32, ptr %A, i64 -10287 store i32 %conv, ptr %arrayidx, align 4288 %mul = shl i64 %i.02, 1289 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul290 %0 = load i32, ptr %arrayidx1, align 4291 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1292 store i32 %0, ptr %B.addr.01, align 4293 %inc = add i64 %i.02, 1294 %exitcond = icmp ne i64 %inc, 7295 br i1 %exitcond, label %for.body, label %for.end296 297for.end: ; preds = %for.body298 ret void299}300 301 302;; for (long unsigned i = 0; i < n; i++) {303;; A[10] = i;304;; *B++ = A[3*i];305 306define void @weakzerosrc6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {307; CHECK-LABEL: 'weakzerosrc6'308; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4309; CHECK-NEXT: da analyze - consistent output [S]!310; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4311; CHECK-NEXT: da analyze - none!312; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4313; CHECK-NEXT: da analyze - confused!314; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4315; CHECK-NEXT: da analyze - none!316; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4317; CHECK-NEXT: da analyze - confused!318; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4319; CHECK-NEXT: da analyze - none!320;321entry:322 %cmp1 = icmp eq i64 %n, 0323 br i1 %cmp1, label %for.end, label %for.body.preheader324 325for.body.preheader: ; preds = %entry326 br label %for.body327 328for.body: ; preds = %for.body.preheader, %for.body329 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]330 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]331 %conv = trunc i64 %i.03 to i32332 %arrayidx = getelementptr inbounds i32, ptr %A, i64 10333 store i32 %conv, ptr %arrayidx, align 4334 %mul = mul i64 %i.03, 3335 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %mul336 %0 = load i32, ptr %arrayidx1, align 4337 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1338 store i32 %0, ptr %B.addr.02, align 4339 %inc = add i64 %i.03, 1340 %exitcond = icmp ne i64 %inc, %n341 br i1 %exitcond, label %for.body, label %for.end.loopexit342 343for.end.loopexit: ; preds = %for.body344 br label %for.end345 346for.end: ; preds = %for.end.loopexit, %entry347 ret void348}349