brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.6 KiB · 8f94a45 Raw
712 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 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 416; CHECK-NEXT:    da analyze - none!17; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx, align 418; 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 420; CHECK-NEXT:    da analyze - none!21;22entry:23  %cmp49 = icmp sgt i32 %n, 024  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup25 26for.cond1.preheader.lr.ph:                        ; preds = %entry27  %cmp247 = icmp sgt i32 %m, 028  %cmp645 = icmp sgt i32 %o, 029  br label %for.cond1.preheader30 31for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph32  %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.cleanup334 35for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader36  %mul = mul nsw i32 %i.050, %m37  br label %for.cond5.preheader38 39for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph40  %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.cleanup742 43for.body8.lr.ph:                                  ; preds = %for.cond5.preheader44  %mul944 = add i32 %j.048, %mul45  %add = mul i32 %mul944, %o46  br label %for.body847 48for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph49  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]50  %add11 = add nsw i32 %k.046, %add51  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add1152  %0 = load i32, ptr %arrayidx, align 453  %add12 = add nsw i32 %0, 154  store i32 %add12, ptr %arrayidx, align 455  %inc = add nuw nsw i32 %k.046, 156  %exitcond = icmp eq i32 %inc, %o57  br i1 %exitcond, label %for.cond.cleanup7, label %for.body858 59for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader60  %inc20 = add nuw nsw i32 %j.048, 161  %exitcond51 = icmp eq i32 %inc20, %m62  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader63 64for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader65  %inc23 = add nuw nsw i32 %i.050, 166  %exitcond52 = icmp eq i32 %inc23, %n67  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader68 69for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry70  ret void71}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 481; CHECK-NEXT:    da analyze - none!82; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 483; CHECK-NEXT:    da analyze - anti [* * *|<]!84; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 485; CHECK-NEXT:    da analyze - output [* * *]!86;87entry:88  %cmp49 = icmp sgt i32 %n, 089  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup90 91for.cond1.preheader.lr.ph:                        ; preds = %entry92  %cmp247 = icmp sgt i32 %m, 093  %cmp645 = icmp sgt i32 %o, 094  br label %for.cond1.preheader95 96for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph97  %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.cleanup399 100for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader101  %mul = mul nsw i32 %i.050, %m102  br label %for.cond5.preheader103 104for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph105  %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.cleanup7107 108for.body8.lr.ph:                                  ; preds = %for.cond5.preheader109  %mul944 = add i32 %j.048, %mul110  %add = mul i32 %mul944, %o111  br label %for.body8112 113for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph114  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]115  %add11 = add nsw i32 %k.046, %add116  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11117  %0 = load i32, ptr %arrayidx, align 4118  %add12 = add nsw i32 %0, 1119  %add111 = add nsw i32 %add11, 1120  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111121  store i32 %add12, ptr %arrayidx2, align 4122  %inc = add nuw nsw i32 %k.046, 1123  %exitcond = icmp eq i32 %inc, %o124  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8125 126for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader127  %inc20 = add nuw nsw i32 %j.048, 1128  %exitcond51 = icmp eq i32 %inc20, %m129  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader130 131for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader132  %inc23 = add nuw nsw i32 %i.050, 1133  %exitcond52 = icmp eq i32 %inc23, %n134  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader135 136for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry137  ret void138}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 4148; CHECK-NEXT:    da analyze - none!149; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4150; CHECK-NEXT:    da analyze - anti [* * *|<]!151; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4152; CHECK-NEXT:    da analyze - output [* * *]!153;154entry:155  %cmp49 = icmp sgt i32 %n, 0156  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup157 158for.cond1.preheader.lr.ph:                        ; preds = %entry159  %cmp247 = icmp sgt i32 %m, 0160  %cmp645 = icmp sgt i32 %o, 0161  br label %for.cond1.preheader162 163for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph164  %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.cleanup3166 167for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader168  %mul = mul nsw i32 %i.050, %m169  br label %for.cond5.preheader170 171for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph172  %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.cleanup7174 175for.body8.lr.ph:                                  ; preds = %for.cond5.preheader176  %mul944 = add i32 %j.048, %mul177  %add = mul i32 %mul944, %o178  br label %for.body8179 180for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph181  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]182  %add11 = add nsw i32 %k.046, %add183  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11184  %0 = load i32, ptr %arrayidx, align 4185  %add12 = add nsw i32 %0, 1186  %add111 = sub nsw i32 %add11, 1187  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111188  store i32 %add12, ptr %arrayidx2, align 4189  %inc = add nuw nsw i32 %k.046, 1190  %exitcond = icmp eq i32 %inc, %o191  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8192 193for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader194  %inc20 = add nuw nsw i32 %j.048, 1195  %exitcond51 = icmp eq i32 %inc20, %m196  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader197 198for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader199  %inc23 = add nuw nsw i32 %i.050, 1200  %exitcond52 = icmp eq i32 %inc23, %n201  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader202 203for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry204  ret void205}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 4215; CHECK-NEXT:    da analyze - none!216; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4217; CHECK-NEXT:    da analyze - anti [* * *|<]!218; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4219; CHECK-NEXT:    da analyze - output [* * *]!220;221entry:222  %cmp49 = icmp sgt i32 %n, 0223  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup224 225for.cond1.preheader.lr.ph:                        ; preds = %entry226  %cmp247 = icmp sgt i32 %m, 0227  %cmp645 = icmp sgt i32 %o, 0228  br label %for.cond1.preheader229 230for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph231  %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.cleanup3233 234for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader235  %mul = mul nsw i32 %i.050, %m236  br label %for.cond5.preheader237 238for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph239  %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.cleanup7241 242for.body8.lr.ph:                                  ; preds = %for.cond5.preheader243  %mul944 = add i32 %j.048, %mul244  %add = mul i32 %mul944, %o245  br label %for.body8246 247for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph248  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]249  %add11 = add nsw i32 %k.046, %add250  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11251  %0 = load i32, ptr %arrayidx, align 4252  %add12 = add nsw i32 %0, 1253  %add111 = add nsw i32 %add11, %o254  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111255  store i32 %add12, ptr %arrayidx2, align 4256  %inc = add nuw nsw i32 %k.046, 1257  %exitcond = icmp eq i32 %inc, %o258  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8259 260for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader261  %inc20 = add nuw nsw i32 %j.048, 1262  %exitcond51 = icmp eq i32 %inc20, %m263  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader264 265for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader266  %inc23 = add nuw nsw i32 %i.050, 1267  %exitcond52 = icmp eq i32 %inc23, %n268  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader269 270for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry271  ret void272}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 4282; CHECK-NEXT:    da analyze - none!283; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4284; CHECK-NEXT:    da analyze - anti [* * *|<]!285; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4286; CHECK-NEXT:    da analyze - output [* * *]!287;288entry:289  %cmp49 = icmp sgt i32 %n, 0290  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup291 292for.cond1.preheader.lr.ph:                        ; preds = %entry293  %cmp247 = icmp sgt i32 %m, 0294  %cmp645 = icmp sgt i32 %o, 0295  br label %for.cond1.preheader296 297for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph298  %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.cleanup3300 301for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader302  %mul = mul nsw i32 %i.050, %m303  br label %for.cond5.preheader304 305for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph306  %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.cleanup7308 309for.body8.lr.ph:                                  ; preds = %for.cond5.preheader310  %mul944 = add i32 %j.048, %mul311  %add = mul i32 %mul944, %o312  br label %for.body8313 314for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph315  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]316  %add11 = add nsw i32 %k.046, %add317  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11318  %0 = load i32, ptr %arrayidx, align 4319  %add12 = add nsw i32 %0, 1320  %add111 = sub nsw i32 %add11, %o321  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111322  store i32 %add12, ptr %arrayidx2, align 4323  %inc = add nuw nsw i32 %k.046, 1324  %exitcond = icmp eq i32 %inc, %o325  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8326 327for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader328  %inc20 = add nuw nsw i32 %j.048, 1329  %exitcond51 = icmp eq i32 %inc20, %m330  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader331 332for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader333  %inc23 = add nuw nsw i32 %i.050, 1334  %exitcond52 = icmp eq i32 %inc23, %n335  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader336 337for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry338  ret void339}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 4349; CHECK-NEXT:    da analyze - none!350; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4351; 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 4353; CHECK-NEXT:    da analyze - none!354;355entry:356  %cmp49 = icmp sgt i32 %n, 0357  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup358 359for.cond1.preheader.lr.ph:                        ; preds = %entry360  %cmp247 = icmp sgt i32 %m, 0361  %cmp645 = icmp sgt i32 %o, 0362  br label %for.cond1.preheader363 364for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph365  %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.cleanup3367 368for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader369  %mul = mul nsw i32 %i.050, %m370  br label %for.cond5.preheader371 372for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph373  %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.cleanup7375 376for.body8.lr.ph:                                  ; preds = %for.cond5.preheader377  %mul944 = add i32 %j.048, %mul378  %add = mul i32 %mul944, %o379  br label %for.body8380 381for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph382  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]383  %add11 = add nsw i32 %k.046, %add384  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11385  %0 = load i32, ptr %arrayidx, align 4386  %add12 = add nsw i32 %0, 1387  %mo = mul i32 %m, %o388  %add111 = add nsw i32 %add11, %mo389  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111390  store i32 %add12, ptr %arrayidx2, align 4391  %inc = add nuw nsw i32 %k.046, 1392  %exitcond = icmp eq i32 %inc, %o393  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8394 395for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader396  %inc20 = add nuw nsw i32 %j.048, 1397  %exitcond51 = icmp eq i32 %inc20, %m398  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader399 400for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader401  %inc23 = add nuw nsw i32 %i.050, 1402  %exitcond52 = icmp eq i32 %inc23, %n403  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader404 405for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry406  ret void407}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 4417; CHECK-NEXT:    da analyze - none!418; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4419; 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 4421; CHECK-NEXT:    da analyze - none!422;423entry:424  %cmp49 = icmp sgt i32 %n, 0425  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup426 427for.cond1.preheader.lr.ph:                        ; preds = %entry428  %cmp247 = icmp sgt i32 %m, 0429  %cmp645 = icmp sgt i32 %o, 0430  br label %for.cond1.preheader431 432for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph433  %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.cleanup3435 436for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader437  %mul = mul nsw i32 %i.050, %m438  br label %for.cond5.preheader439 440for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph441  %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.cleanup7443 444for.body8.lr.ph:                                  ; preds = %for.cond5.preheader445  %mul944 = add i32 %j.048, %mul446  %add = mul i32 %mul944, %o447  br label %for.body8448 449for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph450  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]451  %add11 = add nsw i32 %k.046, %add452  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11453  %0 = load i32, ptr %arrayidx, align 4454  %add12 = add nsw i32 %0, 1455  %mo = mul i32 %m, %o456  %add111 = sub nsw i32 %add11, %mo457  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111458  store i32 %add12, ptr %arrayidx2, align 4459  %inc = add nuw nsw i32 %k.046, 1460  %exitcond = icmp eq i32 %inc, %o461  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8462 463for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader464  %inc20 = add nuw nsw i32 %j.048, 1465  %exitcond51 = icmp eq i32 %inc20, %m466  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader467 468for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader469  %inc23 = add nuw nsw i32 %i.050, 1470  %exitcond52 = icmp eq i32 %inc23, %n471  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader472 473for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry474  ret void475}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 4485; CHECK-NEXT:    da analyze - none!486; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4487; 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 4489; CHECK-NEXT:    da analyze - none!490;491entry:492  %cmp49 = icmp sgt i32 %n, 0493  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup494 495for.cond1.preheader.lr.ph:                        ; preds = %entry496  %cmp247 = icmp sgt i32 %m, 0497  %cmp645 = icmp sgt i32 %o, 0498  br label %for.cond1.preheader499 500for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph501  %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.cleanup3503 504for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader505  %mul = mul nsw i32 %i.050, %m506  br label %for.cond5.preheader507 508for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph509  %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.cleanup7511 512for.body8.lr.ph:                                  ; preds = %for.cond5.preheader513  %mul944 = add i32 %j.048, %mul514  %add = mul i32 %mul944, %o515  br label %for.body8516 517for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph518  %k.046 = phi i32 [ 1, %for.body8.lr.ph ], [ %inc, %for.body8 ]519  %add11 = add nsw i32 %k.046, %add520  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11521  %0 = load i32, ptr %arrayidx, align 4522  %add12 = add nsw i32 %0, 1523  %add111 = sub nsw i32 %add11, 1524  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111525  store i32 %add12, ptr %arrayidx2, align 4526  %inc = add nuw nsw i32 %k.046, 1527  %exitcond = icmp eq i32 %inc, %o528  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8529 530for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader531  %inc20 = add nuw nsw i32 %j.048, 1532  %exitcond51 = icmp eq i32 %inc20, %m533  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader534 535for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader536  %inc23 = add nuw nsw i32 %i.050, 1537  %exitcond52 = icmp eq i32 %inc23, %n538  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader539 540for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry541  ret void542}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 4548; 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 4550; CHECK-NEXT:    da analyze - anti [* *|<]!551; CHECK-NEXT:  Src: store i16 %add6, ptr %arrayidx8, align 4 --> Dst: store i16 %add6, ptr %arrayidx8, align 4552; CHECK-NEXT:    da analyze - output [* *]!553;554entry:555  %cmp28 = icmp sgt i16 %N, 1556  br i1 %cmp28, label %for.body.lr.ph, label %for.end12557 558for.body.lr.ph:                                   ; preds = %entry559  %cmp425 = icmp slt i16 %h, 0560  %0 = add i16 %h, 1561  %wide.trip.count = zext i16 %N to i32562  br label %for.body563 564for.body:                                         ; preds = %for.inc10, %for.body.lr.ph565  %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.ph568 569for.body5.lr.ph:                                  ; preds = %for.body570  %1 = sext i16 %indvars.iv to i32571  %arrayidx = getelementptr inbounds i16, ptr %array, i32 %indvars.iv32572  br label %for.body5573 574for.body5:                                        ; preds = %for.body5, %for.body5.lr.ph575  %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 4578  %add6 = add nsw i16 %2, %j.027579  %arrayidx8 = getelementptr inbounds i16, ptr %array, i32 %indvars.iv30580  store i16 %add6, ptr %arrayidx8, align 4581  %inc = add nuw nsw i16 %j.027, 1582  %indvars.iv.next31 = add nsw i32 %indvars.iv30, 1583  %exitcond = icmp eq i16 %inc, %0584  br i1 %exitcond, label %for.inc10, label %for.body5585 586for.inc10:                                        ; preds = %for.body5, %for.body587  %indvars.iv.next33 = add nuw nsw i32 %indvars.iv32, 1588  %indvars.iv.next = add i16 %indvars.iv, %0589  %exitcond34 = icmp eq i32 %indvars.iv.next33, %wide.trip.count590  br i1 %exitcond34, label %for.end12, label %for.body591 592for.end12:                                        ; preds = %for.inc10, %entry593  ret double undef594}595 596 597; FIXME? It seems that we cannot prove that %N is non-negative...598define void @nonnegative(ptr nocapture %A, i32 %N) {599; CHECK-LABEL: 'nonnegative'600; CHECK-NEXT:  Src: store i32 1, ptr %arrayidx, align 4 --> Dst: store i32 1, ptr %arrayidx, align 4601; CHECK-NEXT:    da analyze - output [* *]!602; CHECK-NEXT:  Src: store i32 1, ptr %arrayidx, align 4 --> Dst: store i32 2, ptr %arrayidx, align 4603; CHECK-NEXT:    da analyze - output [* *|<]!604; CHECK-NEXT:  Src: store i32 2, ptr %arrayidx, align 4 --> Dst: store i32 2, ptr %arrayidx, align 4605; CHECK-NEXT:    da analyze - output [* *]!606;607entry:608  %cmp44 = icmp eq i32 %N, 0609  br i1 %cmp44, label %exit, label %for.outer610 611for.outer:612  %h.045 = phi i32 [ %add19, %for.latch ], [ 0, %entry ]613  %mul = mul i32 %h.045, %N614  br label %for.inner615 616for.inner:617  %i.043 = phi i32 [ 0, %for.outer ], [ %add16, %for.inner ]618  %add = add i32 %i.043, %mul619  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add620  store i32 1, ptr %arrayidx, align 4621  store i32 2, ptr %arrayidx, align 4622  %add16 = add nuw i32 %i.043, 1623  %exitcond46 = icmp eq i32 %add16, %N624  br i1 %exitcond46, label %for.latch, label %for.inner625 626for.latch:627  %add19 = add nuw i32 %h.045, 1628  %exitcond47 = icmp eq i32 %add19, %N629  br i1 %exitcond47, label %exit, label %for.outer630 631exit:632  ret void633}634 635; i = 0;636; do {637;   a[k * i] = 42;638;   a[k * (i + 1)] = 42;639;   i++;640; } while (i != k);641;642; The dependency direction between the two stores depends on the sign of k.643; Note that the loop guard is omitted intentionally.644; FIXME: Each store has loop-carried dependencies on itself if k is zero.645;646define void @coeff_may_negative(ptr %a, i32 %k) {647; CHECK-LABEL: 'coeff_may_negative'648; CHECK-NEXT:  Src: store i8 42, ptr %idx.0, align 1 --> Dst: store i8 42, ptr %idx.0, align 1649; CHECK-NEXT:    da analyze - none!650; CHECK-NEXT:  Src: store i8 42, ptr %idx.0, align 1 --> Dst: store i8 42, ptr %idx.1, align 1651; CHECK-NEXT:    da analyze - output [*|<]!652; CHECK-NEXT:  Src: store i8 42, ptr %idx.1, align 1 --> Dst: store i8 42, ptr %idx.1, align 1653; CHECK-NEXT:    da analyze - none!654;655entry:656  br label %loop657 658loop:659  %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]660  %i.next = add i32 %i, 1661  %subscript.0 = mul i32 %i, %k662  %subscript.1 = mul i32 %i.next, %k663  %idx.0 = getelementptr i8, ptr %a, i32 %subscript.0664  %idx.1 = getelementptr i8, ptr %a, i32 %subscript.1665  store i8 42, ptr %idx.0666  store i8 42, ptr %idx.1667  %cond.exit = icmp eq i32 %i.next, %k668  br i1 %cond.exit, label %exit, label %loop669 670exit:671  ret void672}673 674; i = 0;675; do {676;   a[k * i] = 42;677;   a[k * (i + 1)] = 42;678;   i++;679; } while (i != k);680;681; Note that the loop guard is omitted intentionally.682; FIXME: In principle, we can infer that the value of k is non-negative from683; the nsw flag.684;685define void @coeff_positive(ptr %a, i32 %k) {686; CHECK-LABEL: 'coeff_positive'687; CHECK-NEXT:  Src: store i8 42, ptr %idx.0, align 1 --> Dst: store i8 42, ptr %idx.0, align 1688; CHECK-NEXT:    da analyze - none!689; CHECK-NEXT:  Src: store i8 42, ptr %idx.0, align 1 --> Dst: store i8 42, ptr %idx.1, align 1690; CHECK-NEXT:    da analyze - output [*|<]!691; CHECK-NEXT:  Src: store i8 42, ptr %idx.1, align 1 --> Dst: store i8 42, ptr %idx.1, align 1692; CHECK-NEXT:    da analyze - none!693;694entry:695  br label %loop696 697loop:698  %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]699  %i.next = add nsw i32 %i, 1700  %subscript.0 = mul i32 %i, %k701  %subscript.1 = mul i32 %i.next, %k702  %idx.0 = getelementptr i8, ptr %a, i32 %subscript.0703  %idx.1 = getelementptr i8, ptr %a, i32 %subscript.1704  store i8 42, ptr %idx.0705  store i8 42, ptr %idx.1706  %cond.exit = icmp eq i32 %i.next, %k707  br i1 %cond.exit, label %exit, label %loop708 709exit:710  ret void711}712