2015-06-29 22:44:22 +08:00
|
|
|
; RUN: opt %loadPolly -analyze -polly-scops -S < %s | FileCheck %s
|
|
|
|
;
|
|
|
|
; void foo(long n, float A[][n][n]) {
|
|
|
|
; for (long i = 0; i < 200; i++)
|
|
|
|
; for (long j = 0; j < n; j++)
|
|
|
|
; for (long k = 0; k < n; k++)
|
|
|
|
; A[i % 2][j][k] += 10;
|
|
|
|
; }
|
2016-01-15 08:48:42 +08:00
|
|
|
|
|
|
|
; CHECK: Statements {
|
|
|
|
; CHECK-NEXT: Stmt_for_body_8
|
|
|
|
; CHECK-NEXT: Domain :=
|
2016-01-15 23:54:45 +08:00
|
|
|
; CHECK-NEXT: [n] -> { Stmt_for_body_8[i0, i1, i2] : 0 <= i0 <= 199 and 0 <= i1 < n and 0 <= i2 < n };
|
2016-01-15 08:48:42 +08:00
|
|
|
; CHECK-NEXT: Schedule :=
|
|
|
|
; CHECK-NEXT: [n] -> { Stmt_for_body_8[i0, i1, i2] -> [i0, i1, i2] };
|
|
|
|
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
|
2016-01-15 23:54:45 +08:00
|
|
|
; CHECK-NEXT: [n] -> { Stmt_for_body_8[i0, i1, i2] -> MemRef_A[o0, i1, i2] : 2*floor((-i0 + o0)/2) = -i0 + o0 and 0 <= o0 <= 1 };
|
2016-01-15 08:48:42 +08:00
|
|
|
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
|
2016-01-15 23:54:45 +08:00
|
|
|
; CHECK-NEXT: [n] -> { Stmt_for_body_8[i0, i1, i2] -> MemRef_A[o0, i1, i2] : 2*floor((-i0 + o0)/2) = -i0 + o0 and 0 <= o0 <= 1 };
|
2016-01-15 08:48:42 +08:00
|
|
|
; CHECK-NEXT: }
|
2015-06-29 22:44:22 +08:00
|
|
|
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
|
|
|
|
|
|
|
|
define void @foo(i64 %n, float* %A) #0 {
|
|
|
|
entry:
|
|
|
|
br label %entry.split
|
|
|
|
|
|
|
|
entry.split: ; preds = %entry
|
|
|
|
br label %for.cond.1.preheader
|
|
|
|
|
|
|
|
for.cond.1.preheader: ; preds = %entry.split, %for.inc.14
|
|
|
|
%i.06 = phi i64 [ 0, %entry.split ], [ %inc15, %for.inc.14 ]
|
|
|
|
%cmp2.3 = icmp sgt i64 %n, 0
|
|
|
|
br i1 %cmp2.3, label %for.cond.5.preheader.lr.ph, label %for.inc.14
|
|
|
|
|
|
|
|
for.cond.5.preheader.lr.ph: ; preds = %for.cond.1.preheader
|
|
|
|
br label %for.cond.5.preheader
|
|
|
|
|
|
|
|
for.cond.5.preheader: ; preds = %for.cond.5.preheader.lr.ph, %for.inc.11
|
|
|
|
%j.04 = phi i64 [ 0, %for.cond.5.preheader.lr.ph ], [ %inc12, %for.inc.11 ]
|
|
|
|
%cmp6.1 = icmp sgt i64 %n, 0
|
|
|
|
br i1 %cmp6.1, label %for.body.8.lr.ph, label %for.inc.11
|
|
|
|
|
|
|
|
for.body.8.lr.ph: ; preds = %for.cond.5.preheader
|
|
|
|
br label %for.body.8
|
|
|
|
|
|
|
|
for.body.8: ; preds = %for.body.8.lr.ph, %for.body.8
|
|
|
|
%k.02 = phi i64 [ 0, %for.body.8.lr.ph ], [ %inc, %for.body.8 ]
|
|
|
|
%rem = srem i64 %i.06, 2
|
|
|
|
%0 = mul nuw i64 %n, %n
|
|
|
|
%1 = mul nsw i64 %0, %rem
|
|
|
|
%arrayidx = getelementptr inbounds float, float* %A, i64 %1
|
|
|
|
%2 = mul nsw i64 %j.04, %n
|
|
|
|
%arrayidx9 = getelementptr inbounds float, float* %arrayidx, i64 %2
|
|
|
|
%arrayidx10 = getelementptr inbounds float, float* %arrayidx9, i64 %k.02
|
|
|
|
%3 = load float, float* %arrayidx10, align 4, !tbaa !1
|
|
|
|
%add = fadd float %3, 1.000000e+01
|
|
|
|
store float %add, float* %arrayidx10, align 4, !tbaa !1
|
|
|
|
%inc = add nuw nsw i64 %k.02, 1
|
|
|
|
%exitcond = icmp ne i64 %inc, %n
|
|
|
|
br i1 %exitcond, label %for.body.8, label %for.cond.5.for.inc.11_crit_edge
|
|
|
|
|
|
|
|
for.cond.5.for.inc.11_crit_edge: ; preds = %for.body.8
|
|
|
|
br label %for.inc.11
|
|
|
|
|
|
|
|
for.inc.11: ; preds = %for.cond.5.for.inc.11_crit_edge, %for.cond.5.preheader
|
|
|
|
%inc12 = add nuw nsw i64 %j.04, 1
|
|
|
|
%exitcond7 = icmp ne i64 %inc12, %n
|
|
|
|
br i1 %exitcond7, label %for.cond.5.preheader, label %for.cond.1.for.inc.14_crit_edge
|
|
|
|
|
|
|
|
for.cond.1.for.inc.14_crit_edge: ; preds = %for.inc.11
|
|
|
|
br label %for.inc.14
|
|
|
|
|
|
|
|
for.inc.14: ; preds = %for.cond.1.for.inc.14_crit_edge, %for.cond.1.preheader
|
|
|
|
%inc15 = add nuw nsw i64 %i.06, 1
|
|
|
|
%exitcond8 = icmp ne i64 %inc15, 200
|
|
|
|
br i1 %exitcond8, label %for.cond.1.preheader, label %for.end.16
|
|
|
|
|
|
|
|
for.end.16: ; preds = %for.inc.14
|
|
|
|
ret void
|
|
|
|
}
|
|
|
|
|
|
|
|
; Function Attrs: nounwind
|
|
|
|
declare void @llvm.lifetime.start(i64, i8* nocapture) #1
|
|
|
|
|
|
|
|
; Function Attrs: nounwind
|
|
|
|
declare void @llvm.lifetime.end(i64, i8* nocapture) #1
|
|
|
|
|
|
|
|
attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|
|
attributes #1 = { nounwind }
|
|
|
|
|
|
|
|
!llvm.ident = !{!0}
|
|
|
|
|
|
|
|
!0 = !{!"clang version 3.7.0 (trunk 240923) (llvm/trunk 240924)"}
|
|
|
|
!1 = !{!2, !2, i64 0}
|
|
|
|
!2 = !{!"float", !3, i64 0}
|
|
|
|
!3 = !{!"omnipotent char", !4, i64 0}
|
|
|
|
!4 = !{!"Simple C/C++ TBAA"}
|