Imported Upstream version 5.18.0.205

Former-commit-id: 7f59f7e792705db773f1caecdaa823092f4e2927
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2018-11-16 08:20:38 +00:00
parent 5cd5df71cc
commit 8e12397d70
28486 changed files with 3867013 additions and 66 deletions

View File

@@ -0,0 +1,63 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
;
; void foo(long n, long m, long o, int A[n][m][o]) {
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; for (long k = 0; k < o; k++)
; A[2*i+3][3*j-4][5*k+7] = 1;
; }
; AddRec: {{{(28 + (4 * (-4 + (3 * %m)) * %o) + %A),+,(8 * %m * %o)}<%for.i>,+,(12 * %o)}<%for.j>,+,20}<%for.k>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m][%o] with elements of 4 bytes.
; CHECK: ArrayRef[{3,+,2}<%for.i>][{-4,+,3}<nw><%for.j>][{7,+,5}<nw><%for.k>]
define void @foo(i64 %n, i64 %m, i64 %o, i32* nocapture %A) #0 {
entry:
%cmp32 = icmp sgt i64 %n, 0
br i1 %cmp32, label %for.cond1.preheader.lr.ph, label %for.end17
for.cond1.preheader.lr.ph: ; preds = %entry
%cmp230 = icmp sgt i64 %m, 0
%cmp528 = icmp sgt i64 %o, 0
br i1 %cmp230, label %for.i, label %for.end17
for.inc15.us: ; preds = %for.inc12.us.us, %for.i
%inc16.us = add nsw i64 %i.033.us, 1
%exitcond55 = icmp eq i64 %inc16.us, %n
br i1 %exitcond55, label %for.end17, label %for.i
for.i: ; preds = %for.cond1.preheader.lr.ph, %for.inc15.us
%i.033.us = phi i64 [ %inc16.us, %for.inc15.us ], [ 0, %for.cond1.preheader.lr.ph ]
%mul8.us = shl i64 %i.033.us, 1
%add9.us = add nsw i64 %mul8.us, 3
%0 = mul i64 %add9.us, %m
%sub.us = add i64 %0, -4
br i1 %cmp528, label %for.j, label %for.inc15.us
for.inc12.us.us: ; preds = %for.k
%inc13.us.us = add nsw i64 %j.031.us.us, 1
%exitcond54 = icmp eq i64 %inc13.us.us, %m
br i1 %exitcond54, label %for.inc15.us, label %for.j
for.j: ; preds = %for.i, %for.inc12.us.us
%j.031.us.us = phi i64 [ %inc13.us.us, %for.inc12.us.us ], [ 0, %for.i ]
%mul7.us.us = mul nsw i64 %j.031.us.us, 3
%tmp.us.us = add i64 %sub.us, %mul7.us.us
%tmp27.us.us = mul i64 %tmp.us.us, %o
br label %for.k
for.k: ; preds = %for.k, %for.j
%k.029.us.us = phi i64 [ 0, %for.j ], [ %inc.us.us, %for.k ]
%mul.us.us = mul nsw i64 %k.029.us.us, 5
%arrayidx.sum.us.us = add i64 %mul.us.us, 7
%arrayidx10.sum.us.us = add i64 %arrayidx.sum.us.us, %tmp27.us.us
%arrayidx11.us.us = getelementptr inbounds i32, i32* %A, i64 %arrayidx10.sum.us.us
store i32 1, i32* %arrayidx11.us.us, align 4
%inc.us.us = add nsw i64 %k.029.us.us, 1
%exitcond = icmp eq i64 %inc.us.us, %o
br i1 %exitcond, label %for.inc12.us.us, label %for.k
for.end17: ; preds = %for.inc15.us, %for.cond1.preheader.lr.ph, %entry
ret void
}

View File

@@ -0,0 +1,80 @@
; RUN: opt -delinearize -analyze < %s | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
; CHECK: Inst: %tmp = load float, float* %arrayidx, align 4
; CHECK-NEXT: In Loop with Header: for.inc
; CHECK-NEXT: AccessFunction: {(4 * %N * %call),+,4}<nsw><%for.inc>
; CHECK-NEXT: Base offset: %A
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
; CHECK-NEXT: ArrayRef[%call][{0,+,1}<nuw><nsw><%for.inc>]
; CHECK: Inst: %tmp5 = load float, float* %arrayidx4, align 4
; CHECK-NEXT: In Loop with Header: for.inc
; CHECK-NEXT: AccessFunction: {(4 * %call1),+,(4 * %N)}<nsw><%for.inc>
; CHECK-NEXT: Base offset: %B
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
; CHECK-NEXT: ArrayRef[{0,+,1}<nuw><nsw><%for.inc>][%call1]
; Function Attrs: noinline nounwind uwtable
define void @mat_mul(float* %C, float* %A, float* %B, i64 %N) #0 !kernel_arg_addr_space !2 !kernel_arg_access_qual !3 !kernel_arg_type !4 !kernel_arg_base_type !4 !kernel_arg_type_qual !5 {
entry:
br label %entry.split
entry.split: ; preds = %entry
%call = tail call i64 @_Z13get_global_idj(i32 0) #3
%call1 = tail call i64 @_Z13get_global_idj(i32 1) #3
%cmp1 = icmp sgt i64 %N, 0
%mul = mul nsw i64 %call, %N
br i1 %cmp1, label %for.inc.lr.ph, label %for.end
for.inc.lr.ph: ; preds = %entry.split
br label %for.inc
for.inc: ; preds = %for.inc.lr.ph, %for.inc
%acc.03 = phi float [ 0.000000e+00, %for.inc.lr.ph ], [ %tmp6, %for.inc ]
%m.02 = phi i64 [ 0, %for.inc.lr.ph ], [ %inc, %for.inc ]
%add = add nsw i64 %m.02, %mul
%arrayidx = getelementptr inbounds float, float* %A, i64 %add
%tmp = load float, float* %arrayidx, align 4
%mul2 = mul nsw i64 %m.02, %N
%add3 = add nsw i64 %mul2, %call1
%arrayidx4 = getelementptr inbounds float, float* %B, i64 %add3
%tmp5 = load float, float* %arrayidx4, align 4
%tmp6 = tail call float @llvm.fmuladd.f32(float %tmp, float %tmp5, float %acc.03)
%inc = add nuw nsw i64 %m.02, 1
%exitcond = icmp ne i64 %inc, %N
br i1 %exitcond, label %for.inc, label %for.cond.for.end_crit_edge
for.cond.for.end_crit_edge: ; preds = %for.inc
%.lcssa = phi float [ %tmp6, %for.inc ]
br label %for.end
for.end: ; preds = %for.cond.for.end_crit_edge, %entry.split
%acc.0.lcssa = phi float [ %.lcssa, %for.cond.for.end_crit_edge ], [ 0.000000e+00, %entry.split ]
%add7 = add nsw i64 %mul, %call1
%arrayidx8 = getelementptr inbounds float, float* %C, i64 %add7
store float %acc.0.lcssa, float* %arrayidx8, align 4
ret void
}
; Function Attrs: nounwind readnone
declare i64 @_Z13get_global_idj(i32) #1
; Function Attrs: nounwind readnone speculatable
declare float @llvm.fmuladd.f32(float, float, float) #2
attributes #0 = { noinline nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind readnone speculatable }
attributes #3 = { nounwind readnone }
!llvm.module.flags = !{!0}
!llvm.ident = !{!1}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{!"clang version 5.0.0 (trunk 303846) (llvm/trunk 303834)"}
!2 = !{i32 1, i32 1, i32 1, i32 0}
!3 = !{!"none", !"none", !"none", !"none"}
!4 = !{!"float*", !"float*", !"float*", !"long"}
!5 = !{!"", !"", !"", !""}

