| ; REQUIRES: asserts | 
 | ; RUN: opt < %s -analyze -delinearize -debug 2>&1 | FileCheck %s | 
 | ; void foo (int m, int n, char *A) { | 
 | ;    for (int i=0; i < m; i++) | 
 | ;      for(int j=0; j< n; j++) | 
 | ;        A[i*n+j] += 1; | 
 | ;} | 
 |  | 
 | ; ModuleID = 'delin.cpp' | 
 | ;target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" | 
 | ;target triple = "aarch64--linux-gnu" | 
 |  | 
 | ; CHECK-LABEL: Delinearization on function foo | 
 | ; CHECK: Inst:  %4 = load i8, i8* %arrayidx.us, align 1 | 
 | ; CHECK: Subscripts | 
 | ; CHECK-NEXT: {0,+,1}<nuw><nsw><%for.body3.lr.ph.us> | 
 | ; CHECK-NEXT: {0,+,1}<nuw><nsw><%for.body3.us> | 
 | ; CHECK: succeeded to delinearize | 
 |  | 
 | define void @foo(i32 %m, i32 %n, i8* nocapture %A) #0 { | 
 | entry: | 
 |   br label %entry.split | 
 |  | 
 | entry.split:                                      ; preds = %entry | 
 |   %cmp15 = icmp sgt i32 %m, 0 | 
 |   %cmp213 = icmp sgt i32 %n, 0 | 
 |   %or.cond = and i1 %cmp15, %cmp213 | 
 |   br i1 %or.cond, label %for.cond1.preheader.lr.ph.split.us, label %for.end8 | 
 |  | 
 | for.cond1.preheader.lr.ph.split.us:               ; preds = %entry.split | 
 |   %0 = add i32 %n, -1 | 
 |   %1 = sext i32 %n to i64 | 
 |   %2 = add i32 %m, -1 | 
 |   br label %for.body3.lr.ph.us | 
 |  | 
 | for.body3.us:                                     ; preds = %for.body3.us, %for.body3.lr.ph.us | 
 |   %indvars.iv = phi i64 [ 0, %for.body3.lr.ph.us ], [ %indvars.iv.next, %for.body3.us ] | 
 |   %3 = add nsw i64 %indvars.iv, %5 | 
 |   %arrayidx.us = getelementptr inbounds i8, i8* %A, i64 %3 | 
 |   %4 = load i8, i8* %arrayidx.us, align 1 | 
 |   %add4.us = add i8 %4, 1 | 
 |   store i8 %add4.us, i8* %arrayidx.us, align 1 | 
 |   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 | 
 |   %lftr.wideiv = trunc i64 %indvars.iv to i32 | 
 |   %exitcond = icmp eq i32 %lftr.wideiv, %0 | 
 |   br i1 %exitcond, label %for.cond1.for.inc6_crit_edge.us, label %for.body3.us | 
 |  | 
 | for.body3.lr.ph.us:                               ; preds = %for.cond1.for.inc6_crit_edge.us, %for.cond1.preheader.lr.ph.split.us | 
 |   %indvars.iv19 = phi i64 [ %indvars.iv.next20, %for.cond1.for.inc6_crit_edge.us ], [ 0, %for.cond1.preheader.lr.ph.split.us ] | 
 |   %5 = mul nsw i64 %indvars.iv19, %1 | 
 |   br label %for.body3.us | 
 |  | 
 | for.cond1.for.inc6_crit_edge.us:                  ; preds = %for.body3.us | 
 |   %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1 | 
 |   %lftr.wideiv22 = trunc i64 %indvars.iv19 to i32 | 
 |   %exitcond23 = icmp eq i32 %lftr.wideiv22, %2 | 
 |   br i1 %exitcond23, label %for.end8.loopexit, label %for.body3.lr.ph.us | 
 |  | 
 | for.end8.loopexit:                                ; preds = %for.cond1.for.inc6_crit_edge.us | 
 |   br label %for.end8 | 
 |  | 
 | for.end8:                                         ; preds = %for.end8.loopexit, %entry.split | 
 |   ret void | 
 | } |