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 5target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 6target triple = "thumbv8m.main-arm-none-eabi" 7 8;; for (int i = 0; i < n; i++) 9;; for (int j = 0; j < m; j++) 10;; for (int k = 0; k < o; k++) 11;; = A[i*m*o + j*o + k] 12;; A[i*m*o + j*o + k] = 13define void @t1(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 14; CHECK-LABEL: 't1' 15; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 16; CHECK-NEXT: da analyze - none! 17; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx, align 4 18; CHECK-NEXT: da analyze - consistent anti [0 0 0|<]! 19; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx, align 4 20; CHECK-NEXT: da analyze - none! 21; 22entry: 23 %cmp49 = icmp sgt i32 %n, 0 24 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 25 26for.cond1.preheader.lr.ph: ; preds = %entry 27 %cmp247 = icmp sgt i32 %m, 0 28 %cmp645 = icmp sgt i32 %o, 0 29 br label %for.cond1.preheader 30 31for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 32 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 33 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 34 35for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 36 %mul = mul nsw i32 %i.050, %m 37 br label %for.cond5.preheader 38 39for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 40 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 41 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 42 43for.body8.lr.ph: ; preds = %for.cond5.preheader 44 %mul944 = add i32 %j.048, %mul 45 %add = mul i32 %mul944, %o 46 br label %for.body8 47 48for.body8: ; preds = %for.body8, %for.body8.lr.ph 49 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 50 %add11 = add nsw i32 %k.046, %add 51 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 52 %0 = load i32, ptr %arrayidx, align 4 53 %add12 = add nsw i32 %0, 1 54 store i32 %add12, ptr %arrayidx, align 4 55 %inc = add nuw nsw i32 %k.046, 1 56 %exitcond = icmp eq i32 %inc, %o 57 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 58 59for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 60 %inc20 = add nuw nsw i32 %j.048, 1 61 %exitcond51 = icmp eq i32 %inc20, %m 62 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 63 64for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 65 %inc23 = add nuw nsw i32 %i.050, 1 66 %exitcond52 = icmp eq i32 %inc23, %n 67 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 68 69for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 70 ret void 71} 72 73;; for (int i = 0; i < n; i++) 74;; for (int j = 0; j < m; j++) 75;; for (int k = 0; k < o; k++) 76;; = A[i*m*o + j*o + k] 77;; A[i*m*o + j*o + k + 1] = 78define void @t2(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 79; CHECK-LABEL: 't2' 80; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 81; CHECK-NEXT: da analyze - none! 82; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 83; CHECK-NEXT: da analyze - anti [* * *|<]! 84; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 85; CHECK-NEXT: da analyze - output [* * *]! 86; 87entry: 88 %cmp49 = icmp sgt i32 %n, 0 89 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 90 91for.cond1.preheader.lr.ph: ; preds = %entry 92 %cmp247 = icmp sgt i32 %m, 0 93 %cmp645 = icmp sgt i32 %o, 0 94 br label %for.cond1.preheader 95 96for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 97 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 98 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 99 100for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 101 %mul = mul nsw i32 %i.050, %m 102 br label %for.cond5.preheader 103 104for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 105 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 106 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 107 108for.body8.lr.ph: ; preds = %for.cond5.preheader 109 %mul944 = add i32 %j.048, %mul 110 %add = mul i32 %mul944, %o 111 br label %for.body8 112 113for.body8: ; preds = %for.body8, %for.body8.lr.ph 114 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 115 %add11 = add nsw i32 %k.046, %add 116 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 117 %0 = load i32, ptr %arrayidx, align 4 118 %add12 = add nsw i32 %0, 1 119 %add111 = add nsw i32 %add11, 1 120 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 121 store i32 %add12, ptr %arrayidx2, align 4 122 %inc = add nuw nsw i32 %k.046, 1 123 %exitcond = icmp eq i32 %inc, %o 124 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 125 126for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 127 %inc20 = add nuw nsw i32 %j.048, 1 128 %exitcond51 = icmp eq i32 %inc20, %m 129 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 130 131for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 132 %inc23 = add nuw nsw i32 %i.050, 1 133 %exitcond52 = icmp eq i32 %inc23, %n 134 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 135 136for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 137 ret void 138} 139 140;; for (int i = 0; i < n; i++) 141;; for (int j = 0; j < m; j++) 142;; for (int k = 0; k < o; k++) 143;; = A[i*m*o + j*o + k] 144;; A[i*m*o + j*o + k - 1] = 145define void @t3(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 146; CHECK-LABEL: 't3' 147; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 148; CHECK-NEXT: da analyze - none! 149; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 150; CHECK-NEXT: da analyze - anti [* * *|<]! 151; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 152; CHECK-NEXT: da analyze - output [* * *]! 153; 154entry: 155 %cmp49 = icmp sgt i32 %n, 0 156 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 157 158for.cond1.preheader.lr.ph: ; preds = %entry 159 %cmp247 = icmp sgt i32 %m, 0 160 %cmp645 = icmp sgt i32 %o, 0 161 br label %for.cond1.preheader 162 163for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 164 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 165 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 166 167for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 168 %mul = mul nsw i32 %i.050, %m 169 br label %for.cond5.preheader 170 171for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 172 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 173 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 174 175for.body8.lr.ph: ; preds = %for.cond5.preheader 176 %mul944 = add i32 %j.048, %mul 177 %add = mul i32 %mul944, %o 178 br label %for.body8 179 180for.body8: ; preds = %for.body8, %for.body8.lr.ph 181 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 182 %add11 = add nsw i32 %k.046, %add 183 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 184 %0 = load i32, ptr %arrayidx, align 4 185 %add12 = add nsw i32 %0, 1 186 %add111 = sub nsw i32 %add11, 1 187 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 188 store i32 %add12, ptr %arrayidx2, align 4 189 %inc = add nuw nsw i32 %k.046, 1 190 %exitcond = icmp eq i32 %inc, %o 191 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 192 193for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 194 %inc20 = add nuw nsw i32 %j.048, 1 195 %exitcond51 = icmp eq i32 %inc20, %m 196 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 197 198for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 199 %inc23 = add nuw nsw i32 %i.050, 1 200 %exitcond52 = icmp eq i32 %inc23, %n 201 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 202 203for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 204 ret void 205} 206 207;; for (int i = 0; i < n; i++) 208;; for (int j = 0; j < m; j++) 209;; for (int k = 0; k < o; k++) 210;; = A[i*m*o + j*o + k] 211;; A[i*m*o + j*o + k + o] = 212define void @t4(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 213; CHECK-LABEL: 't4' 214; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 215; CHECK-NEXT: da analyze - none! 216; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 217; CHECK-NEXT: da analyze - anti [* * *|<]! 218; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 219; CHECK-NEXT: da analyze - output [* * *]! 220; 221entry: 222 %cmp49 = icmp sgt i32 %n, 0 223 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 224 225for.cond1.preheader.lr.ph: ; preds = %entry 226 %cmp247 = icmp sgt i32 %m, 0 227 %cmp645 = icmp sgt i32 %o, 0 228 br label %for.cond1.preheader 229 230for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 231 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 232 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 233 234for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 235 %mul = mul nsw i32 %i.050, %m 236 br label %for.cond5.preheader 237 238for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 239 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 240 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 241 242for.body8.lr.ph: ; preds = %for.cond5.preheader 243 %mul944 = add i32 %j.048, %mul 244 %add = mul i32 %mul944, %o 245 br label %for.body8 246 247for.body8: ; preds = %for.body8, %for.body8.lr.ph 248 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 249 %add11 = add nsw i32 %k.046, %add 250 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 251 %0 = load i32, ptr %arrayidx, align 4 252 %add12 = add nsw i32 %0, 1 253 %add111 = add nsw i32 %add11, %o 254 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 255 store i32 %add12, ptr %arrayidx2, align 4 256 %inc = add nuw nsw i32 %k.046, 1 257 %exitcond = icmp eq i32 %inc, %o 258 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 259 260for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 261 %inc20 = add nuw nsw i32 %j.048, 1 262 %exitcond51 = icmp eq i32 %inc20, %m 263 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 264 265for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 266 %inc23 = add nuw nsw i32 %i.050, 1 267 %exitcond52 = icmp eq i32 %inc23, %n 268 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 269 270for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 271 ret void 272} 273 274;; for (int i = 0; i < n; i++) 275;; for (int j = 0; j < m; j++) 276;; for (int k = 0; k < o; k++) 277;; = A[i*m*o + j*o + k] 278;; A[i*m*o + j*o + k - o] = 279define void @t5(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 280; CHECK-LABEL: 't5' 281; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 282; CHECK-NEXT: da analyze - none! 283; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 284; CHECK-NEXT: da analyze - anti [* * *|<]! 285; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 286; CHECK-NEXT: da analyze - output [* * *]! 287; 288entry: 289 %cmp49 = icmp sgt i32 %n, 0 290 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 291 292for.cond1.preheader.lr.ph: ; preds = %entry 293 %cmp247 = icmp sgt i32 %m, 0 294 %cmp645 = icmp sgt i32 %o, 0 295 br label %for.cond1.preheader 296 297for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 298 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 299 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 300 301for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 302 %mul = mul nsw i32 %i.050, %m 303 br label %for.cond5.preheader 304 305for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 306 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 307 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 308 309for.body8.lr.ph: ; preds = %for.cond5.preheader 310 %mul944 = add i32 %j.048, %mul 311 %add = mul i32 %mul944, %o 312 br label %for.body8 313 314for.body8: ; preds = %for.body8, %for.body8.lr.ph 315 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 316 %add11 = add nsw i32 %k.046, %add 317 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 318 %0 = load i32, ptr %arrayidx, align 4 319 %add12 = add nsw i32 %0, 1 320 %add111 = sub nsw i32 %add11, %o 321 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 322 store i32 %add12, ptr %arrayidx2, align 4 323 %inc = add nuw nsw i32 %k.046, 1 324 %exitcond = icmp eq i32 %inc, %o 325 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 326 327for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 328 %inc20 = add nuw nsw i32 %j.048, 1 329 %exitcond51 = icmp eq i32 %inc20, %m 330 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 331 332for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 333 %inc23 = add nuw nsw i32 %i.050, 1 334 %exitcond52 = icmp eq i32 %inc23, %n 335 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 336 337for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 338 ret void 339} 340 341;; for (int i = 0; i < n; i++) 342;; for (int j = 0; j < m; j++) 343;; for (int k = 0; k < o; k++) 344;; = A[i*m*o + j*o + k] 345;; A[i*m*o + j*o + k + m*o] = 346define void @t6(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 347; CHECK-LABEL: 't6' 348; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 349; CHECK-NEXT: da analyze - none! 350; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 351; CHECK-NEXT: da analyze - consistent anti [-1 0 0]! 352; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 353; CHECK-NEXT: da analyze - none! 354; 355entry: 356 %cmp49 = icmp sgt i32 %n, 0 357 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 358 359for.cond1.preheader.lr.ph: ; preds = %entry 360 %cmp247 = icmp sgt i32 %m, 0 361 %cmp645 = icmp sgt i32 %o, 0 362 br label %for.cond1.preheader 363 364for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 365 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 366 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 367 368for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 369 %mul = mul nsw i32 %i.050, %m 370 br label %for.cond5.preheader 371 372for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 373 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 374 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 375 376for.body8.lr.ph: ; preds = %for.cond5.preheader 377 %mul944 = add i32 %j.048, %mul 378 %add = mul i32 %mul944, %o 379 br label %for.body8 380 381for.body8: ; preds = %for.body8, %for.body8.lr.ph 382 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 383 %add11 = add nsw i32 %k.046, %add 384 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 385 %0 = load i32, ptr %arrayidx, align 4 386 %add12 = add nsw i32 %0, 1 387 %mo = mul i32 %m, %o 388 %add111 = add nsw i32 %add11, %mo 389 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 390 store i32 %add12, ptr %arrayidx2, align 4 391 %inc = add nuw nsw i32 %k.046, 1 392 %exitcond = icmp eq i32 %inc, %o 393 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 394 395for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 396 %inc20 = add nuw nsw i32 %j.048, 1 397 %exitcond51 = icmp eq i32 %inc20, %m 398 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 399 400for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 401 %inc23 = add nuw nsw i32 %i.050, 1 402 %exitcond52 = icmp eq i32 %inc23, %n 403 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 404 405for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 406 ret void 407} 408 409;; for (int i = 0; i < n; i++) 410;; for (int j = 0; j < m; j++) 411;; for (int k = 0; k < o; k++) 412;; = A[i*m*o + j*o + k] 413;; A[i*m*o + j*o + k - m*o] = 414define void @t7(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 415; CHECK-LABEL: 't7' 416; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 417; CHECK-NEXT: da analyze - none! 418; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 419; CHECK-NEXT: da analyze - consistent anti [1 0 0]! 420; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 421; CHECK-NEXT: da analyze - none! 422; 423entry: 424 %cmp49 = icmp sgt i32 %n, 0 425 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 426 427for.cond1.preheader.lr.ph: ; preds = %entry 428 %cmp247 = icmp sgt i32 %m, 0 429 %cmp645 = icmp sgt i32 %o, 0 430 br label %for.cond1.preheader 431 432for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 433 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 434 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 435 436for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 437 %mul = mul nsw i32 %i.050, %m 438 br label %for.cond5.preheader 439 440for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 441 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 442 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 443 444for.body8.lr.ph: ; preds = %for.cond5.preheader 445 %mul944 = add i32 %j.048, %mul 446 %add = mul i32 %mul944, %o 447 br label %for.body8 448 449for.body8: ; preds = %for.body8, %for.body8.lr.ph 450 %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ] 451 %add11 = add nsw i32 %k.046, %add 452 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 453 %0 = load i32, ptr %arrayidx, align 4 454 %add12 = add nsw i32 %0, 1 455 %mo = mul i32 %m, %o 456 %add111 = sub nsw i32 %add11, %mo 457 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 458 store i32 %add12, ptr %arrayidx2, align 4 459 %inc = add nuw nsw i32 %k.046, 1 460 %exitcond = icmp eq i32 %inc, %o 461 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 462 463for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 464 %inc20 = add nuw nsw i32 %j.048, 1 465 %exitcond51 = icmp eq i32 %inc20, %m 466 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 467 468for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 469 %inc23 = add nuw nsw i32 %i.050, 1 470 %exitcond52 = icmp eq i32 %inc23, %n 471 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 472 473for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 474 ret void 475} 476 477;; for (int i = 0; i < n; i++) 478;; for (int j = 0; j < m; j++) 479;; for (int k = 1; k < o; k++) 480;; = A[i*m*o + j*o + k] 481;; A[i*m*o + j*o + k - 1] = 482define void @t8(i32 %n, i32 %m, i32 %o, ptr nocapture %A) { 483; CHECK-LABEL: 't8' 484; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4 485; CHECK-NEXT: da analyze - none! 486; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 487; CHECK-NEXT: da analyze - consistent anti [0 0 1]! 488; CHECK-NEXT: Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4 489; CHECK-NEXT: da analyze - none! 490; 491entry: 492 %cmp49 = icmp sgt i32 %n, 0 493 br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup 494 495for.cond1.preheader.lr.ph: ; preds = %entry 496 %cmp247 = icmp sgt i32 %m, 0 497 %cmp645 = icmp sgt i32 %o, 0 498 br label %for.cond1.preheader 499 500for.cond1.preheader: ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph 501 %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ] 502 br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3 503 504for.cond5.preheader.lr.ph: ; preds = %for.cond1.preheader 505 %mul = mul nsw i32 %i.050, %m 506 br label %for.cond5.preheader 507 508for.cond5.preheader: ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph 509 %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ] 510 br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7 511 512for.body8.lr.ph: ; preds = %for.cond5.preheader 513 %mul944 = add i32 %j.048, %mul 514 %add = mul i32 %mul944, %o 515 br label %for.body8 516 517for.body8: ; preds = %for.body8, %for.body8.lr.ph 518 %k.046 = phi i32 [ 1, %for.body8.lr.ph ], [ %inc, %for.body8 ] 519 %add11 = add nsw i32 %k.046, %add 520 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11 521 %0 = load i32, ptr %arrayidx, align 4 522 %add12 = add nsw i32 %0, 1 523 %add111 = sub nsw i32 %add11, 1 524 %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111 525 store i32 %add12, ptr %arrayidx2, align 4 526 %inc = add nuw nsw i32 %k.046, 1 527 %exitcond = icmp eq i32 %inc, %o 528 br i1 %exitcond, label %for.cond.cleanup7, label %for.body8 529 530for.cond.cleanup7: ; preds = %for.body8, %for.cond5.preheader 531 %inc20 = add nuw nsw i32 %j.048, 1 532 %exitcond51 = icmp eq i32 %inc20, %m 533 br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader 534 535for.cond.cleanup3: ; preds = %for.cond.cleanup7, %for.cond1.preheader 536 %inc23 = add nuw nsw i32 %i.050, 1 537 %exitcond52 = icmp eq i32 %inc23, %n 538 br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader 539 540for.cond.cleanup: ; preds = %for.cond.cleanup3, %entry 541 ret void 542} 543 544 545define double @test_sizes(i16 %h, i16 %N, ptr nocapture %array) { 546; CHECK-LABEL: 'test_sizes' 547; CHECK-NEXT: Src: %2 = load i16, ptr %arrayidx, align 4 --> Dst: %2 = load i16, ptr %arrayidx, align 4 548; CHECK-NEXT: da analyze - consistent input [0 S]! 549; CHECK-NEXT: Src: %2 = load i16, ptr %arrayidx, align 4 --> Dst: store i16 %add6, ptr %arrayidx8, align 4 550; CHECK-NEXT: da analyze - anti [* *|<]! 551; CHECK-NEXT: Src: store i16 %add6, ptr %arrayidx8, align 4 --> Dst: store i16 %add6, ptr %arrayidx8, align 4 552; CHECK-NEXT: da analyze - output [* *]! 553; 554entry: 555 %cmp28 = icmp sgt i16 %N, 1 556 br i1 %cmp28, label %for.body.lr.ph, label %for.end12 557 558for.body.lr.ph: ; preds = %entry 559 %cmp425 = icmp slt i16 %h, 0 560 %0 = add i16 %h, 1 561 %wide.trip.count = zext i16 %N to i32 562 br label %for.body 563 564for.body: ; preds = %for.inc10, %for.body.lr.ph 565 %indvars.iv32 = phi i32 [ 1, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc10 ] 566 %indvars.iv = phi i16 [ 2, %for.body.lr.ph ], [ %indvars.iv.next, %for.inc10 ] 567 br i1 %cmp425, label %for.inc10, label %for.body5.lr.ph 568 569for.body5.lr.ph: ; preds = %for.body 570 %1 = sext i16 %indvars.iv to i32 571 %arrayidx = getelementptr inbounds i16, ptr %array, i32 %indvars.iv32 572 br label %for.body5 573 574for.body5: ; preds = %for.body5, %for.body5.lr.ph 575 %indvars.iv30 = phi i32 [ %indvars.iv.next31, %for.body5 ], [ %1, %for.body5.lr.ph ] 576 %j.027 = phi i16 [ %inc, %for.body5 ], [ 0, %for.body5.lr.ph ] 577 %2 = load i16, ptr %arrayidx, align 4 578 %add6 = add nsw i16 %2, %j.027 579 %arrayidx8 = getelementptr inbounds i16, ptr %array, i32 %indvars.iv30 580 store i16 %add6, ptr %arrayidx8, align 4 581 %inc = add nuw nsw i16 %j.027, 1 582 %indvars.iv.next31 = add nsw i32 %indvars.iv30, 1 583 %exitcond = icmp eq i16 %inc, %0 584 br i1 %exitcond, label %for.inc10, label %for.body5 585 586for.inc10: ; preds = %for.body5, %for.body 587 %indvars.iv.next33 = add nuw nsw i32 %indvars.iv32, 1 588 %indvars.iv.next = add i16 %indvars.iv, %0 589 %exitcond34 = icmp eq i32 %indvars.iv.next33, %wide.trip.count 590 br i1 %exitcond34, label %for.end12, label %for.body 591 592for.end12: ; preds = %for.inc10, %entry 593 ret double undef 594} 595 596 597define void @nonnegative(ptr nocapture %A, i32 %N) { 598; CHECK-LABEL: 'nonnegative' 599; CHECK-NEXT: Src: store i32 1, ptr %arrayidx, align 4 --> Dst: store i32 1, ptr %arrayidx, align 4 600; CHECK-NEXT: da analyze - none! 601; CHECK-NEXT: Src: store i32 1, ptr %arrayidx, align 4 --> Dst: store i32 2, ptr %arrayidx, align 4 602; CHECK-NEXT: da analyze - consistent output [0 0|<]! 603; CHECK-NEXT: Src: store i32 2, ptr %arrayidx, align 4 --> Dst: store i32 2, ptr %arrayidx, align 4 604; CHECK-NEXT: da analyze - none! 605; 606entry: 607 %cmp44 = icmp eq i32 %N, 0 608 br i1 %cmp44, label %exit, label %for.outer 609 610for.outer: 611 %h.045 = phi i32 [ %add19, %for.latch ], [ 0, %entry ] 612 %mul = mul i32 %h.045, %N 613 br label %for.inner 614 615for.inner: 616 %i.043 = phi i32 [ 0, %for.outer ], [ %add16, %for.inner ] 617 %add = add i32 %i.043, %mul 618 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add 619 store i32 1, ptr %arrayidx, align 4 620 store i32 2, ptr %arrayidx, align 4 621 %add16 = add nuw i32 %i.043, 1 622 %exitcond46 = icmp eq i32 %add16, %N 623 br i1 %exitcond46, label %for.latch, label %for.inner 624 625for.latch: 626 %add19 = add nuw i32 %h.045, 1 627 %exitcond47 = icmp eq i32 %add19, %N 628 br i1 %exitcond47, label %exit, label %for.outer 629 630exit: 631 ret void 632} 633