summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr.ll41
-rw-r--r--polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr___%loop---%exit.jscop54
2 files changed, 95 insertions, 0 deletions
diff --git a/polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr.ll b/polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr.ll
new file mode 100644
index 00000000000..b0e2436357c
--- /dev/null
+++ b/polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr.ll
@@ -0,0 +1,41 @@
+; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-dir=%S \
+; RUN: -polly-codegen -analyze 2 >&1 < %s | FileCheck %s
+
+; XFAIL: *
+
+; Setting new access functions where the base pointer of the array that is newly
+; accessed is only loaded within the scop itself caused incorrect code to be
+; generated when invariant load hoisting is disabled. Since r282893 we assert
+; in such situations. This test case was added to demonstrate what needs to be
+; resolved to support such access functions.
+
+define void @invariant_base_ptr(float* noalias %Array, float** noalias %X,
+ float* noalias %C) {
+
+start:
+ br label %loop
+
+loop:
+ %indvar = phi i64 [0, %start], [%indvar.next, %latch]
+ %indvar.next = add i64 %indvar, 1
+ %cmp = icmp slt i64 %indvar, 1024
+ br i1 %cmp, label %body, label %exit
+
+body:
+ %gep= getelementptr float, float* %Array, i64 %indvar
+ store float 42.0, float* %gep
+ br label %body2
+
+body2:
+ %Base = load float*, float** %X
+ %gep2 = getelementptr float, float* %Base, i64 %indvar
+ %val2 = load float, float* %gep2
+ store float %val2, float* %C
+ br label %latch
+
+latch:
+ br label %loop
+
+exit:
+ ret void
+}
diff --git a/polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr___%loop---%exit.jscop b/polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr___%loop---%exit.jscop
new file mode 100644
index 00000000000..94bfb2f59e3
--- /dev/null
+++ b/polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr___%loop---%exit.jscop
@@ -0,0 +1,54 @@
+{
+ "arrays" : [
+ {
+ "name" : "MemRef_Array",
+ "sizes" : [ "*" ],
+ "type" : "float"
+ },
+ {
+ "name" : "MemRef_X",
+ "sizes" : [ "*" ],
+ "type" : "float*"
+ },
+ {
+ "name" : "MemRef_Base",
+ "sizes" : [ "*" ],
+ "type" : "float"
+ },
+ {
+ "name" : "MemRef_C",
+ "sizes" : [ "*" ],
+ "type" : "float"
+ }
+ ],
+ "context" : "{ : }",
+ "name" : "%loop---%exit",
+ "statements" : [
+ {
+ "accesses" : [
+ {
+ "kind" : "write",
+ "relation" : "{ Stmt_body[i0] -> MemRef_Base[i0] }"
+ }
+ ],
+ "domain" : "{ Stmt_body[i0] : 0 <= i0 <= 1023 }",
+ "name" : "Stmt_body",
+ "schedule" : "{ Stmt_body[i0] -> [i0, 0] }"
+ },
+ {
+ "accesses" : [
+ {
+ "kind" : "read",
+ "relation" : "{ Stmt_body2[i0] -> MemRef_Base[i0] }"
+ },
+ {
+ "kind" : "write",
+ "relation" : "{ Stmt_body2[i0] -> MemRef_C[0] }"
+ }
+ ],
+ "domain" : "{ Stmt_body2[i0] : 0 <= i0 <= 1023 }",
+ "name" : "Stmt_body2",
+ "schedule" : "{ Stmt_body2[i0] -> [i0, 1] }"
+ }
+ ]
+}
OpenPOWER on IntegriCloud