From 2a629efc74e5ad414f05e293f296b392f724bc9f Mon Sep 17 00:00:00 2001 From: patacca Date: Fri, 18 Jun 2021 09:53:01 +0200 Subject: [PATCH] [Polly][Isl] Refactoring IslAstInfo::getBuild() and IslAstInfo::IslAstUserPayload::Build to use isl++. NFC Polly uses algorithms from the Integer Set Library (isl), which is a library written in C and which is incompatible with the rest of the LLVM as it is written in C++. Changes made: - Refactoring the method `IslAstInfo::getBuild()` - `IslAstInfo::IslAstUserPayload.Build` now uses C++ types instead of C types - Removing destructor of `IslAstInfo::IslAstUserPayload` Reviewed By: Meinersbur Differential Revision: https://reviews.llvm.org/D104370 --- polly/include/polly/CodeGen/IslAst.h | 7 ++---- polly/lib/CodeGen/IslAst.cpp | 24 +++++++-------------- polly/lib/CodeGen/IslNodeBuilder.cpp | 32 +++++++++++----------------- 3 files changed, 23 insertions(+), 40 deletions(-) diff --git a/polly/include/polly/CodeGen/IslAst.h b/polly/include/polly/CodeGen/IslAst.h index f7e0b67162df..bab4fce864a8 100644 --- a/polly/include/polly/CodeGen/IslAst.h +++ b/polly/include/polly/CodeGen/IslAst.h @@ -78,9 +78,6 @@ public: /// Construct and initialize the payload. IslAstUserPayload() = default; - /// Cleanup all isl structs on destruction. - ~IslAstUserPayload(); - /// Does the dependence analysis determine that there are no loop-carried /// dependencies? bool IsParallel = false; @@ -101,7 +98,7 @@ public: isl::pw_aff MinimalDependenceDistance; /// The build environment at the time this node was constructed. - isl_ast_build *Build = nullptr; + isl::ast_build Build; /// Set of accesses which break reduction dependences. MemoryAccessSet BrokenReductions; @@ -164,7 +161,7 @@ public: static MemoryAccessSet *getBrokenReductions(const isl::ast_node &Node); /// Get the nodes build context or a nullptr if not available. - static __isl_give isl_ast_build *getBuild(__isl_keep isl_ast_node *Node); + static isl::ast_build getBuild(const isl::ast_node &Node); ///} }; diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp index 50a59092c475..ddb78ab62bcc 100644 --- a/polly/lib/CodeGen/IslAst.cpp +++ b/polly/lib/CodeGen/IslAst.cpp @@ -124,10 +124,6 @@ static void freeIslAstUserPayload(void *Ptr) { delete ((IslAstInfo::IslAstUserPayload *)Ptr); } -IslAstInfo::IslAstUserPayload::~IslAstUserPayload() { - isl_ast_build_free(Build); -} - /// Print a string @p str in a single line using @p Printer. static isl_printer *printLine(__isl_take isl_printer *Printer, const std::string &str, @@ -286,8 +282,8 @@ astBuildAfterFor(__isl_take isl_ast_node *Node, __isl_keep isl_ast_build *Build, assert(Payload && "Post order visit assumes annotated for nodes"); AstBuildUserInfo *BuildInfo = (AstBuildUserInfo *)User; - assert(!Payload->Build && "Build environment already set"); - Payload->Build = isl_ast_build_copy(Build); + assert(Payload->Build.is_null() && "Build environment already set"); + Payload->Build = isl::manage_copy(Build); Payload->IsInnermost = (Id == BuildInfo->LastForNodeId); Payload->IsInnermostParallel = @@ -333,7 +329,7 @@ static __isl_give isl_ast_node *AtEachDomain(__isl_take isl_ast_node *Node, isl_id *Id = isl_id_alloc(isl_ast_build_get_ctx(Build), "", Payload); Id = isl_id_set_free_user(Id, freeIslAstUserPayload); - Payload->Build = isl_ast_build_copy(Build); + Payload->Build = isl::manage_copy(Build); return isl_ast_node_set_annotation(Node, Id); } @@ -622,11 +618,7 @@ bool IslAstInfo::isExecutedInParallel(const isl::ast_node &Node) { isl::union_map IslAstInfo::getSchedule(const isl::ast_node &Node) { IslAstUserPayload *Payload = getNodePayload(Node); - if (!Payload) - return {}; - - isl::ast_build Build = isl::manage_copy(Payload->Build); - return Build.get_schedule(); + return Payload ? Payload->Build.get_schedule() : isl::union_map(); } isl::pw_aff @@ -641,9 +633,9 @@ IslAstInfo::getBrokenReductions(const isl::ast_node &Node) { return Payload ? &Payload->BrokenReductions : nullptr; } -isl_ast_build *IslAstInfo::getBuild(__isl_keep isl_ast_node *Node) { - IslAstUserPayload *Payload = getNodePayload(isl::manage_copy(Node)); - return Payload ? Payload->Build : nullptr; +isl::ast_build IslAstInfo::getBuild(const isl::ast_node &Node) { + IslAstUserPayload *Payload = getNodePayload(Node); + return Payload ? Payload->Build : isl::ast_build(); } static std::unique_ptr runIslAst( @@ -706,7 +698,7 @@ static __isl_give isl_printer *cbPrintUser(__isl_take isl_printer *P, else P = isl_printer_print_str(P, "/* write */ "); - isl::ast_build Build = isl::manage_copy(IslAstInfo::getBuild(Node)); + isl::ast_build Build = IslAstInfo::getBuild(isl::manage_copy(Node)); if (MemAcc->isAffine()) { isl_pw_multi_aff *PwmaPtr = MemAcc->applyScheduleToAccessRelation(Build.get_schedule()).release(); diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp index e9675c9a5683..2cf958bc2a8a 100644 --- a/polly/lib/CodeGen/IslNodeBuilder.cpp +++ b/polly/lib/CodeGen/IslNodeBuilder.cpp @@ -850,12 +850,12 @@ void IslNodeBuilder::createIf(__isl_take isl_ast_node *If) { __isl_give isl_id_to_ast_expr * IslNodeBuilder::createNewAccesses(ScopStmt *Stmt, __isl_keep isl_ast_node *Node) { - isl_id_to_ast_expr *NewAccesses = - isl_id_to_ast_expr_alloc(Stmt->getParent()->getIslCtx().get(), 0); + isl::id_to_ast_expr NewAccesses = + isl::id_to_ast_expr::alloc(Stmt->getParent()->getIslCtx(), 0); - auto *Build = IslAstInfo::getBuild(Node); - assert(Build && "Could not obtain isl_ast_build from user node"); - Stmt->setAstBuild(isl::manage_copy(Build)); + isl::ast_build Build = IslAstInfo::getBuild(isl::manage_copy(Node)); + assert(!Build.is_null() && "Could not obtain isl_ast_build from user node"); + Stmt->setAstBuild(Build); for (auto *MA : *Stmt) { if (!MA->hasNewAccessRelation()) { @@ -876,13 +876,12 @@ IslNodeBuilder::createNewAccesses(ScopStmt *Stmt, assert(MA->isAffine() && "Only affine memory accesses can be code generated"); - auto Schedule = isl_ast_build_get_schedule(Build); + isl::union_map Schedule = Build.get_schedule(); #ifndef NDEBUG if (MA->isRead()) { auto Dom = Stmt->getDomain().release(); - auto SchedDom = isl_set_from_union_set( - isl_union_map_domain(isl_union_map_copy(Schedule))); + auto SchedDom = isl_set_from_union_set(Schedule.domain().release()); auto AccDom = isl_map_domain(MA->getAccessRelation().release()); Dom = isl_set_intersect_params(Dom, Stmt->getParent()->getContext().release()); @@ -898,25 +897,20 @@ IslNodeBuilder::createNewAccesses(ScopStmt *Stmt, } #endif - auto PWAccRel = - MA->applyScheduleToAccessRelation(isl::manage(Schedule)).release(); + isl::pw_multi_aff PWAccRel = MA->applyScheduleToAccessRelation(Schedule); // isl cannot generate an index expression for access-nothing accesses. - isl::set AccDomain = - isl::manage(isl_pw_multi_aff_domain(isl_pw_multi_aff_copy(PWAccRel))); + isl::set AccDomain = PWAccRel.domain(); isl::set Context = S.getContext(); AccDomain = AccDomain.intersect_params(Context); - if (AccDomain.is_empty()) { - isl_pw_multi_aff_free(PWAccRel); + if (AccDomain.is_empty()) continue; - } - auto AccessExpr = isl_ast_build_access_from_pw_multi_aff(Build, PWAccRel); - NewAccesses = - isl_id_to_ast_expr_set(NewAccesses, MA->getId().release(), AccessExpr); + isl::ast_expr AccessExpr = Build.access_from(PWAccRel); + NewAccesses = NewAccesses.set(MA->getId(), AccessExpr); } - return NewAccesses; + return NewAccesses.release(); } void IslNodeBuilder::createSubstitutions(__isl_take isl_ast_expr *Expr,