diff options
| -rw-r--r-- | polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr.ll | 41 | ||||
| -rw-r--r-- | polly/test/Isl/CodeGen/MemAccess/invariant_base_ptr___%loop---%exit.jscop | 54 |
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] }" + } + ] +} |