View File

@@ -0,0 +1,70 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
target datalayout = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32"
; Check that division by 1 can be delinearized.
;
; void test1(unsigned char *dst, int stride, int bs) {
; for (int r = bs; r >= 0; --r)
; for (int c = 0; c < bs; ++c)
; dst[r * stride + c] = dst[(r + 1) * stride + c - 1];
; }
; AddRec: {{(-1 + ((1 + %bs) * %stride)),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nw><%for.body3>
; CHECK: Inst: %0 = load i8, i8* %arrayidx, align 1
; CHECK: Base offset: %dst
; CHECK: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
; CHECK: ArrayRef[{(1 + %bs),+,-1}<nw><%for.cond1.preheader>][{-1,+,1}<nw><%for.body3>]
; AddRec: {{(%stride * %bs),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nw><%for.body3>
; CHECK: Inst: store i8 %0, i8* %arrayidx7, align 1
; CHECK: Base offset: %dst
; CHECK: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
; CHECK: ArrayRef[{%bs,+,-1}<nsw><%for.cond1.preheader>][{0,+,1}<nuw><nsw><%for.body3>]
define void @test(i8* nocapture %dst, i32 %stride, i32 %bs) {
entry:
%cmp20 = icmp sgt i32 %bs, -1
br i1 %cmp20, label %for.cond1.preheader.lr.ph, label %for.end9
for.cond1.preheader.lr.ph:
%cmp218 = icmp slt i32 0, %bs
br label %for.cond1.preheader
for.cond1.preheader:
%r.021 = phi i32 [ %bs, %for.cond1.preheader.lr.ph ], [ %dec, %for.inc8 ]
br i1 %cmp218, label %for.body3.lr.ph, label %for.inc8
for.body3.lr.ph:
%add = add nsw i32 %r.021, 1
%mul = mul nsw i32 %add, %stride
%add4 = add i32 %mul, -1
%mul5 = mul nsw i32 %r.021, %stride
br label %for.body3
for.body3:
%c.019 = phi i32 [ 0, %for.body3.lr.ph ], [ %inc, %for.body3 ]
%sub = add i32 %add4, %c.019
%arrayidx = getelementptr inbounds i8, i8* %dst, i32 %sub
%0 = load i8, i8* %arrayidx, align 1
%add6 = add nsw i32 %c.019, %mul5
%arrayidx7 = getelementptr inbounds i8, i8* %dst, i32 %add6
store i8 %0, i8* %arrayidx7, align 1
%inc = add nsw i32 %c.019, 1
%cmp2 = icmp slt i32 %inc, %bs
br i1 %cmp2, label %for.body3, label %for.cond1.for.inc8_crit_edge
for.cond1.for.inc8_crit_edge:
br label %for.inc8
for.inc8:
%dec = add nsw i32 %r.021, -1
%cmp = icmp sgt i32 %dec, -1
br i1 %cmp, label %for.cond1.preheader, label %for.cond.for.end9_crit_edge
for.cond.for.end9_crit_edge:
br label %for.end9
for.end9:
ret void
}

View File

@@ -0,0 +1,153 @@
; RUN: opt < %s -basicaa -da -analyze -delinearize
;
; a, b, c, d, g, h;
; char *f;
; static fn1(p1) {
; char *e = p1;
; for (; d;) {
; a = 0;
; for (;; ++a)
; for (; b; ++b)
; c = e[b + a];
; }
; }
;
; fn2() {
; for (;;)
; fn1(&f[g * h]);
; }
@g = common global i32 0, align 4
@h = common global i32 0, align 4
@f = common global i8* null, align 4
@a = common global i32 0, align 4
@b = common global i32 0, align 4
@c = common global i32 0, align 4
@d = common global i32 0, align 4
define i32 @fn2() {
entry:
%.pr = load i32, i32* @d, align 4
%phitmp = icmp eq i32 %.pr, 0
br label %for.cond
for.cond:
%0 = phi i1 [ true, %for.cond ], [ %phitmp, %entry ]
br i1 %0, label %for.cond, label %for.cond2thread-pre-split.preheader.i
for.cond2thread-pre-split.preheader.i:
%1 = load i32, i32* @g, align 4
%2 = load i32, i32* @h, align 4
%mul = mul nsw i32 %2, %1
%3 = load i8*, i8** @f, align 4
%.pr.pre.i = load i32, i32* @b, align 4
br label %for.cond2thread-pre-split.i
for.cond2thread-pre-split.i:
%.pr.i = phi i32 [ 0, %for.inc5.i ], [ %.pr.pre.i, %for.cond2thread-pre-split.preheader.i ]
%storemerge.i = phi i32 [ %inc6.i, %for.inc5.i ], [ 0, %for.cond2thread-pre-split.preheader.i ]
store i32 %storemerge.i, i32* @a, align 4
%tobool31.i = icmp eq i32 %.pr.i, 0
br i1 %tobool31.i, label %for.inc5.i, label %for.body4.preheader.i
for.body4.preheader.i:
%4 = icmp slt i32 %.pr.i, -7
%add.i = add i32 %storemerge.i, %mul
br i1 %4, label %for.body4.i.preheader, label %for.body4.ur.i.preheader
for.body4.i.preheader:
%5 = sub i32 -8, %.pr.i
%6 = lshr i32 %5, 3
%7 = mul i32 %6, 8
br label %for.body4.i
for.body4.i:
%8 = phi i32 [ %inc.7.i, %for.body4.i ], [ %.pr.i, %for.body4.i.preheader ]
%arrayidx.sum1 = add i32 %add.i, %8
%arrayidx.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum1
%9 = load i8, i8* %arrayidx.i, align 1
%conv.i = sext i8 %9 to i32
store i32 %conv.i, i32* @c, align 4
%inc.i = add nsw i32 %8, 1
store i32 %inc.i, i32* @b, align 4
%arrayidx.sum2 = add i32 %add.i, %inc.i
%arrayidx.1.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum2
%10 = load i8, i8* %arrayidx.1.i, align 1
%conv.1.i = sext i8 %10 to i32
store i32 %conv.1.i, i32* @c, align 4
%inc.1.i = add nsw i32 %8, 2
store i32 %inc.1.i, i32* @b, align 4
%arrayidx.sum3 = add i32 %add.i, %inc.1.i
%arrayidx.2.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum3
%11 = load i8, i8* %arrayidx.2.i, align 1
%conv.2.i = sext i8 %11 to i32
store i32 %conv.2.i, i32* @c, align 4
%inc.2.i = add nsw i32 %8, 3
store i32 %inc.2.i, i32* @b, align 4
%arrayidx.sum4 = add i32 %add.i, %inc.2.i
%arrayidx.3.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum4
%12 = load i8, i8* %arrayidx.3.i, align 1
%conv.3.i = sext i8 %12 to i32
store i32 %conv.3.i, i32* @c, align 4
%inc.3.i = add nsw i32 %8, 4
store i32 %inc.3.i, i32* @b, align 4
%arrayidx.sum5 = add i32 %add.i, %inc.3.i
%arrayidx.4.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum5
%13 = load i8, i8* %arrayidx.4.i, align 1
%conv.4.i = sext i8 %13 to i32
store i32 %conv.4.i, i32* @c, align 4
%inc.4.i = add nsw i32 %8, 5
store i32 %inc.4.i, i32* @b, align 4
%arrayidx.sum6 = add i32 %add.i, %inc.4.i
%arrayidx.5.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum6
%14 = load i8, i8* %arrayidx.5.i, align 1
%conv.5.i = sext i8 %14 to i32
store i32 %conv.5.i, i32* @c, align 4
%inc.5.i = add nsw i32 %8, 6
store i32 %inc.5.i, i32* @b, align 4
%arrayidx.sum7 = add i32 %add.i, %inc.5.i
%arrayidx.6.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum7
%15 = load i8, i8* %arrayidx.6.i, align 1
%conv.6.i = sext i8 %15 to i32
store i32 %conv.6.i, i32* @c, align 4
%inc.6.i = add nsw i32 %8, 7
store i32 %inc.6.i, i32* @b, align 4
%arrayidx.sum8 = add i32 %add.i, %inc.6.i
%arrayidx.7.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum8
%16 = load i8, i8* %arrayidx.7.i, align 1
%conv.7.i = sext i8 %16 to i32
store i32 %conv.7.i, i32* @c, align 4
%inc.7.i = add nsw i32 %8, 8
store i32 %inc.7.i, i32* @b, align 4
%tobool3.7.i = icmp sgt i32 %inc.7.i, -8
br i1 %tobool3.7.i, label %for.inc5.loopexit.ur-lcssa.i, label %for.body4.i
for.inc5.loopexit.ur-lcssa.i:
%17 = add i32 %.pr.i, 8
%18 = add i32 %17, %7
%19 = icmp eq i32 %18, 0
br i1 %19, label %for.inc5.i, label %for.body4.ur.i.preheader
for.body4.ur.i.preheader:
%.ph = phi i32 [ %18, %for.inc5.loopexit.ur-lcssa.i ], [ %.pr.i, %for.body4.preheader.i ]
br label %for.body4.ur.i
for.body4.ur.i:
%20 = phi i32 [ %inc.ur.i, %for.body4.ur.i ], [ %.ph, %for.body4.ur.i.preheader ]
%arrayidx.sum = add i32 %add.i, %20
%arrayidx.ur.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum
%21 = load i8, i8* %arrayidx.ur.i, align 1
%conv.ur.i = sext i8 %21 to i32
store i32 %conv.ur.i, i32* @c, align 4
%inc.ur.i = add nsw i32 %20, 1
store i32 %inc.ur.i, i32* @b, align 4
%tobool3.ur.i = icmp eq i32 %inc.ur.i, 0
br i1 %tobool3.ur.i, label %for.inc5.i.loopexit, label %for.body4.ur.i
for.inc5.i.loopexit:
br label %for.inc5.i
for.inc5.i:
%inc6.i = add nsw i32 %storemerge.i, 1
br label %for.cond2thread-pre-split.i
}

View File

@@ -0,0 +1,92 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; #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)]
;
; struct Mat {
; float* m;
; int mnums;
; int mrows;
; int mcols;
; int mdeps;
; };
;
; typedef struct Mat Matrix;
;
; void jacobi(int nn, Matrix* a, Matrix* p)
; {
; long i, j, k, max,jmax,kmax;
;
; p_rows_sub = p->mrows - 1;
; p_cols_sub = p->mcols - 1;
; p_deps_sub = p->mdeps - 1;
;
; for(i = 1; i < p_rows_sub; i++)
; for(j = 1; j < p_cols_sub; j++)
; for(k = 1; k < p_deps_sub; k++)
; MR(a,0,i,j,k) = i + j + k;
; }
; 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>
; CHECK: Base offset: %a.base
; CHECK: ArrayDecl[UnknownSize][(sext i32 %a.cols to i64)][(sext i32 %a.deps to i64)] with elements of 4 bytes.
; CHECK: ArrayRef[{1,+,1}<nuw><nsw><%for.i>][{1,+,1}<nuw><nsw><%for.j>][{1,+,1}<nuw><nsw><%for.k>]
%struct.Mat = type { float*, i32, i32, i32, i32 }
define void @jacobi(i32 %nn, %struct.Mat* nocapture %a, %struct.Mat* nocapture %p) nounwind uwtable {
entry:
%p.rows.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %p, i64 0, i32 2
%p.rows = load i32, i32* %p.rows.ptr
%p.rows.sub = add i32 %p.rows, -1
%p.rows.sext = sext i32 %p.rows.sub to i64
%p.cols.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %p, i64 0, i32 3
%p.cols = load i32, i32* %p.cols.ptr
%p.cols.sub = add i32 %p.cols, -1
%p.cols.sext = sext i32 %p.cols.sub to i64
%p.deps.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %p, i64 0, i32 4
%p.deps = load i32, i32* %p.deps.ptr
%p.deps.sub = add i32 %p.deps, -1
%p.deps.sext = sext i32 %p.deps.sub to i64
%a.cols.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %a, i64 0, i32 3
%a.cols = load i32, i32* %a.cols.ptr
%a.deps.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %a, i64 0, i32 4
%a.deps = load i32, i32* %a.deps.ptr
%a.base.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %a, i64 0, i32 0
%a.base = load float*, float** %a.base.ptr, align 8
br label %for.i
for.i: ; preds = %for.i.inc, %entry
%i = phi i64 [ %i.inc, %for.i.inc ], [ 1, %entry ]
br label %for.j
for.j: ; preds = %for.j.inc, %for.i
%j = phi i64 [ %j.inc, %for.j.inc ], [ 1, %for.i ]
%a.cols.sext = sext i32 %a.cols to i64
%a.deps.sext = sext i32 %a.deps to i64
br label %for.k
for.k: ; preds = %for.k, %for.j
%k = phi i64 [ 1, %for.j ], [ %k.inc, %for.k ]
%tmp1 = mul nsw i64 %a.cols.sext, %i
%tmp2 = add i64 %tmp1, %j
%tmp3 = mul i64 %tmp2, %a.deps.sext
%tmp4 = add nsw i64 %k, %tmp3
%arrayidx = getelementptr inbounds float, float* %a.base, i64 %tmp4
store float 1.000000e+00, float* %arrayidx
%k.inc = add nsw i64 %k, 1
%k.exitcond = icmp eq i64 %k.inc, %p.deps.sext
br i1 %k.exitcond, label %for.j.inc, label %for.k
for.j.inc: ; preds = %for.k
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %p.cols.sext
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc: ; preds = %for.j.inc
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %p.rows.sext
br i1 %i.exitcond, label %end, label %for.i
end: ; preds = %for.i.inc
ret void
}

View File

@@ -0,0 +1,92 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; #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)]
;
; struct Mat {
; float* m;
; int mnums;
; int mrows;
; int mcols;
; int mdeps;
; };
;
; typedef struct Mat Matrix;
;
; void jacobi(int nn, Matrix* a, Matrix* p)
; {
; long i, j, k, max,jmax,kmax;
;
; p_rows_sub = p->mrows - 1;
; p_cols_sub = p->mcols - 1;
; p_deps_sub = p->mdeps - 1;
;
; for(i = 1; i < p_rows_sub; i++)
; for(j = 1; j < p_cols_sub; j++)
; for(k = 1; k < p_deps_sub; k++)
; MR(a,0,i,j,k) = i + j + k;
; }
; 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>
; CHECK: Base offset: %a.base
; CHECK: ArrayDecl[UnknownSize][(sext i32 %a.cols to i64)][(sext i32 %a.deps to i64)] with elements of 4 bytes.
; CHECK: ArrayRef[{1,+,1}<nuw><nsw><%for.i>][{1,+,1}<nuw><nsw><%for.j>][{1,+,1}<nuw><nsw><%for.k>]
%struct.Mat = type { float*, i32, i32, i32, i32 }
define void @jacobi(i32 %nn, %struct.Mat* nocapture %a, %struct.Mat* nocapture %p) nounwind uwtable {
entry:
%p.rows.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %p, i64 0, i32 2
%p.rows = load i32, i32* %p.rows.ptr
%p.rows.sub = add i32 %p.rows, -1
%p.rows.sext = sext i32 %p.rows.sub to i64
%p.cols.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %p, i64 0, i32 3
%p.cols = load i32, i32* %p.cols.ptr
%p.cols.sub = add i32 %p.cols, -1
%p.cols.sext = sext i32 %p.cols.sub to i64
%p.deps.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %p, i64 0, i32 4
%p.deps = load i32, i32* %p.deps.ptr
%p.deps.sub = add i32 %p.deps, -1
%p.deps.sext = sext i32 %p.deps.sub to i64
%a.cols.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %a, i64 0, i32 3
%a.cols = load i32, i32* %a.cols.ptr
%a.cols.sext = sext i32 %a.cols to i64
%a.deps.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %a, i64 0, i32 4
%a.deps = load i32, i32* %a.deps.ptr
%a.deps.sext = sext i32 %a.deps to i64
%a.base.ptr = getelementptr inbounds %struct.Mat, %struct.Mat* %a, i64 0, i32 0
%a.base = load float*, float** %a.base.ptr, align 8
br label %for.i
for.i: ; preds = %for.i.inc, %entry
%i = phi i64 [ %i.inc, %for.i.inc ], [ 1, %entry ]
br label %for.j
for.j: ; preds = %for.j.inc, %for.i
%j = phi i64 [ %j.inc, %for.j.inc ], [ 1, %for.i ]
br label %for.k
for.k: ; preds = %for.k, %for.j
%k = phi i64 [ 1, %for.j ], [ %k.inc, %for.k ]
%tmp1 = mul nsw i64 %a.cols.sext, %i
%tmp2 = add i64 %tmp1, %j
%tmp3 = mul i64 %tmp2, %a.deps.sext
%tmp4 = add nsw i64 %k, %tmp3
%arrayidx = getelementptr inbounds float, float* %a.base, i64 %tmp4
store float 1.000000e+00, float* %arrayidx
%k.inc = add nsw i64 %k, 1
%k.exitcond = icmp eq i64 %k.inc, %p.deps.sext
br i1 %k.exitcond, label %for.j.inc, label %for.k
for.j.inc: ; preds = %for.k
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %p.cols.sext
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc: ; preds = %for.j.inc
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %p.rows.sext
br i1 %i.exitcond, label %end, label %for.i
end: ; preds = %for.i.inc
ret void
}

View File

@@ -0,0 +1,45 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; Derived from the following code:
;
; void foo(long n, long m, long b, double A[n][m]) {
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; A[2i+b][2j] = 1.0;
; }
; AddRec: {{((%m * %b * 8) + %A),+,(2 * %m * 8)}<%for.i>,+,(2 * 8)}<%for.j>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m] with elements of 8 bytes.
; CHECK: ArrayRef[{%b,+,2}<nsw><%for.i>][{0,+,2}<%for.j>]
define void @foo(i64 %n, i64 %m, i64 %b, double* %A) {
entry:
br label %for.i
for.i:
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
%outerdim = mul nsw i64 %i, 2
%outerdim2 = add nsw i64 %outerdim, %b
%tmp = mul nsw i64 %outerdim2, %m
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j ]
%prodj = mul i64 %j, 2
%vlaarrayidx.sum = add i64 %prodj, %tmp
%arrayidx = getelementptr inbounds double, double* %A, i64 %vlaarrayidx.sum
store double 1.0, double* %arrayidx
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1 @@
config.suffixes = ['.ll']

View File

@@ -0,0 +1,58 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; void foo(long n, long m, long o, double A[n][m][o]) {
;
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; for (long k = 0; k < o; k++)
; A[i+3][j-4][k+7] = 1.0;
; }
; AddRec: {{{(56 + (8 * (-4 + (3 * %m)) * %o) + %A),+,(8 * %m * %o)}<%for.i>,+,(8 * %o)}<%for.j>,+,8}<%for.k>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m][%o] with elements of 8 bytes.
; CHECK: ArrayRef[{3,+,1}<nuw><%for.i>][{-4,+,1}<nw><%for.j>][{7,+,1}<nuw><nsw><%for.k>]
define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
entry:
br label %for.i
for.i:
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j.inc ]
br label %for.k
for.k:
%k = phi i64 [ 0, %for.j ], [ %k.inc, %for.k.inc ]
%offset0 = add nsw i64 %i, 3
%subscript0 = mul i64 %offset0, %m
%offset1 = add nsw i64 %j, -4
%subscript1 = add i64 %offset1, %subscript0
%subscript2 = mul i64 %subscript1, %o
%offset2 = add nsw i64 %k, 7
%subscript = add i64 %subscript2, %offset2
%idx = getelementptr inbounds double, double* %A, i64 %subscript
store double 1.0, double* %idx
br label %for.k.inc
for.k.inc:
%k.inc = add nsw i64 %k, 1
%k.exitcond = icmp eq i64 %k.inc, %o
br i1 %k.exitcond, label %for.j.inc, label %for.k
for.j.inc:
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1,62 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; void foo(long n, long m, long o, long p, double A[n][m][o+p]) {
;
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; for (long k = 0; k < o; k++)
; A[i+3][j-4][k+7] = 1.0;
; }
; AddRec: {{{(56 + (8 * (-4 + (3 * %m)) * (%o + %p)) + %A),+,(8 * (%o + %p) * %m)}<%for.cond4.preheader.lr.ph.us>,+,(8 * (%o + %p))}<%for.body6.lr.ph.us.us>,+,8}<%for.body6.us.us>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m][(%o + %p)] with elements of 8 bytes.
; CHECK: ArrayRef[{3,+,1}<nuw><%for.cond4.preheader.lr.ph.us>][{-4,+,1}<nw><%for.body6.lr.ph.us.us>][{7,+,1}<nw><%for.body6.us.us>]
define void @foo(i64 %n, i64 %m, i64 %o, i64 %p, double* nocapture %A) nounwind uwtable {
entry:
%add = add nsw i64 %p, %o
%cmp22 = icmp sgt i64 %n, 0
br i1 %cmp22, label %for.cond1.preheader.lr.ph, label %for.end16
for.cond1.preheader.lr.ph: ; preds = %entry
%cmp220 = icmp sgt i64 %m, 0
%cmp518 = icmp sgt i64 %o, 0
br i1 %cmp220, label %for.cond4.preheader.lr.ph.us, label %for.end16
for.inc14.us: ; preds = %for.cond4.preheader.lr.ph.us, %for.inc11.us.us
%inc15.us = add nsw i64 %i.023.us, 1
%exitcond43 = icmp eq i64 %inc15.us, %n
br i1 %exitcond43, label %for.end16, label %for.cond4.preheader.lr.ph.us
for.cond4.preheader.lr.ph.us: ; preds = %for.inc14.us, %for.cond1.preheader.lr.ph
%i.023.us = phi i64 [ %inc15.us, %for.inc14.us ], [ 0, %for.cond1.preheader.lr.ph ]
%add8.us = add nsw i64 %i.023.us, 3
%0 = mul i64 %add8.us, %m
%sub.us = add i64 %0, -4
br i1 %cmp518, label %for.body6.lr.ph.us.us, label %for.inc14.us
for.inc11.us.us: ; preds = %for.body6.us.us
%inc12.us.us = add nsw i64 %j.021.us.us, 1
%exitcond42 = icmp eq i64 %inc12.us.us, %m
br i1 %exitcond42, label %for.inc14.us, label %for.body6.lr.ph.us.us
for.body6.lr.ph.us.us: ; preds = %for.cond4.preheader.lr.ph.us, %for.inc11.us.us
%j.021.us.us = phi i64 [ %inc12.us.us, %for.inc11.us.us ], [ 0, %for.cond4.preheader.lr.ph.us ]
%tmp.us.us = add i64 %sub.us, %j.021.us.us
%tmp17.us.us = mul i64 %tmp.us.us, %add
br label %for.body6.us.us
for.body6.us.us: ; preds = %for.body6.us.us, %for.body6.lr.ph.us.us
%k.019.us.us = phi i64 [ 0, %for.body6.lr.ph.us.us ], [ %inc.us.us, %for.body6.us.us ]
%arrayidx.sum.us.us = add i64 %k.019.us.us, 7
%arrayidx9.sum.us.us = add i64 %arrayidx.sum.us.us, %tmp17.us.us
%arrayidx10.us.us = getelementptr inbounds double, double* %A, i64 %arrayidx9.sum.us.us
store double 1.000000e+00, double* %arrayidx10.us.us, align 8
%inc.us.us = add nsw i64 %k.019.us.us, 1
%exitcond = icmp eq i64 %inc.us.us, %o
br i1 %exitcond, label %for.inc11.us.us, label %for.body6.us.us
for.end16: ; preds = %for.cond1.preheader.lr.ph, %for.inc14.us, %entry
ret void
}

