diff options
-rw-r--r-- | polly/lib/CodeGen/PPCGCodeGeneration.cpp | 18 | ||||
-rw-r--r-- | polly/lib/External/ppcg/gpu.c | 12 | ||||
-rw-r--r-- | polly/lib/External/ppcg/gpu.h | 11 |
3 files changed, 37 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/PPCGCodeGeneration.cpp b/polly/lib/CodeGen/PPCGCodeGeneration.cpp index d0921db4a7b..bb6ea8cd27e 100644 --- a/polly/lib/CodeGen/PPCGCodeGeneration.cpp +++ b/polly/lib/CodeGen/PPCGCodeGeneration.cpp @@ -41,6 +41,23 @@ static cl::opt<bool> DumpSchedule("polly-acc-dump-schedule", cl::desc("Dump the computed GPU Schedule"), cl::Hidden, cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory)); +/// Create the ast expressions for a ScopStmt. +/// +/// This function is a callback for to generate the ast expressions for each +/// of the scheduled ScopStmts. +static __isl_give isl_id_to_ast_expr *pollyBuildAstExprForStmt( + void *Stmt, isl_ast_build *Build, + isl_multi_pw_aff *(*FunctionIndex)(__isl_take isl_multi_pw_aff *MPA, + isl_id *Id, void *User), + void *UserIndex, + isl_ast_expr *(*FunctionExpr)(isl_ast_expr *Expr, isl_id *Id, void *User), + void *User_expr) { + + // TODO: Implement the AST expression generation. For now we just return a + // nullptr to ensure that we do not free uninitialized pointers. + + return nullptr; +} namespace { class PPCGCodeGeneration : public ScopPass { @@ -288,6 +305,7 @@ public: PPCGGen->options = PPCGScop->options; PPCGGen->print = nullptr; PPCGGen->print_user = nullptr; + PPCGGen->build_ast_expr = &pollyBuildAstExprForStmt; PPCGGen->prog = PPCGProg; PPCGGen->tree = nullptr; PPCGGen->types.n = 0; diff --git a/polly/lib/External/ppcg/gpu.c b/polly/lib/External/ppcg/gpu.c index 3eecf45656c..7bda56a4648 100644 --- a/polly/lib/External/ppcg/gpu.c +++ b/polly/lib/External/ppcg/gpu.c @@ -1453,6 +1453,7 @@ static int find_array_index(struct ppcg_kernel *kernel, const char *name) * to the current kernel. */ struct ppcg_transform_data { + struct ppcg_options *options; struct ppcg_kernel *kernel; struct gpu_stmt_access *accesses; isl_pw_multi_aff *iterator_map; @@ -1787,7 +1788,8 @@ static __isl_give isl_ast_expr *transform_expr(__isl_take isl_ast_expr *expr, */ static __isl_give isl_ast_node *create_domain_leaf( struct ppcg_kernel *kernel, __isl_take isl_ast_node *node, - __isl_keep isl_ast_build *build, struct gpu_stmt *gpu_stmt) + __isl_keep isl_ast_build *build, struct gpu_stmt *gpu_stmt, + struct gpu_gen *gen) { struct ppcg_transform_data data; struct ppcg_kernel_stmt *stmt; @@ -1822,10 +1824,9 @@ static __isl_give isl_ast_node *create_domain_leaf( data.accesses = stmt->u.d.stmt->accesses; data.iterator_map = iterator_map; data.sched2shared = sched2shared; - stmt->u.d.ref2expr = pet_stmt_build_ast_exprs(stmt->u.d.stmt->stmt, + stmt->u.d.ref2expr = gen->build_ast_expr(stmt->u.d.stmt->stmt, build, &transform_index, &data, &transform_expr, &data); - isl_pw_multi_aff_free(iterator_map); isl_pw_multi_aff_free(sched2shared); @@ -1944,6 +1945,7 @@ static __isl_give isl_ast_node *create_sync_leaf( */ struct ppcg_at_domain_data { struct gpu_prog *prog; + struct gpu_gen *gen; struct ppcg_kernel *kernel; }; @@ -1985,7 +1987,8 @@ static __isl_give isl_ast_node *at_domain(__isl_take isl_ast_node *node, isl_id_free(id); if (gpu_stmt) - return create_domain_leaf(data->kernel, node, build, gpu_stmt); + return create_domain_leaf(data->kernel, node, build, gpu_stmt, + data->gen); if (!prefixcmp(name, "to_device_") || !prefixcmp(name, "from_device_")) return node; @@ -2304,6 +2307,7 @@ static __isl_give isl_ast_node *generate_code(struct gpu_gen *gen, int depth; data.prog = gen->prog; + data.gen = gen; data.kernel = NULL; depth = 0; diff --git a/polly/lib/External/ppcg/gpu.h b/polly/lib/External/ppcg/gpu.h index c5009c0b2c2..7038901f1d7 100644 --- a/polly/lib/External/ppcg/gpu.h +++ b/polly/lib/External/ppcg/gpu.h @@ -148,6 +148,17 @@ struct gpu_gen { struct gpu_types *types, void *user); void *print_user; + isl_id_to_ast_expr *(*build_ast_expr)(void *stmt, + isl_ast_build *build, + isl_multi_pw_aff *(*fn_index)( + __isl_take isl_multi_pw_aff *mpa, isl_id *id, + void *user), + void *user_index, + isl_ast_expr *(*fn_expr)(isl_ast_expr *expr, + isl_id *id, void *user), + void *user_expr); + + struct gpu_prog *prog; /* The generated AST. */ isl_ast_node *tree; |