[polly] r316872 - [Acc] Do not statically dispatch into IslNodeBuilder's createFor
Philip Pfaffe via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 29 14:36:34 PDT 2017
Author: pfaffe
Date: Sun Oct 29 14:36:34 2017
New Revision: 316872
URL: http://llvm.org/viewvc/llvm-project?rev=316872&view=rev
Log:
[Acc] Do not statically dispatch into IslNodeBuilder's createFor
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
Modified:
polly/trunk/include/polly/CodeGen/IslNodeBuilder.h
polly/trunk/lib/CodeGen/IslNodeBuilder.cpp
polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp
Modified: polly/trunk/include/polly/CodeGen/IslNodeBuilder.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/CodeGen/IslNodeBuilder.h?rev=316872&r1=316871&r2=316872&view=diff
==============================================================================
--- polly/trunk/include/polly/CodeGen/IslNodeBuilder.h (original)
+++ polly/trunk/include/polly/CodeGen/IslNodeBuilder.h Sun Oct 29 14:36:34 2017
@@ -351,7 +351,7 @@ protected:
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.
///
Modified: polly/trunk/lib/CodeGen/IslNodeBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslNodeBuilder.cpp?rev=316872&r1=316871&r2=316872&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/IslNodeBuilder.cpp (original)
+++ polly/trunk/lib/CodeGen/IslNodeBuilder.cpp Sun Oct 29 14:36:34 2017
@@ -530,7 +530,7 @@ static bool IsLoopVectorizerDisabled(isl
}
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;
@@ -539,10 +539,6 @@ void IslNodeBuilder::createForSequential
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)));
@@ -582,13 +578,13 @@ void IslNodeBuilder::createForSequential
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));
@@ -795,7 +791,9 @@ void IslNodeBuilder::createFor(__isl_tak
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) {
Modified: polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp?rev=316872&r1=316871&r2=316872&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp Sun Oct 29 14:36:34 2017
@@ -415,6 +415,8 @@ private:
/// @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
@@ -1286,6 +1288,11 @@ void GPUNodeBuilder::createUser(__isl_ta
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);
More information about the llvm-commits
mailing list