View File

@@ -0,0 +1,58 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; void foo(long n, long m, long o, double A[n][m][o], long p, long q, long r) {
;
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; for (long k = 0; k < o; k++)
; A[i+p][j+q][k+r] = 1.0;
; }
; AddRec: {{{((8 * ((((%m * %p) + %q) * %o) + %r)) + %A),+,(8 * %m * %o)}<%for.i>,+,(8 * %o)}<%for.j>,+,8}<%for.k>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m][%o] with elements of 8 bytes.
; CHECK: ArrayRef[{%p,+,1}<nw><%for.i>][{%q,+,1}<nw><%for.j>][{%r,+,1}<nsw><%for.k>]
define void @foo(i64 %n, i64 %m, i64 %o, double* %A, i64 %p, i64 %q, i64 %r) {
entry:
br label %for.i
for.i:
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j.inc ]
br label %for.k
for.k:
%k = phi i64 [ 0, %for.j ], [ %k.inc, %for.k.inc ]
%offset0 = add nsw i64 %i, %p
%subscript0 = mul i64 %offset0, %m
%offset1 = add nsw i64 %j, %q
%subscript1 = add i64 %offset1, %subscript0
%subscript2 = mul i64 %subscript1, %o
%offset2 = add nsw i64 %k, %r
%subscript = add i64 %subscript2, %offset2
%idx = getelementptr inbounds double, double* %A, i64 %subscript
store double 1.0, double* %idx
br label %for.k.inc
for.k.inc:
%k.inc = add nsw i64 %k, 1
%k.exitcond = icmp eq i64 %k.inc, %o
br i1 %k.exitcond, label %for.j.inc, label %for.k
for.j.inc:
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1,51 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; Derived from the following code:
;
; void foo(long n, long m, double A[n][m]) {
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; A[i][j] = 1.0;
; }
; Inst: %val = load double, double* %arrayidx
; In Loop with Header: for.j
; AddRec: {{0,+,(%m * 8)}<%for.i>,+,8}<%for.j>
; Base offset: %A
; ArrayDecl[UnknownSize][%m] with elements of 8 bytes.
; ArrayRef[{0,+,1}<nuw><nsw><%for.i>][{0,+,1}<nuw><nsw><%for.j>]
; Inst: store double %val, double* %arrayidx
; In Loop with Header: for.j
; AddRec: {{%A,+,(8 * %m)}<%for.i>,+,8}<%for.j>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m] with elements of 8 bytes.
; CHECK: ArrayRef[{0,+,1}<nuw><nsw><%for.i>][{0,+,1}<nuw><nsw><%for.j>]
define void @foo(i64 %n, i64 %m, double* %A) {
entry:
br label %for.i
for.i:
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
%tmp = mul nsw i64 %i, %m
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j ]
%vlaarrayidx.sum = add i64 %j, %tmp
%arrayidx = getelementptr inbounds double, double* %A, i64 %vlaarrayidx.sum
%val = load double, double* %arrayidx
store double %val, double* %arrayidx
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1,80 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; XFAIL: *
; We do not recognize anymore variable size arrays.
; extern void bar(long n, long m, double A[n][m]);
;
; void foo(long a, long b) {
; for (long n = 1; n < a; ++n)
; for (long m = 1; m < b; ++m) {
; double A[n][m];
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; A[i][j] = 1.0;
; bar(n, m, A);
; }
; }
; AddRec: {{%vla.us,+,{8,+,8}<%for.cond7.preheader.lr.ph.split.us.us>}<%for.body9.lr.ph.us.us>,+,8}<%for.body9.us.us>
; CHECK: Base offset: %vla.us
; CHECK: ArrayDecl[UnknownSize][{1,+,1}<%for.cond7.preheader.lr.ph.split.us.us>] with elements of sizeof(double) bytes.
; CHECK: ArrayRef[{0,+,1}<nuw><nsw><%for.body9.lr.ph.us.us>][{0,+,1}<nuw><nsw><%for.body9.us.us>]
define void @foo(i64 %a, i64 %b) nounwind uwtable {
entry:
%cmp43 = icmp sgt i64 %a, 1
br i1 %cmp43, label %for.cond1.preheader.lr.ph, label %for.end19
for.cond1.preheader.lr.ph: ; preds = %entry
%cmp224 = icmp sgt i64 %b, 1
br label %for.cond1.preheader
for.cond1.preheader: ; preds = %for.inc17, %for.cond1.preheader.lr.ph
%indvars.iv51 = phi i64 [ 1, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next52, %for.inc17 ]
br i1 %cmp224, label %for.cond7.preheader.lr.ph.split.us.us, label %for.inc17
for.end13.us: ; preds = %for.inc11.us.us
call void @bar(i64 %indvars.iv51, i64 %indvars.iv48, double* %vla.us) nounwind
call void @llvm.stackrestore(i8* %1)
%indvars.iv.next49 = add i64 %indvars.iv48, 1
%exitcond54 = icmp eq i64 %indvars.iv.next49, %b
br i1 %exitcond54, label %for.inc17, label %for.cond7.preheader.lr.ph.split.us.us
for.inc11.us.us: ; preds = %for.body9.us.us
%inc12.us.us = add nsw i64 %i.023.us.us, 1
%exitcond53 = icmp eq i64 %inc12.us.us, %indvars.iv51
br i1 %exitcond53, label %for.end13.us, label %for.body9.lr.ph.us.us
for.body9.lr.ph.us.us: ; preds = %for.cond7.preheader.lr.ph.split.us.us, %for.inc11.us.us
%i.023.us.us = phi i64 [ 0, %for.cond7.preheader.lr.ph.split.us.us ], [ %inc12.us.us, %for.inc11.us.us ]
%0 = mul nsw i64 %i.023.us.us, %indvars.iv48
br label %for.body9.us.us
for.body9.us.us: ; preds = %for.body9.us.us, %for.body9.lr.ph.us.us
%j.021.us.us = phi i64 [ 0, %for.body9.lr.ph.us.us ], [ %inc.us.us, %for.body9.us.us ]
%arrayidx.sum.us.us = add i64 %j.021.us.us, %0
%arrayidx10.us.us = getelementptr inbounds double, double* %vla.us, i64 %arrayidx.sum.us.us
store double 1.000000e+00, double* %arrayidx10.us.us, align 8
%inc.us.us = add nsw i64 %j.021.us.us, 1
%exitcond50 = icmp eq i64 %inc.us.us, %indvars.iv48
br i1 %exitcond50, label %for.inc11.us.us, label %for.body9.us.us
for.cond7.preheader.lr.ph.split.us.us: ; preds = %for.cond1.preheader, %for.end13.us
%indvars.iv48 = phi i64 [ %indvars.iv.next49, %for.end13.us ], [ 1, %for.cond1.preheader ]
%1 = call i8* @llvm.stacksave()
%2 = mul nuw i64 %indvars.iv48, %indvars.iv51
%vla.us = alloca double, i64 %2, align 16
br label %for.body9.lr.ph.us.us
for.inc17: ; preds = %for.end13.us, %for.cond1.preheader
%indvars.iv.next52 = add i64 %indvars.iv51, 1
%exitcond55 = icmp eq i64 %indvars.iv.next52, %a
br i1 %exitcond55, label %for.end19, label %for.cond1.preheader
for.end19: ; preds = %for.inc17, %entry
ret void
}
declare i8* @llvm.stacksave() nounwind
declare void @bar(i64, i64, double*)
declare void @llvm.stackrestore(i8*) nounwind

