summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen/IslAst.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/CodeGen/IslAst.cpp')
-rw-r--r--polly/lib/CodeGen/IslAst.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp
index 5b04a9eff55..60758138436 100644
--- a/polly/lib/CodeGen/IslAst.cpp
+++ b/polly/lib/CodeGen/IslAst.cpp
@@ -43,6 +43,8 @@
#include "isl/set.h"
#include "isl/union_map.h"
+#include <utility>
+
#define DEBUG_TYPE "polly-ast"
using namespace llvm;
@@ -55,6 +57,11 @@ static cl::opt<bool>
cl::desc("Generate thread parallel code (isl codegen only)"),
cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
+static cl::opt<bool> PrintAccesses("polly-ast-print-accesses",
+ cl::desc("Print memory access functions"),
+ cl::init(false), cl::ZeroOrMore,
+ cl::cat(PollyCategory));
+
static cl::opt<bool> PollyParallelForce(
"polly-parallel-force",
cl::desc(
@@ -559,6 +566,55 @@ IslAstInfo IslAstAnalysis::run(Scop &S, ScopAnalysisManager &SAM,
Dependences::AL_Statement)};
}
+static __isl_give isl_printer *cbPrintUser(__isl_take isl_printer *P,
+ __isl_take isl_ast_print_options *O,
+ __isl_keep isl_ast_node *Node,
+ void *User) {
+ isl::ast_node AstNode = isl::manage(isl_ast_node_copy(Node));
+ isl::ast_expr NodeExpr = AstNode.user_get_expr();
+ isl::ast_expr CallExpr = NodeExpr.get_op_arg(0);
+ isl::id CallExprId = CallExpr.get_id();
+ ScopStmt *AccessStmt = (ScopStmt *)CallExprId.get_user();
+
+ P = isl_printer_start_line(P);
+ P = isl_printer_print_str(P, AccessStmt->getBaseName());
+ P = isl_printer_print_str(P, "(");
+ P = isl_printer_end_line(P);
+ P = isl_printer_indent(P, 2);
+
+ for (MemoryAccess *MemAcc : *AccessStmt) {
+ P = isl_printer_start_line(P);
+
+ if (MemAcc->isRead())
+ P = isl_printer_print_str(P, "/* read */ &");
+ else
+ P = isl_printer_print_str(P, "/* write */ ");
+
+ isl::ast_build Build =
+ isl::manage(isl_ast_build_copy(IslAstInfo::getBuild(Node)));
+ if (MemAcc->isAffine()) {
+ isl_pw_multi_aff *PwmaPtr =
+ MemAcc->applyScheduleToAccessRelation(Build.get_schedule().release());
+ isl::pw_multi_aff Pwma = isl::manage(PwmaPtr);
+ isl::ast_expr AccessExpr = Build.access_from(Pwma);
+ P = isl_printer_print_ast_expr(P, AccessExpr.get());
+ } else {
+ P = isl_printer_print_str(
+ P, MemAcc->getLatestScopArrayInfo()->getName().c_str());
+ P = isl_printer_print_str(P, "[*]");
+ }
+ P = isl_printer_end_line(P);
+ }
+
+ P = isl_printer_indent(P, -2);
+ P = isl_printer_start_line(P);
+ P = isl_printer_print_str(P, ");");
+ P = isl_printer_end_line(P);
+
+ isl_ast_print_options_free(O);
+ return P;
+}
+
void IslAstInfo::print(raw_ostream &OS) {
isl_ast_print_options *Options;
isl_ast_node *RootNode = Ast.getAst();
@@ -580,6 +636,10 @@ void IslAstInfo::print(raw_ostream &OS) {
char *RtCStr, *AstStr;
Options = isl_ast_print_options_alloc(S.getIslCtx());
+
+ if (PrintAccesses)
+ Options =
+ isl_ast_print_options_set_print_user(Options, cbPrintUser, nullptr);
Options = isl_ast_print_options_set_print_for(Options, cbPrintFor, nullptr);
isl_printer *P = isl_printer_to_str(S.getIslCtx());
OpenPOWER on IntegriCloud