351 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 = 'WeakZeroDstSIV.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[i] = 1;12;; A[0] = 2;13 14define void @dstzero(ptr nocapture %A, i32 %N) {15; CHECK-LABEL: 'dstzero'16; CHECK-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 0, ptr %arrayidx, align 417; CHECK-NEXT: da analyze - none!18; CHECK-NEXT: Src: store i32 0, ptr %arrayidx, align 4 --> Dst: store i32 1, ptr %A, align 419; CHECK-NEXT: da analyze - output [p<=|<]!20; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 421; CHECK-NEXT: da analyze - consistent output [S]!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 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.0730 store i32 0, ptr %arrayidx, align 431 store i32 1, ptr %A, 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 42 43;; for (long unsigned i = 0; i < 30; i++) {44;; A[2*i + 10] = i;45;; *B++ = A[10];46 47define void @weakzerodst0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {48; CHECK-LABEL: 'weakzerodst0'49; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 450; CHECK-NEXT: da analyze - none!51; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 452; CHECK-NEXT: da analyze - flow [p<=|<]!53; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 454; CHECK-NEXT: da analyze - confused!55; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 456; CHECK-NEXT: da analyze - consistent input [S]!57; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 458; CHECK-NEXT: da analyze - confused!59; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 460; CHECK-NEXT: da analyze - none!61;62entry:63 br label %for.body64 65for.body: ; preds = %entry, %for.body66 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]67 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]68 %conv = trunc i64 %i.02 to i3269 %mul = shl i64 %i.02, 170 %add = add i64 %mul, 1071 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add72 store i32 %conv, ptr %arrayidx, align 473 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 1074 %0 = load i32, ptr %arrayidx1, align 475 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 176 store i32 %0, ptr %B.addr.01, align 477 %inc = add i64 %i.02, 178 %exitcond = icmp ne i64 %inc, 3079 br i1 %exitcond, label %for.body, label %for.end80 81for.end: ; preds = %for.body82 ret void83}84 85 86;; for (long unsigned i = 0; i < n; i++) {87;; A[n*i + 10] = i;88;; *B++ = A[10];89 90define void @weakzerodst1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {91; CHECK-LABEL: 'weakzerodst1'92; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 493; CHECK-NEXT: da analyze - none!94; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 495; CHECK-NEXT: da analyze - flow [p<=|<]!96; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 497; CHECK-NEXT: da analyze - confused!98; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 499; CHECK-NEXT: da analyze - consistent input [S]!100; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4101; CHECK-NEXT: da analyze - confused!102; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4103; CHECK-NEXT: da analyze - none!104;105entry:106 %cmp1 = icmp eq i64 %n, 0107 br i1 %cmp1, label %for.end, label %for.body.preheader108 109for.body.preheader: ; preds = %entry110 br label %for.body111 112for.body: ; preds = %for.body.preheader, %for.body113 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]114 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]115 %conv = trunc i64 %i.03 to i32116 %mul = mul i64 %i.03, %n117 %add = add i64 %mul, 10118 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add119 store i32 %conv, ptr %arrayidx, align 4120 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 10121 %0 = load i32, ptr %arrayidx1, align 4122 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1123 store i32 %0, ptr %B.addr.02, align 4124 %inc = add i64 %i.03, 1125 %exitcond = icmp ne i64 %inc, %n126 br i1 %exitcond, label %for.body, label %for.end.loopexit127 128for.end.loopexit: ; preds = %for.body129 br label %for.end130 131for.end: ; preds = %for.end.loopexit, %entry132 ret void133}134 135 136;; for (long unsigned i = 0; i < 5; i++) {137;; A[2*i] = i;138;; *B++ = A[10];139 140define void @weakzerodst2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {141; CHECK-LABEL: 'weakzerodst2'142; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4143; CHECK-NEXT: da analyze - none!144; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4145; CHECK-NEXT: da analyze - none!146; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4147; CHECK-NEXT: da analyze - confused!148; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4149; CHECK-NEXT: da analyze - consistent input [S]!150; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4151; CHECK-NEXT: da analyze - confused!152; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4153; CHECK-NEXT: da analyze - none!154;155entry:156 br label %for.body157 158for.body: ; preds = %entry, %for.body159 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]160 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]161 %conv = trunc i64 %i.02 to i32162 %mul = shl i64 %i.02, 1163 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul164 store i32 %conv, ptr %arrayidx, align 4165 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 10166 %0 = load i32, ptr %arrayidx1, align 4167 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1168 store i32 %0, ptr %B.addr.01, align 4169 %inc = add i64 %i.02, 1170 %exitcond = icmp ne i64 %inc, 5171 br i1 %exitcond, label %for.body, label %for.end172 173for.end: ; preds = %for.body174 ret void175}176 177 178;; for (long unsigned i = 0; i < 6; i++) {179;; A[2*i] = i;180;; *B++ = A[10];181 182define void @weakzerodst3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {183; CHECK-LABEL: 'weakzerodst3'184; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4185; CHECK-NEXT: da analyze - none!186; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4187; CHECK-NEXT: da analyze - flow [=>p|<]!188; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4189; CHECK-NEXT: da analyze - confused!190; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4191; CHECK-NEXT: da analyze - consistent input [S]!192; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4193; CHECK-NEXT: da analyze - confused!194; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4195; CHECK-NEXT: da analyze - none!196;197entry:198 br label %for.body199 200for.body: ; preds = %entry, %for.body201 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]202 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]203 %conv = trunc i64 %i.02 to i32204 %mul = shl i64 %i.02, 1205 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul206 store i32 %conv, ptr %arrayidx, align 4207 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 10208 %0 = load i32, ptr %arrayidx1, align 4209 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1210 store i32 %0, ptr %B.addr.01, align 4211 %inc = add i64 %i.02, 1212 %exitcond = icmp ne i64 %inc, 6213 br i1 %exitcond, label %for.body, label %for.end214 215for.end: ; preds = %for.body216 ret void217}218 219 220;; for (long unsigned i = 0; i < 7; i++) {221;; A[2*i] = i;222;; *B++ = A[10];223 224define void @weakzerodst4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {225; CHECK-LABEL: 'weakzerodst4'226; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4227; CHECK-NEXT: da analyze - none!228; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4229; CHECK-NEXT: da analyze - flow [*|<]!230; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4231; CHECK-NEXT: da analyze - confused!232; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4233; CHECK-NEXT: da analyze - consistent input [S]!234; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4235; CHECK-NEXT: da analyze - confused!236; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4237; CHECK-NEXT: da analyze - none!238;239entry:240 br label %for.body241 242for.body: ; preds = %entry, %for.body243 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]244 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]245 %conv = trunc i64 %i.02 to i32246 %mul = shl i64 %i.02, 1247 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul248 store i32 %conv, ptr %arrayidx, align 4249 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 10250 %0 = load i32, ptr %arrayidx1, align 4251 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1252 store i32 %0, ptr %B.addr.01, align 4253 %inc = add i64 %i.02, 1254 %exitcond = icmp ne i64 %inc, 7255 br i1 %exitcond, label %for.body, label %for.end256 257for.end: ; preds = %for.body258 ret void259}260 261 262;; for (long unsigned i = 0; i < 7; i++) {263;; A[2*i] = i;264;; *B++ = A[-10];265 266define void @weakzerodst5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {267; CHECK-LABEL: 'weakzerodst5'268; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4269; CHECK-NEXT: da analyze - none!270; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4271; CHECK-NEXT: da analyze - none!272; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4273; CHECK-NEXT: da analyze - confused!274; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4275; CHECK-NEXT: da analyze - consistent input [S]!276; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4277; CHECK-NEXT: da analyze - confused!278; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4279; CHECK-NEXT: da analyze - none!280;281entry:282 br label %for.body283 284for.body: ; preds = %entry, %for.body285 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]286 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]287 %conv = trunc i64 %i.02 to i32288 %mul = shl i64 %i.02, 1289 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul290 store i32 %conv, ptr %arrayidx, align 4291 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 -10292 %0 = load i32, ptr %arrayidx1, align 4293 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1294 store i32 %0, ptr %B.addr.01, align 4295 %inc = add i64 %i.02, 1296 %exitcond = icmp ne i64 %inc, 7297 br i1 %exitcond, label %for.body, label %for.end298 299for.end: ; preds = %for.body300 ret void301}302 303 304;; for (long unsigned i = 0; i < n; i++) {305;; A[3*i] = i;306;; *B++ = A[10];307 308define void @weakzerodst6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {309; CHECK-LABEL: 'weakzerodst6'310; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4311; CHECK-NEXT: da analyze - none!312; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4313; CHECK-NEXT: da analyze - none!314; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4315; CHECK-NEXT: da analyze - confused!316; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4317; CHECK-NEXT: da analyze - consistent input [S]!318; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4319; CHECK-NEXT: da analyze - confused!320; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4321; CHECK-NEXT: da analyze - none!322;323entry:324 %cmp1 = icmp eq i64 %n, 0325 br i1 %cmp1, label %for.end, label %for.body.preheader326 327for.body.preheader: ; preds = %entry328 br label %for.body329 330for.body: ; preds = %for.body.preheader, %for.body331 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]332 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]333 %conv = trunc i64 %i.03 to i32334 %mul = mul i64 %i.03, 3335 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul336 store i32 %conv, ptr %arrayidx, align 4337 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 10338 %0 = load i32, ptr %arrayidx1, align 4339 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1340 store i32 %0, ptr %B.addr.02, align 4341 %inc = add i64 %i.03, 1342 %exitcond = icmp ne i64 %inc, %n343 br i1 %exitcond, label %for.body, label %for.end.loopexit344 345for.end.loopexit: ; preds = %for.body346 br label %for.end347 348for.end: ; preds = %for.end.loopexit, %entry349 ret void350}351