View File

@@ -0,0 +1,55 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; void foo(long n, long m, long o, double A[n][m][o]) {
;
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; for (long k = 0; k < o; k++)
; A[i][j][k] = 1.0;
; }
; AddRec: {{{%A,+,(8 * %m * %o)}<%for.i>,+,(8 * %o)}<%for.j>,+,8}<%for.k>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][%m][%o] with elements of 8 bytes.
; CHECK: ArrayRef[{0,+,1}<nuw><nsw><%for.i>][{0,+,1}<nuw><nsw><%for.j>][{0,+,1}<nuw><nsw><%for.k>]
define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
entry:
br label %for.i
for.i:
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j.inc ]
br label %for.k
for.k:
%k = phi i64 [ 0, %for.j ], [ %k.inc, %for.k.inc ]
%subscript0 = mul i64 %i, %m
%subscript1 = add i64 %j, %subscript0
%subscript2 = mul i64 %subscript1, %o
%subscript = add i64 %subscript2, %k
%idx = getelementptr inbounds double, double* %A, i64 %subscript
store double 1.0, double* %idx
br label %for.k.inc
for.k.inc:
%k.inc = add nsw i64 %k, 1
%k.exitcond = icmp eq i64 %k.inc, %o
br i1 %k.exitcond, label %for.j.inc, label %for.k
for.j.inc:
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1,65 @@
; RUN: opt < %s -analyze -delinearize | FileCheck %s
; void foo(int n, int m, int o, double A[n][m][o]) {
;
; for (int i = 0; i < n; i++)
; for (int j = 0; j < m; j++)
; for (int k = 0; k < o; k++)
; A[i][j][k] = 1.0;
; }
; AddRec: {{{%A,+,(8 * (zext i32 %m to i64) * (zext i32 %o to i64))}<%for.i>,+,(8 * (zext i32 %o to i64))}<%for.j>,+,8}<%for.k>
; CHECK: Base offset: %A
; CHECK: ArrayDecl[UnknownSize][(zext i32 %m to i64)][(zext i32 %o to i64)] with elements of 8 bytes.
; CHECK: ArrayRef[{0,+,1}<%for.i>][{0,+,1}<%for.j>][{0,+,1}<%for.k>]
target 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"
target triple = "x86_64-unknown-linux-gnu"
define void @foo(i32 %n, i32 %m, i32 %o, double* %A) {
entry:
%m_zext = zext i32 %m to i64
%n_zext = zext i32 %o to i64
br label %for.i
for.i:
%i = phi i64 [ %i.inc, %for.i.inc ], [ 0, %entry ]
br label %for.j
for.j:
%j = phi i64 [ %j.inc, %for.j.inc ], [ 0, %for.i ]
br label %for.k
for.k:
%k = phi i64 [ %k.inc, %for.k.inc ], [ 0, %for.j ]
%tmp = mul i64 %i, %m_zext
%tmp1 = trunc i64 %j to i32
%tmp2 = trunc i64 %i to i32
%mul.us.us = mul nsw i32 %tmp1, %tmp2
%tmp.us.us = add i64 %j, %tmp
%tmp17.us.us = mul i64 %tmp.us.us, %n_zext
%subscript = add i64 %tmp17.us.us, %k
%idx = getelementptr inbounds double, double* %A, i64 %subscript
store double 1.0, double* %idx
br label %for.k.inc
for.k.inc:
%k.inc = add i64 %k, 1
%k.inc.trunc = trunc i64 %k.inc to i32
%k.exitcond = icmp eq i32 %k.inc.trunc, %o
br i1 %k.exitcond, label %for.j.inc, label %for.k
for.j.inc:
%j.inc = add i64 %j, 1
%j.inc.trunc = trunc i64 %j.inc to i32
%j.exitcond = icmp eq i32 %j.inc.trunc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add i64 %i, 1
%i.inc.trunc = trunc i64 %i.inc to i32
%i.exitcond = icmp eq i32 %i.inc.trunc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1,43 @@
; RUN: opt -basicaa -da -analyze -da-delinearize < %s
target 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"
target triple = "x86_64-unknown-linux-gnu"
; Derived from the following code:
;
; void foo(long n, long m, double *A) {
; for (long i = 0; i < n; i++)
; for (long j = 0; j < m; j++)
; *(A + i * n + j) = 1.0;
; *(A + j * m + i) = 2.0;
; }
define void @foo(i64 %n, i64 %m, double* %A) {
entry:
br label %for.i
for.i:
%i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
br label %for.j
for.j:
%j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j ]
%tmp = mul nsw i64 %i, %m
%vlaarrayidx.sum = add i64 %j, %tmp
%arrayidx = getelementptr inbounds double, double* %A, i64 %vlaarrayidx.sum
store double 1.0, double* %arrayidx
%tmp1 = mul nsw i64 %j, %n
%vlaarrayidx.sum1 = add i64 %i, %tmp1
%arrayidx1 = getelementptr inbounds double, double* %A, i64 %vlaarrayidx.sum1
store double 1.0, double* %arrayidx1
%j.inc = add nsw i64 %j, 1
%j.exitcond = icmp eq i64 %j.inc, %m
br i1 %j.exitcond, label %for.i.inc, label %for.j
for.i.inc:
%i.inc = add nsw i64 %i, 1
%i.exitcond = icmp eq i64 %i.inc, %n
br i1 %i.exitcond, label %end, label %for.i
end:
ret void
}

