330 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 = 'WeakCrossingSIV.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 (long unsigned i = 0; i < n; i++) {11;; A[1 + n*i] = i;12;; *B++ = A[1 - n*i];13 14define void @weakcrossing0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {15; CHECK-LABEL: 'weakcrossing0'16; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 417; CHECK-NEXT: da analyze - none!18; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 419; CHECK-NEXT: da analyze - flow [0|<]!20; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 421; CHECK-NEXT: da analyze - confused!22; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 423; CHECK-NEXT: da analyze - none!24; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 425; CHECK-NEXT: da analyze - confused!26; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 427; CHECK-NEXT: da analyze - none!28;29entry:30 %cmp1 = icmp eq i64 %n, 031 br i1 %cmp1, label %for.end, label %for.body.preheader32 33for.body.preheader: ; preds = %entry34 br label %for.body35 36for.body: ; preds = %for.body.preheader, %for.body37 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]38 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]39 %conv = trunc i64 %i.03 to i3240 %mul = mul i64 %i.03, %n41 %add = add i64 %mul, 142 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add43 store i32 %conv, ptr %arrayidx, align 444 %mul1 = mul i64 %i.03, %n45 %sub = sub i64 1, %mul146 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub47 %0 = load i32, ptr %arrayidx2, align 448 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 149 store i32 %0, ptr %B.addr.02, align 450 %inc = add i64 %i.03, 151 %exitcond = icmp ne i64 %inc, %n52 br i1 %exitcond, label %for.body, label %for.end.loopexit53 54for.end.loopexit: ; preds = %for.body55 br label %for.end56 57for.end: ; preds = %for.end.loopexit, %entry58 ret void59}60 61 62;; for (long unsigned i = 0; i < n; i++) {63;; A[n + i] = i;64;; *B++ = A[1 + n - i];65 66define void @weakcrossing1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {67; CHECK-LABEL: 'weakcrossing1'68; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 469; CHECK-NEXT: da analyze - none!70; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 471; CHECK-NEXT: da analyze - flow [<>]!72; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 473; CHECK-NEXT: da analyze - confused!74; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 475; CHECK-NEXT: da analyze - none!76; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 477; CHECK-NEXT: da analyze - confused!78; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 479; CHECK-NEXT: da analyze - none!80;81entry:82 %cmp1 = icmp eq i64 %n, 083 br i1 %cmp1, label %for.end, label %for.body.preheader84 85for.body.preheader: ; preds = %entry86 br label %for.body87 88for.body: ; preds = %for.body.preheader, %for.body89 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]90 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]91 %conv = trunc i64 %i.03 to i3292 %add = add i64 %i.03, %n93 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add94 store i32 %conv, ptr %arrayidx, align 495 %add1 = add i64 %n, 196 %sub = sub i64 %add1, %i.0397 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub98 %0 = load i32, ptr %arrayidx2, align 499 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1100 store i32 %0, ptr %B.addr.02, align 4101 %inc = add i64 %i.03, 1102 %exitcond = icmp ne i64 %inc, %n103 br i1 %exitcond, label %for.body, label %for.end.loopexit104 105for.end.loopexit: ; preds = %for.body106 br label %for.end107 108for.end: ; preds = %for.end.loopexit, %entry109 ret void110}111 112 113;; for (long unsigned i = 0; i < 3; i++) {114;; A[i] = i;115;; *B++ = A[6 - i];116 117define void @weakcrossing2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {118; CHECK-LABEL: 'weakcrossing2'119; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4120; CHECK-NEXT: da analyze - none!121; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4122; CHECK-NEXT: da analyze - none!123; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4124; CHECK-NEXT: da analyze - confused!125; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4126; CHECK-NEXT: da analyze - none!127; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4128; CHECK-NEXT: da analyze - confused!129; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4130; CHECK-NEXT: da analyze - none!131;132entry:133 br label %for.body134 135for.body: ; preds = %entry, %for.body136 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]137 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]138 %conv = trunc i64 %i.02 to i32139 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02140 store i32 %conv, ptr %arrayidx, align 4141 %sub = sub i64 6, %i.02142 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub143 %0 = load i32, ptr %arrayidx1, align 4144 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1145 store i32 %0, ptr %B.addr.01, align 4146 %inc = add i64 %i.02, 1147 %exitcond = icmp ne i64 %inc, 3148 br i1 %exitcond, label %for.body, label %for.end149 150for.end: ; preds = %for.body151 ret void152}153 154 155;; for (long unsigned i = 0; i < 4; i++) {156;; A[i] = i;157;; *B++ = A[6 - i];158 159define void @weakcrossing3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {160; CHECK-LABEL: 'weakcrossing3'161; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4162; CHECK-NEXT: da analyze - none!163; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4164; CHECK-NEXT: da analyze - flow [0|<]!165; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4166; CHECK-NEXT: da analyze - confused!167; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4168; CHECK-NEXT: da analyze - none!169; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4170; CHECK-NEXT: da analyze - confused!171; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4172; CHECK-NEXT: da analyze - none!173;174entry:175 br label %for.body176 177for.body: ; preds = %entry, %for.body178 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]179 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]180 %conv = trunc i64 %i.02 to i32181 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02182 store i32 %conv, ptr %arrayidx, align 4183 %sub = sub i64 6, %i.02184 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub185 %0 = load i32, ptr %arrayidx1, align 4186 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1187 store i32 %0, ptr %B.addr.01, align 4188 %inc = add i64 %i.02, 1189 %exitcond = icmp ne i64 %inc, 4190 br i1 %exitcond, label %for.body, label %for.end191 192for.end: ; preds = %for.body193 ret void194}195 196 197;; for (long unsigned i = 0; i < 10; i++) {198;; A[i] = i;199;; *B++ = A[-6 - i];200 201define void @weakcrossing4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {202; CHECK-LABEL: 'weakcrossing4'203; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4204; CHECK-NEXT: da analyze - none!205; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4206; CHECK-NEXT: da analyze - none!207; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4208; CHECK-NEXT: da analyze - confused!209; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4210; CHECK-NEXT: da analyze - none!211; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4212; CHECK-NEXT: da analyze - confused!213; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4214; CHECK-NEXT: da analyze - none!215;216entry:217 br label %for.body218 219for.body: ; preds = %entry, %for.body220 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]221 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]222 %conv = trunc i64 %i.02 to i32223 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02224 store i32 %conv, ptr %arrayidx, align 4225 %sub = sub i64 -6, %i.02226 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub227 %0 = load i32, ptr %arrayidx1, align 4228 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1229 store i32 %0, ptr %B.addr.01, align 4230 %inc = add i64 %i.02, 1231 %exitcond = icmp ne i64 %inc, 10232 br i1 %exitcond, label %for.body, label %for.end233 234for.end: ; preds = %for.body235 ret void236}237 238 239;; for (long unsigned i = 0; i < n; i++) {240;; A[3*i] = i;241;; *B++ = A[5 - 3*i];242 243define void @weakcrossing5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {244; CHECK-LABEL: 'weakcrossing5'245; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4246; CHECK-NEXT: da analyze - none!247; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4248; CHECK-NEXT: da analyze - none!249; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4250; CHECK-NEXT: da analyze - confused!251; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4252; CHECK-NEXT: da analyze - none!253; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4254; CHECK-NEXT: da analyze - confused!255; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4256; CHECK-NEXT: da analyze - none!257;258entry:259 %cmp1 = icmp eq i64 %n, 0260 br i1 %cmp1, label %for.end, label %for.body.preheader261 262for.body.preheader: ; preds = %entry263 br label %for.body264 265for.body: ; preds = %for.body.preheader, %for.body266 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]267 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]268 %conv = trunc i64 %i.03 to i32269 %mul = mul i64 %i.03, 3270 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul271 store i32 %conv, ptr %arrayidx, align 4272 %0 = mul i64 %i.03, -3273 %sub = add i64 %0, 5274 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub275 %1 = load i32, ptr %arrayidx2, align 4276 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1277 store i32 %1, ptr %B.addr.02, align 4278 %inc = add i64 %i.03, 1279 %exitcond = icmp ne i64 %inc, %n280 br i1 %exitcond, label %for.body, label %for.end.loopexit281 282for.end.loopexit: ; preds = %for.body283 br label %for.end284 285for.end: ; preds = %for.end.loopexit, %entry286 ret void287}288 289 290;; for (long unsigned i = 0; i < 4; i++) {291;; A[i] = i;292;; *B++ = A[5 - i];293 294define void @weakcrossing6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {295; CHECK-LABEL: 'weakcrossing6'296; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4297; CHECK-NEXT: da analyze - none!298; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4299; CHECK-NEXT: da analyze - flow [<>]!300; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4301; CHECK-NEXT: da analyze - confused!302; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4303; CHECK-NEXT: da analyze - none!304; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4305; CHECK-NEXT: da analyze - confused!306; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4307; CHECK-NEXT: da analyze - none!308;309entry:310 br label %for.body311 312for.body: ; preds = %entry, %for.body313 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]314 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]315 %conv = trunc i64 %i.02 to i32316 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02317 store i32 %conv, ptr %arrayidx, align 4318 %sub = sub i64 5, %i.02319 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub320 %0 = load i32, ptr %arrayidx1, align 4321 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1322 store i32 %0, ptr %B.addr.01, align 4323 %inc = add i64 %i.02, 1324 %exitcond = icmp ne i64 %inc, 4325 br i1 %exitcond, label %for.body, label %for.end326 327for.end: ; preds = %for.body328 ret void329}330