56 changes: 56 additions & 0 deletions polly/test/Simplify/coalesce_disjointelements.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Combine four partial stores into two.
; The stores write to the same array, but never the same element.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 21.0;
; A[1] = 42.0;
; A[0] = 21.0;
; A[1] = 42.0;
; }
;
define void @coalesce_disjointelements(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
%A_0 = getelementptr inbounds double, double* %A, i32 0
%A_1 = getelementptr inbounds double, double* %A, i32 1
store double 21.0, double* %A_0
store double 42.0, double* %A_1
store double 21.0, double* %A_0
store double 42.0, double* %A_1
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: Statistics {
; CHECK: Overwrites removed: 0
; CHECK: Partial writes coalesced: 2
; CHECK: }

; CHECK: After accesses {
; CHECK-NEXT: Stmt_body
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: [n] -> { Stmt_body[i0] -> MemRef_A[0] };
; CHECK-NEXT: new: [n] -> { Stmt_body[i0] -> MemRef_A[0] : n <= 2147483647 };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: [n] -> { Stmt_body[i0] -> MemRef_A[1] };
; CHECK-NEXT: new: [n] -> { Stmt_body[i0] -> MemRef_A[1] : n <= 2147483647 };
; CHECK-NEXT: }
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[1] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[1] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 > 16 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[1] : i0 > 16 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 <= 16 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[1] : i0 <= 16 }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
46 changes: 46 additions & 0 deletions polly/test/Simplify/coalesce_overlapping.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Combine two partial stores (with overlapping domains) into one.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 42.0;
; A[0] = 42.0;
; }
;
define void @coalesce_overlapping(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
store double 42.0, double* %A
store double 42.0, double* %A
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: Statistics {
; CHECK: Overwrites removed: 0
; CHECK: Partial writes coalesced: 1
; CHECK: }

; CHECK: After accesses {
; CHECK-NEXT: Stmt_body
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: [n] -> { Stmt_body[i0] -> MemRef_A[0] };
; CHECK-NEXT: new: [n] -> { Stmt_body[i0] -> MemRef_A[0] : n <= 2147483647 };
; CHECK-NEXT: }
28 changes: 28 additions & 0 deletions polly/test/Simplify/coalesce_overlapping___%for---%return.jscop
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 < 18 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 >= 8}"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
46 changes: 46 additions & 0 deletions polly/test/Simplify/coalesce_partial.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Combine two partial stores (with disjoint domains) into one.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 42.0;
; A[0] = 42.0;
; }
;
define void @coalesce_partial(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
store double 42.0, double* %A
store double 42.0, double* %A
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: Statistics {
; CHECK: Overwrites removed: 0
; CHECK: Partial writes coalesced: 1
; CHECK: }

; CHECK: After accesses {
; CHECK-NEXT: Stmt_body
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: [n] -> { Stmt_body[i0] -> MemRef_A[0] };
; CHECK-NEXT: new: [n] -> { Stmt_body[i0] -> MemRef_A[0] : n <= 2147483647 };
; CHECK-NEXT: }
28 changes: 28 additions & 0 deletions polly/test/Simplify/coalesce_partial___%for---%return.jscop
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 < 16 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 >= 16 }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
10 changes: 0 additions & 10 deletions polly/test/Simplify/gemm.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,6 @@
; }