View File

@@ -0,0 +1,56 @@
; RUN: opt -delinearize -analyze < %s | FileCheck %s
;
; void foo(float *A, long *p) {
; for (long i = 0; i < 100; i++)
; for (long j = 0; j < 100; j++)
; A[i * (*p) + j] += i + j;
; }
;
; CHECK: ArrayDecl[UnknownSize][%pval] with elements of 4 bytes.
; CHECK: ArrayRef[{0,+,1}<nuw><nsw><%bb2>][{0,+,1}<nuw><nsw><%bb4>]
;
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
define void @foo(float* %A, i64* %p) {
bb:
br label %bb2
bb2: ; preds = %bb16, %bb
%i.0 = phi i64 [ 0, %bb ], [ %tmp17, %bb16 ]
%exitcond1 = icmp ne i64 %i.0, 100
br i1 %exitcond1, label %bb3, label %bb18
bb3: ; preds = %bb2
br label %bb4
bb4: ; preds = %bb13, %bb3
%j.0 = phi i64 [ 0, %bb3 ], [ %tmp14, %bb13 ]
%exitcond = icmp ne i64 %j.0, 100
br i1 %exitcond, label %bb5, label %bb15
bb5: ; preds = %bb4
%tmp = add nuw nsw i64 %i.0, %j.0
%tmp6 = sitofp i64 %tmp to float
%pval = load i64, i64* %p, align 8
%tmp8 = mul nsw i64 %i.0, %pval
%tmp9 = add nsw i64 %tmp8, %j.0
%tmp10 = getelementptr inbounds float, float* %A, i64 %tmp9
%tmp11 = load float, float* %tmp10, align 4
%tmp12 = fadd float %tmp11, %tmp6
store float %tmp12, float* %tmp10, align 4
br label %bb13
bb13: ; preds = %bb5
%tmp14 = add nuw nsw i64 %j.0, 1
br label %bb4
bb15: ; preds = %bb4
br label %bb16
bb16: ; preds = %bb15
%tmp17 = add nuw nsw i64 %i.0, 1
br label %bb2
bb18: ; preds = %bb2
ret void
}

