1; RUN: opt < %s -analyze -delinearize | FileCheck %s 2 3; #define MR(mt,n,r,c,d) mt->m[(n) * mt->mrows * mt->mcols * mt->mdeps + (r) * mt->mcols* mt->mdeps + (c) * mt->mdeps + (d)] 4; 5; struct Mat { 6; float* m; 7; int mnums; 8; int mrows; 9; int mcols; 10; int mdeps; 11; }; 12; 13; typedef struct Mat Matrix; 14; 15; void jacobi(int nn, Matrix* a, Matrix* p) 16; { 17; long i, j, k, max,jmax,kmax; 18; 19; p_rows_sub = p->mrows - 1; 20; p_cols_sub = p->mcols - 1; 21; p_deps_sub = p->mdeps - 1; 22; 23; for(i = 1; i < p_rows_sub; i++) 24; for(j = 1; j < p_cols_sub; j++) 25; for(k = 1; k < p_deps_sub; k++) 26; MR(a,0,i,j,k) = i + j + k; 27; } 28 29; AddRec: {{{(4 + (4 * (sext i32 %a.deps to i64) * (1 + (sext i32 %a.cols to i64))) + %a.base),+,(4 * (sext i32 %a.deps to i64) * (sext i32 %a.cols to i64))}<%for.i>,+,(4 * (sext i32 %a.deps to i64))}<%for.j>,+,4}<%for.k> 30; CHECK: Base offset: %a.base 31; CHECK: ArrayDecl[UnknownSize][(sext i32 %a.cols to i64)][(sext i32 %a.deps to i64)] with elements of sizeof(float) bytes. 32; CHECK: ArrayRef[{1,+,1}<nuw><nsw><%for.i>][{1,+,1}<nuw><nsw><%for.j>][{1,+,1}<nuw><nsw><%for.k>] 33 34; AddRec: {{(-4 + (4 * (sext i32 (-1 + %p.deps) to i64)) + (4 * (sext i32 %a.deps to i64) * (1 + (sext i32 %a.cols to i64))) + %a.base),+,(4 * (sext i32 %a.deps to i64) * (sext i32 %a.cols to i64))}<%for.i>,+,(4 * (sext i32 %a.deps to i64))}<%for.j> 35; CHECK: Base offset: %a.base 36; CHECK: ArrayDecl[UnknownSize][(sext i32 %a.deps to i64)] with elements of sizeof(float) bytes. 37; CHECK: ArrayRef[{(1 + (sext i32 %a.cols to i64)),+,(sext i32 %a.cols to i64)}<%for.i>][{(-1 + (sext i32 (-1 + %p.deps) to i64)),+,(sext i32 %a.deps to i64)}<%for.j>] 38 39; AddRec: {(-4 + (4 * (sext i32 (-1 + %p.deps) to i64)) + ((sext i32 %a.deps to i64) * (-4 + (4 * (sext i32 (-1 + %p.cols) to i64)) + (4 * (sext i32 %a.cols to i64)))) + %a.base),+,(4 * (sext i32 %a.deps to i64) * (sext i32 %a.cols to i64))}<%for.i> 40; CHECK: Base offset: %a.base 41; CHECK: ArrayDecl[UnknownSize] with elements of sizeof(float) bytes. 42; CHECK: ArrayRef[{(-1 + (sext i32 (-1 + %p.deps) to i64) + ((sext i32 %a.deps to i64) * (-1 + (sext i32 (-1 + %p.cols) to i64) + (sext i32 %a.cols to i64)))),+,((sext i32 %a.deps to i64) * (sext i32 %a.cols to i64))}<%for.i>] 43 44%struct.Mat = type { float*, i32, i32, i32, i32 } 45 46define void @jacobi(i32 %nn, %struct.Mat* nocapture %a, %struct.Mat* nocapture %p) nounwind uwtable { 47entry: 48 %p.rows.ptr = getelementptr inbounds %struct.Mat* %p, i64 0, i32 2 49 %p.rows = load i32* %p.rows.ptr 50 %p.rows.sub = add i32 %p.rows, -1 51 %p.rows.sext = sext i32 %p.rows.sub to i64 52 %p.cols.ptr = getelementptr inbounds %struct.Mat* %p, i64 0, i32 3 53 %p.cols = load i32* %p.cols.ptr 54 %p.cols.sub = add i32 %p.cols, -1 55 %p.cols.sext = sext i32 %p.cols.sub to i64 56 %p.deps.ptr = getelementptr inbounds %struct.Mat* %p, i64 0, i32 4 57 %p.deps = load i32* %p.deps.ptr 58 %p.deps.sub = add i32 %p.deps, -1 59 %p.deps.sext = sext i32 %p.deps.sub to i64 60 %a.cols.ptr = getelementptr inbounds %struct.Mat* %a, i64 0, i32 3 61 %a.cols = load i32* %a.cols.ptr 62 %a.cols.sext = sext i32 %a.cols to i64 63 %a.deps.ptr = getelementptr inbounds %struct.Mat* %a, i64 0, i32 4 64 %a.deps = load i32* %a.deps.ptr 65 %a.deps.sext = sext i32 %a.deps to i64 66 %a.base.ptr = getelementptr inbounds %struct.Mat* %a, i64 0, i32 0 67 %a.base = load float** %a.base.ptr, align 8 68 br label %for.i 69 70for.i: ; preds = %for.i.inc, %entry 71 %i = phi i64 [ %i.inc, %for.i.inc ], [ 1, %entry ] 72 br label %for.j 73 74for.j: ; preds = %for.j.inc, %for.i 75 %j = phi i64 [ %j.inc, %for.j.inc ], [ 1, %for.i ] 76 br label %for.k 77 78for.k: ; preds = %for.k, %for.j 79 %k = phi i64 [ 1, %for.j ], [ %k.inc, %for.k ] 80 %tmp1 = mul nsw i64 %a.cols.sext, %i 81 %tmp2 = add i64 %tmp1, %j 82 %tmp3 = mul i64 %tmp2, %a.deps.sext 83 %tmp4 = add nsw i64 %k, %tmp3 84 %arrayidx = getelementptr inbounds float* %a.base, i64 %tmp4 85 store float 1.000000e+00, float* %arrayidx 86 %k.inc = add nsw i64 %k, 1 87 %k.exitcond = icmp eq i64 %k.inc, %p.deps.sext 88 br i1 %k.exitcond, label %for.j.inc, label %for.k 89 90for.j.inc: ; preds = %for.k 91 %j.inc = add nsw i64 %j, 1 92 %j.exitcond = icmp eq i64 %j.inc, %p.cols.sext 93 br i1 %j.exitcond, label %for.i.inc, label %for.j 94 95for.i.inc: ; preds = %for.j.inc 96 %i.inc = add nsw i64 %i, 1 97 %i.exitcond = icmp eq i64 %i.inc, %p.rows.sext 98 br i1 %i.exitcond, label %end, label %for.i 99 100end: ; preds = %for.i.inc 101 ret void 102} 103