; CHECK: After accesses {
; CHECK-NEXT: Stmt_bb10
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb10[i0, i1, i2] -> MemRef_tmp_0__phi[] };
; CHECK-NEXT: new: { Stmt_bb10[i0, i1, i2] -> MemRef_C[i0, i1] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb10[i0, i1, i2] -> MemRef_tmp_0[] };
; CHECK-NEXT: new: { Stmt_bb10[i0, i1, i2] -> MemRef_C[i0, i1] };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb10[i0, i1, i2] -> MemRef_tmp_0_lcssa__phi[] };
; CHECK-NEXT: new: { Stmt_bb10[i0, i1, 1024] -> MemRef_C[i0, i1] };
; CHECK-NEXT: Stmt_bb13
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_bb13[i0, i1, i2] -> MemRef_tmp_0__phi[] };
Expand Down
41 changes: 41 additions & 0 deletions polly/test/Simplify/nocoalesce_differentvalues.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Do not combine stores that write different values.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 21.0;
; A[0] = 42.0;
; }
;
define void @nocoalesce_differentvalues(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
store double 21.0, double* %A
store double 42.0, double* %A
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: Statistics {
; CHECK: Overwrites removed: 0
; CHECK: Partial writes coalesced: 0
; CHECK: }

; CHECK: SCoP could not be simplified
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 >= 16}"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 < 16}"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
39 changes: 39 additions & 0 deletions polly/test/Simplify/nocoalesce_elementmismatch.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Do not combine stores that do not write to different elements in the
; same instance.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 21.0;
; A[0] = 42.0;
; }
;
define void @nocoalesce_elementmismatch(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
%A_0 = getelementptr inbounds double, double* %A, i32 0
%A_1 = getelementptr inbounds double, double* %A, i32 1
store double 42.0, double* %A_0
store double 42.0, double* %A_1
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: SCoP could not be simplified
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[1] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 >= 16 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[1] : i0 <= 16}"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
53 changes: 53 additions & 0 deletions polly/test/Simplify/nocoalesce_readbetween.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Do not combine stores if there is a read between them.
; Note: The read between is unused, so will be removed by markAndSweep.
; However, searches for coalesces takes place before.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 42.0;
; tmp = A[0];
; A[0] = 42.0;
; }
;
define void @nocoalesce_readbetween(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
store double 42.0, double* %A
%tmp = load double, double* %A
store double 42.0, double* %A
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: Statistics {
; CHECK: Overwrites removed: 0
; CHECK: Partial writes coalesced: 0
; CHECK: }

; CHECK: After accesses {
; CHECK-NEXT: Stmt_body
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: [n] -> { Stmt_body[i0] -> MemRef_A[0] };
; CHECK-NEXT: new: [n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 >= 17 };
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: [n] -> { Stmt_body[i0] -> MemRef_A[0] };
; CHECK-NEXT: new: [n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 <= 16 };
; CHECK-NEXT: }
32 changes: 32 additions & 0 deletions polly/test/Simplify/nocoalesce_readbetween___%for---%return.jscop
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "read",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 > 16 }"
},
{
"kind" : "read",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 <= 16 }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
38 changes: 38 additions & 0 deletions polly/test/Simplify/nocoalesce_writebetween.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-postfix=transformed -polly-simplify -analyze < %s | FileCheck -match-full-lines %s
;
; Do not combine stores if there is a write between them.
;
; for (int j = 0; j < n; j += 1) {
; A[0] = 42.0;
; A[0] = 21.0;
; A[0] = 42.0;
; }
;
define void @nocoalesce_writebetween(i32 %n, double* noalias nonnull %A) {
entry:
br label %for

for:
%j = phi i32 [0, %entry], [%j.inc, %inc]
%j.cmp = icmp slt i32 %j, %n
br i1 %j.cmp, label %body, label %exit

body:
store double 42.0, double* %A
store double 21.0, double* %A
store double 42.0, double* %A
br label %inc

inc:
%j.inc = add nuw nsw i32 %j, 1
br label %for

exit:
br label %return

return:
ret void
}


; CHECK: SCoP could not be simplified
32 changes: 32 additions & 0 deletions polly/test/Simplify/nocoalesce_writebetween___%for---%return.jscop
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"arrays" : [
{
"name" : "MemRef_A",
"sizes" : [ "*" ],
"type" : "double"
}
],
"context" : "[n] -> { : -2147483648 <= n <= 2147483647 }",
"name" : "%for---%return",
"statements" : [
{
"accesses" : [
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 < 16 }"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : 8 <= i0 < 24}"
},
{
"kind" : "write",
"relation" : "[n] -> { Stmt_body[i0] -> MemRef_A[0] : i0 >= 16 }"
}
],
"domain" : "[n] -> { Stmt_body[i0] : 0 <= i0 < n }",
"name" : "Stmt_body",
"schedule" : "[n] -> { Stmt_body[i0] -> [i0] }"
}
]
}