View File

@@ -0,0 +1,64 @@
; 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
}

View File

@@ -0,0 +1,29 @@
; RUN: opt < %s -analyze -delinearize
; REQUIRES: asserts
; Test that SCEV divide code doesn't crash when attempting to create a SCEV
; with operands of different types. In this case, the visitAddRecExpr
; function tries to create an AddRec where the start and step are different
; types.
target datalayout = "e-m:e-p:32:32-i64:64-a:0-v32:32-n16:32"
define fastcc void @test() {
entry:
%0 = load i16, i16* undef, align 2
%conv21 = zext i16 %0 to i32
br label %for.cond7.preheader
for.cond7.preheader:
%p1.022 = phi i8* [ undef, %entry ], [ %add.ptr, %for.end ]
br label %for.body11
for.body11:
%arrayidx.phi = phi i8* [ %p1.022, %for.cond7.preheader ], [ undef, %for.body11 ]
store i8 undef, i8* %arrayidx.phi, align 1
br i1 undef, label %for.body11, label %for.end
for.end:
%add.ptr = getelementptr inbounds i8, i8* %p1.022, i32 %conv21
br label %for.cond7.preheader
}

View File

@@ -0,0 +1,38 @@
; RUN: opt < %s -analyze -delinearize
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define void @foo(double* %Ey) {
entry:
br i1 undef, label %for.cond55.preheader, label %for.end324
for.cond55.preheader:
%iz.069 = phi i64 [ %inc323, %for.inc322 ], [ 0, %entry ]
br i1 undef, label %for.cond58.preheader, label %for.inc322
for.cond58.preheader:
%iy.067 = phi i64 [ %inc320, %for.end ], [ 0, %for.cond55.preheader ]
br i1 undef, label %for.body60, label %for.end
for.body60:
%ix.062 = phi i64 [ %inc, %for.body60 ], [ 0, %for.cond58.preheader ]
%0 = mul i64 %iz.069, undef
%tmp5 = add i64 %iy.067, %0
%tmp6 = mul i64 %tmp5, undef
%arrayidx69.sum = add i64 undef, %tmp6
%arrayidx70 = getelementptr inbounds double, double* %Ey, i64 %arrayidx69.sum
%1 = load double, double* %arrayidx70, align 8
%inc = add nsw i64 %ix.062, 1
br i1 false, label %for.body60, label %for.end
for.end:
%inc320 = add nsw i64 %iy.067, 1
br i1 undef, label %for.cond58.preheader, label %for.inc322
for.inc322:
%inc323 = add nsw i64 %iz.069, 1
br i1 undef, label %for.cond55.preheader, label %for.end324
for.end324:
ret void
}