1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \ 3; RUN: | FileCheck %s 4 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 4 17; CHECK-NEXT: da analyze - none! 18; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 19; 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 4 21; CHECK-NEXT: da analyze - confused! 22; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 23; 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 4 25; 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 4 27; CHECK-NEXT: da analyze - none! 28; 29entry: 30 %cmp1 = icmp eq i64 %n, 0 31 br i1 %cmp1, label %for.end, label %for.body.preheader 32 33for.body.preheader: ; preds = %entry 34 br label %for.body 35 36for.body: ; preds = %for.body.preheader, %for.body 37 %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 i32 40 %mul = mul i64 %i.03, %n 41 %add = add i64 %mul, 1 42 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 43 store i32 %conv, ptr %arrayidx, align 4 44 %mul1 = mul i64 %i.03, %n 45 %sub = sub i64 1, %mul1 46 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub 47 %0 = load i32, ptr %arrayidx2, align 4 48 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 49 store i32 %0, ptr %B.addr.02, align 4 50 %inc = add i64 %i.03, 1 51 %exitcond = icmp ne i64 %inc, %n 52 br i1 %exitcond, label %for.body, label %for.end.loopexit 53 54for.end.loopexit: ; preds = %for.body 55 br label %for.end 56 57for.end: ; preds = %for.end.loopexit, %entry 58 ret void 59} 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 4 69; CHECK-NEXT: da analyze - none! 70; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 71; CHECK-NEXT: da analyze - flow [<>] splitable! 72; CHECK-NEXT: da analyze - split level = 1, iteration = 0! 73; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 74; CHECK-NEXT: da analyze - confused! 75; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4 76; CHECK-NEXT: da analyze - none! 77; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 78; CHECK-NEXT: da analyze - confused! 79; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4 80; CHECK-NEXT: da analyze - none! 81; 82entry: 83 %cmp1 = icmp eq i64 %n, 0 84 br i1 %cmp1, label %for.end, label %for.body.preheader 85 86for.body.preheader: ; preds = %entry 87 br label %for.body 88 89for.body: ; preds = %for.body.preheader, %for.body 90 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 91 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 92 %conv = trunc i64 %i.03 to i32 93 %add = add i64 %i.03, %n 94 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add 95 store i32 %conv, ptr %arrayidx, align 4 96 %add1 = add i64 %n, 1 97 %sub = sub i64 %add1, %i.03 98 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub 99 %0 = load i32, ptr %arrayidx2, align 4 100 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 101 store i32 %0, ptr %B.addr.02, align 4 102 %inc = add i64 %i.03, 1 103 %exitcond = icmp ne i64 %inc, %n 104 br i1 %exitcond, label %for.body, label %for.end.loopexit 105 106for.end.loopexit: ; preds = %for.body 107 br label %for.end 108 109for.end: ; preds = %for.end.loopexit, %entry 110 ret void 111} 112 113 114;; for (long unsigned i = 0; i < 3; i++) { 115;; A[i] = i; 116;; *B++ = A[6 - i]; 117 118define void @weakcrossing2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 119; CHECK-LABEL: 'weakcrossing2' 120; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 121; CHECK-NEXT: da analyze - none! 122; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 123; CHECK-NEXT: da analyze - none! 124; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 125; CHECK-NEXT: da analyze - confused! 126; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 127; CHECK-NEXT: da analyze - none! 128; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 129; CHECK-NEXT: da analyze - confused! 130; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 131; CHECK-NEXT: da analyze - none! 132; 133entry: 134 br label %for.body 135 136for.body: ; preds = %entry, %for.body 137 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 138 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 139 %conv = trunc i64 %i.02 to i32 140 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02 141 store i32 %conv, ptr %arrayidx, align 4 142 %sub = sub i64 6, %i.02 143 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub 144 %0 = load i32, ptr %arrayidx1, align 4 145 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 146 store i32 %0, ptr %B.addr.01, align 4 147 %inc = add i64 %i.02, 1 148 %exitcond = icmp ne i64 %inc, 3 149 br i1 %exitcond, label %for.body, label %for.end 150 151for.end: ; preds = %for.body 152 ret void 153} 154 155 156;; for (long unsigned i = 0; i < 4; i++) { 157;; A[i] = i; 158;; *B++ = A[6 - i]; 159 160define void @weakcrossing3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 161; CHECK-LABEL: 'weakcrossing3' 162; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 163; CHECK-NEXT: da analyze - none! 164; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 165; CHECK-NEXT: da analyze - flow [0|<]! 166; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 167; CHECK-NEXT: da analyze - confused! 168; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 169; CHECK-NEXT: da analyze - none! 170; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 171; CHECK-NEXT: da analyze - confused! 172; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 173; CHECK-NEXT: da analyze - none! 174; 175entry: 176 br label %for.body 177 178for.body: ; preds = %entry, %for.body 179 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 180 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 181 %conv = trunc i64 %i.02 to i32 182 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02 183 store i32 %conv, ptr %arrayidx, align 4 184 %sub = sub i64 6, %i.02 185 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub 186 %0 = load i32, ptr %arrayidx1, align 4 187 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 188 store i32 %0, ptr %B.addr.01, align 4 189 %inc = add i64 %i.02, 1 190 %exitcond = icmp ne i64 %inc, 4 191 br i1 %exitcond, label %for.body, label %for.end 192 193for.end: ; preds = %for.body 194 ret void 195} 196 197 198;; for (long unsigned i = 0; i < 10; i++) { 199;; A[i] = i; 200;; *B++ = A[-6 - i]; 201 202define void @weakcrossing4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 203; CHECK-LABEL: 'weakcrossing4' 204; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 205; CHECK-NEXT: da analyze - none! 206; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 207; CHECK-NEXT: da analyze - none! 208; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 209; CHECK-NEXT: da analyze - confused! 210; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 211; CHECK-NEXT: da analyze - none! 212; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 213; CHECK-NEXT: da analyze - confused! 214; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 215; CHECK-NEXT: da analyze - none! 216; 217entry: 218 br label %for.body 219 220for.body: ; preds = %entry, %for.body 221 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 222 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 223 %conv = trunc i64 %i.02 to i32 224 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02 225 store i32 %conv, ptr %arrayidx, align 4 226 %sub = sub i64 -6, %i.02 227 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub 228 %0 = load i32, ptr %arrayidx1, align 4 229 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 230 store i32 %0, ptr %B.addr.01, align 4 231 %inc = add i64 %i.02, 1 232 %exitcond = icmp ne i64 %inc, 10 233 br i1 %exitcond, label %for.body, label %for.end 234 235for.end: ; preds = %for.body 236 ret void 237} 238 239 240;; for (long unsigned i = 0; i < n; i++) { 241;; A[3*i] = i; 242;; *B++ = A[5 - 3*i]; 243 244define void @weakcrossing5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 245; CHECK-LABEL: 'weakcrossing5' 246; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 247; CHECK-NEXT: da analyze - none! 248; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4 249; CHECK-NEXT: da analyze - none! 250; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 251; CHECK-NEXT: da analyze - confused! 252; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4 253; CHECK-NEXT: da analyze - none! 254; CHECK-NEXT: Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 255; CHECK-NEXT: da analyze - confused! 256; CHECK-NEXT: Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4 257; CHECK-NEXT: da analyze - none! 258; 259entry: 260 %cmp1 = icmp eq i64 %n, 0 261 br i1 %cmp1, label %for.end, label %for.body.preheader 262 263for.body.preheader: ; preds = %entry 264 br label %for.body 265 266for.body: ; preds = %for.body.preheader, %for.body 267 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ] 268 %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ] 269 %conv = trunc i64 %i.03 to i32 270 %mul = mul i64 %i.03, 3 271 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul 272 store i32 %conv, ptr %arrayidx, align 4 273 %0 = mul i64 %i.03, -3 274 %sub = add i64 %0, 5 275 %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub 276 %1 = load i32, ptr %arrayidx2, align 4 277 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1 278 store i32 %1, ptr %B.addr.02, align 4 279 %inc = add i64 %i.03, 1 280 %exitcond = icmp ne i64 %inc, %n 281 br i1 %exitcond, label %for.body, label %for.end.loopexit 282 283for.end.loopexit: ; preds = %for.body 284 br label %for.end 285 286for.end: ; preds = %for.end.loopexit, %entry 287 ret void 288} 289 290 291;; for (long unsigned i = 0; i < 4; i++) { 292;; A[i] = i; 293;; *B++ = A[5 - i]; 294 295define void @weakcrossing6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp { 296; CHECK-LABEL: 'weakcrossing6' 297; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4 298; CHECK-NEXT: da analyze - none! 299; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 300; CHECK-NEXT: da analyze - flow [<>] splitable! 301; CHECK-NEXT: da analyze - split level = 1, iteration = 2! 302; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 303; CHECK-NEXT: da analyze - confused! 304; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4 305; CHECK-NEXT: da analyze - none! 306; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 307; CHECK-NEXT: da analyze - confused! 308; CHECK-NEXT: Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4 309; CHECK-NEXT: da analyze - none! 310; 311entry: 312 br label %for.body 313 314for.body: ; preds = %entry, %for.body 315 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ] 316 %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ] 317 %conv = trunc i64 %i.02 to i32 318 %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02 319 store i32 %conv, ptr %arrayidx, align 4 320 %sub = sub i64 5, %i.02 321 %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub 322 %0 = load i32, ptr %arrayidx1, align 4 323 %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1 324 store i32 %0, ptr %B.addr.01, align 4 325 %inc = add i64 %i.02, 1 326 %exitcond = icmp ne i64 %inc, 4 327 br i1 %exitcond, label %for.body, label %for.end 328 329for.end: ; preds = %for.body 330 ret void 331} 332