| 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] }" | ||
| } | ||
| ] | ||
| } |
| 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: } |
| 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] }" | ||
| } | ||
| ] | ||
| } |
| 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: } |
| 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] }" | ||
| } | ||
| ] | ||
| } |
| 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] }" | ||
| } | ||
| ] | ||
| } |
| 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] }" | ||
| } | ||
| ] | ||
| } |
| 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: } |
| 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] }" | ||
| } | ||
| ] | ||
| } |
| 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 |
| 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] }" | ||
| } | ||
| ] | ||
| } |