Skip to content

Commit

Permalink
[Acc] Do not statically dispatch into IslNodeBuilder's createFor
Browse files Browse the repository at this point in the history
Summary:
When GPUNodeBuilder creates loops inside the kernel, it dispatches to
IslNodeBuilder. This however is surprisingly dangerous, since it accesses the
AST Node's user through the wrong type. This patch fixes this problem by
overriding createFor correctly.

This fixes PR35010.

Reviewers: grosser, bollu, Meinersbur

Reviewed By: Meinersbur

Subscribers: Meinersbur, nemanjai, pollydev, llvm-commits, kbarton

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

llvm-svn: 316872
  • Loading branch information
pfaffe committed Oct 29, 2017
1 parent aa65159 commit 53c8038
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 9 deletions.
2 changes: 1 addition & 1 deletion polly/include/polly/CodeGen/IslNodeBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ class IslNodeBuilder {
bool preloadInvariantEquivClass(InvariantEquivClassTy &IAClass);

void createForVector(__isl_take isl_ast_node *For, int VectorWidth);
void createForSequential(__isl_take isl_ast_node *For, bool KnownParallel);
void createForSequential(__isl_take isl_ast_node *For, bool MarkParallel);

/// Create LLVM-IR that executes a for node thread parallel.
///
Expand Down
14 changes: 6 additions & 8 deletions polly/lib/CodeGen/IslNodeBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -530,7 +530,7 @@ static bool IsLoopVectorizerDisabled(isl::ast_node Node) {
}

void IslNodeBuilder::createForSequential(__isl_take isl_ast_node *For,
bool KnownParallel) {
bool MarkParallel) {
isl_ast_node *Body;
isl_ast_expr *Init, *Inc, *Iterator, *UB;
isl_id *IteratorID;
Expand All @@ -539,10 +539,6 @@ void IslNodeBuilder::createForSequential(__isl_take isl_ast_node *For,
BasicBlock *ExitBlock;
Value *IV;
CmpInst::Predicate Predicate;
bool Parallel;

Parallel = KnownParallel || (IslAstInfo::isParallel(For) &&
!IslAstInfo::isReductionParallel(For));

bool LoopVectorizerDisabled =
IsLoopVectorizerDisabled(isl::manage(isl_ast_node_copy(For)));
Expand Down Expand Up @@ -582,13 +578,13 @@ void IslNodeBuilder::createForSequential(__isl_take isl_ast_node *For,
bool UseGuardBB =
!SE.isKnownPredicate(Predicate, SE.getSCEV(ValueLB), SE.getSCEV(ValueUB));
IV = createLoop(ValueLB, ValueUB, ValueInc, Builder, LI, DT, ExitBlock,
Predicate, &Annotator, Parallel, UseGuardBB,
Predicate, &Annotator, MarkParallel, UseGuardBB,
LoopVectorizerDisabled);
IDToValue[IteratorID] = IV;

create(Body);

Annotator.popLoop(Parallel);
Annotator.popLoop(MarkParallel);

IDToValue.erase(IDToValue.find(IteratorID));

Expand Down Expand Up @@ -795,7 +791,9 @@ void IslNodeBuilder::createFor(__isl_take isl_ast_node *For) {
createForParallel(For);
return;
}
createForSequential(For, false);
bool Parallel =
(IslAstInfo::isParallel(For) && !IslAstInfo::isReductionParallel(For));
createForSequential(For, Parallel);
}

void IslNodeBuilder::createIf(__isl_take isl_ast_node *If) {
Expand Down
7 changes: 7 additions & 0 deletions polly/lib/CodeGen/PPCGCodeGeneration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,8 @@ class GPUNodeBuilder : public IslNodeBuilder {
/// @param UserStmt The ast node to generate code for.
virtual void createUser(__isl_take isl_ast_node *UserStmt);

virtual void createFor(__isl_take isl_ast_node *Node);

enum DataDirection { HOST_TO_DEVICE, DEVICE_TO_HOST };

/// Create code for a data transfer statement
Expand Down Expand Up @@ -1286,6 +1288,11 @@ void GPUNodeBuilder::createUser(__isl_take isl_ast_node *UserStmt) {
isl_ast_node_free(UserStmt);
return;
}

void GPUNodeBuilder::createFor(__isl_take isl_ast_node *Node) {
createForSequential(Node, false);
}

void GPUNodeBuilder::createKernelCopy(ppcg_kernel_stmt *KernelStmt) {
isl_ast_expr *LocalIndex = isl_ast_expr_copy(KernelStmt->u.c.local_index);
LocalIndex = isl_ast_expr_address_of(LocalIndex);
Expand Down

0 comments on commit 53c8038

Please sign in to comment.