Relax assert when setting access functions with invariant base pointers

Summary:
Instead of forbidding such access functions completely, we verify that their
base pointer has been hoisted and only assert in case the base pointer was
not hoisted.

I was trying for a little while to get a test case that ensures the assert is
correctly fired in case of invariant load hoisting being disabled, but I could
not find a good way to do so, as llvm-lit immediately aborts if a command
yields a non-zero return value. As we do not generally test our asserts,
not having a test case here seems OK.

This resolves http://llvm.org/PR31494

Suggested-by: Michael Kruse <llvm@meinersbur.de>

Reviewers: efriedma, jdoerfert, Meinersbur, gareevroman, sebpop, zinob, huihuiz, pollydev

Reviewed By: Meinersbur

Differential Revision: https://reviews.llvm.org/D28798

llvm-svn: 292213
This commit is contained in:
Tobias Grosser 2017-01-17 12:00:42 +00:00
parent e5cfc67113
commit e1ff0cf2eb
3 changed files with 16 additions and 12 deletions

View File

@ -1078,16 +1078,24 @@ void MemoryAccess::setNewAccessRelation(__isl_take isl_map *NewAccess) {
isl_set_free(NewDomain); isl_set_free(NewDomain);
isl_set_free(StmtDomain); isl_set_free(StmtDomain);
// Check whether access dimensions correspond to number of dimensions of the
// accesses array.
auto *NewAccessSpace = isl_space_range(NewSpace); auto *NewAccessSpace = isl_space_range(NewSpace);
assert(isl_space_has_tuple_id(NewAccessSpace, isl_dim_set) && assert(isl_space_has_tuple_id(NewAccessSpace, isl_dim_set) &&
"Must specify the array that is accessed"); "Must specify the array that is accessed");
auto *NewArrayId = isl_space_get_tuple_id(NewAccessSpace, isl_dim_set); auto *NewArrayId = isl_space_get_tuple_id(NewAccessSpace, isl_dim_set);
auto *SAI = static_cast<ScopArrayInfo *>(isl_id_get_user(NewArrayId)); auto *SAI = static_cast<ScopArrayInfo *>(isl_id_get_user(NewArrayId));
assert(SAI && "Must set a ScopArrayInfo"); assert(SAI && "Must set a ScopArrayInfo");
assert(!SAI->getBasePtrOriginSAI() &&
"Indirect array not supported by codegen"); if (SAI->isArrayKind() && SAI->getBasePtrOriginSAI()) {
InvariantEquivClassTy *EqClass =
getStatement()->getParent()->lookupInvariantEquivClass(
SAI->getBasePtr());
assert(EqClass &&
"Access functions to indirect arrays must have an invariant and "
"hoisted base pointer");
}
// Check whether access dimensions correspond to number of dimensions of the
// accesses array.
auto Dims = SAI->getNumberOfDimensions(); auto Dims = SAI->getNumberOfDimensions();
assert(isl_space_dim(NewAccessSpace, isl_dim_set) == Dims && assert(isl_space_dim(NewAccessSpace, isl_dim_set) == Dims &&
"Access dims must match array dims"); "Access dims must match array dims");

View File

@ -759,8 +759,6 @@ IslNodeBuilder::createNewAccesses(ScopStmt *Stmt,
} }
assert(MA->isAffine() && assert(MA->isAffine() &&
"Only affine memory accesses can be code generated"); "Only affine memory accesses can be code generated");
assert(!MA->getLatestScopArrayInfo()->getBasePtrOriginSAI() &&
"Generating new index expressions to indirect arrays not working");
auto Schedule = isl_ast_build_get_schedule(Build); auto Schedule = isl_ast_build_get_schedule(Build);

View File

@ -1,13 +1,11 @@
; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-dir=%S \ ; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-dir=%S \
; RUN: -polly-codegen -analyze 2 >&1 < %s | FileCheck %s ; RUN: -polly-codegen -polly-invariant-load-hoisting -S \
; RUN: 2>&1 < %s | FileCheck %s
; XFAIL: *
; Setting new access functions where the base pointer of the array that is newly ; 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 ; accessed is only loaded within the scop itself caused incorrect code to be
; generated when invariant load hoisting is disabled. Since r282893 we assert ; generated when invariant load hoisting is disabled. This test case checks
; in such situations. This test case was added to demonstrate what needs to be ; that in case invariant load hoisting is enabled, we generate correct code.
; resolved to support such access functions.
; CHECK: %polly.access.polly.access.X.load = getelementptr float, float* %polly.access.X.load, i64 %polly.indvar ; CHECK: %polly.access.polly.access.X.load = getelementptr float, float* %polly.access.X.load, i64 %polly.indvar