[polly] 4170d6c - [Polly][Ast] Partial refactoring of IslAst and IslAstInfo to use isl++. NFC.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 15 22:40:33 PDT 2021
Author: patacca
Date: 2021-04-16T00:40:26-05:00
New Revision: 4170d6cdd51f9c03110ca0fa8bcf4551fb95d569
URL: https://github.com/llvm/llvm-project/commit/4170d6cdd51f9c03110ca0fa8bcf4551fb95d569
DIFF: https://github.com/llvm/llvm-project/commit/4170d6cdd51f9c03110ca0fa8bcf4551fb95d569.diff
LOG: [Polly][Ast] Partial refactoring of IslAst and IslAstInfo to use isl++. NFC.
Polly use 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 following methods of class `IslAst`
- `getAst()` `getRunCondition()` `buildRunCondition()`
- Removed the destructor in favor of the default one
- Change the type of the attribute `IslAst.RunCondition` to `isl::ast_expr`
- Change the type of the attribute `IslAst.Root` to `isl::ast_node`
- Change the order of attributes in class `IslAst` to reflect the data dependencies so that the destructor won't complain
- Refactoring the following methods of class `IslAstInfo`
- `getAst()` `getRunCondition()`
Reviewed By: Meinersbur
Differential Revision: https://reviews.llvm.org/D100265
Added:
Modified:
polly/include/polly/CodeGen/IslAst.h
polly/lib/CodeGen/CodeGeneration.cpp
polly/lib/CodeGen/IslAst.cpp
polly/lib/CodeGen/PPCGCodeGeneration.cpp
Removed:
################################################################################
diff --git a/polly/include/polly/CodeGen/IslAst.h b/polly/include/polly/CodeGen/IslAst.h
index 4aa80e91ce684..f7e0b67162df8 100644
--- a/polly/include/polly/CodeGen/IslAst.h
+++ b/polly/include/polly/CodeGen/IslAst.h
@@ -37,19 +37,18 @@ class IslAst {
IslAst &operator=(const IslAst &) = delete;
IslAst(IslAst &&);
IslAst &operator=(IslAst &&) = delete;
- ~IslAst();
static IslAst create(Scop &Scop, const Dependences &D);
/// Print a source code representation of the program.
void pprint(raw_ostream &OS);
- __isl_give isl_ast_node *getAst();
+ isl::ast_node getAst();
const std::shared_ptr<isl_ctx> getSharedIslCtx() const { return Ctx; }
/// Get the run-time conditions for the Scop.
- __isl_give isl_ast_expr *getRunCondition();
+ isl::ast_expr getRunCondition();
/// Build run-time condition for scop.
///
@@ -57,14 +56,13 @@ class IslAst {
/// @param Build The isl_build object to use to build the condition.
///
/// @returns An ast expression that describes the necessary run-time check.
- static isl_ast_expr *buildRunCondition(Scop &S,
- __isl_keep isl_ast_build *Build);
+ static isl::ast_expr buildRunCondition(Scop &S, const isl::ast_build &Build);
private:
Scop &S;
- isl_ast_node *Root = nullptr;
- isl_ast_expr *RunCondition = nullptr;
std::shared_ptr<isl_ctx> Ctx;
+ isl::ast_expr RunCondition;
+ isl::ast_node Root;
IslAst(Scop &Scop);
@@ -120,7 +118,7 @@ class IslAstInfo {
IslAst &getIslAst() { return Ast; }
/// Return a copy of the AST root node.
- __isl_give isl_ast_node *getAst();
+ isl::ast_node getAst();
/// Get the run condition.
///
@@ -128,7 +126,7 @@ class IslAstInfo {
/// assumptions that have been taken hold. If the run condition evaluates to
/// zero/false some assumptions do not hold and the original code needs to
/// be executed.
- __isl_give isl_ast_expr *getRunCondition();
+ isl::ast_expr getRunCondition();
void print(raw_ostream &O);
diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp
index 01c64ee3c1012..c8addb97a592c 100644
--- a/polly/lib/CodeGen/CodeGeneration.cpp
+++ b/polly/lib/CodeGen/CodeGeneration.cpp
@@ -188,8 +188,8 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
}
// Check if we created an isl_ast root node, otherwise exit.
- isl_ast_node *AstRoot = Ast.getAst();
- if (!AstRoot)
+ isl::ast_node AstRoot = Ast.getAst();
+ if (AstRoot.is_null())
return false;
// Collect statistics. Do it before we modify the IR to avoid having it any
@@ -266,11 +266,9 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
assert(ExitingBB);
DT.changeImmediateDominator(MergeBlock, ExitingBB);
DT.eraseNode(ExitingBlock);
-
- isl_ast_node_free(AstRoot);
} else {
NodeBuilder.addParameters(S.getContext().release());
- Value *RTC = NodeBuilder.createRTC(AI.getRunCondition());
+ Value *RTC = NodeBuilder.createRTC(AI.getRunCondition().release());
Builder.GetInsertBlock()->getTerminator()->setOperand(0, RTC);
@@ -282,7 +280,7 @@ static bool CodeGen(Scop &S, IslAstInfo &AI, LoopInfo &LI, DominatorTree &DT,
// between polly.start and polly.exiting (at this point).
Builder.SetInsertPoint(StartBlock->getTerminator());
- NodeBuilder.create(AstRoot);
+ NodeBuilder.create(AstRoot.release());
NodeBuilder.finalize();
fixRegionInfo(*EnteringBB->getParent(), *R->getParent(), RI);
diff --git a/polly/lib/CodeGen/IslAst.cpp b/polly/lib/CodeGen/IslAst.cpp
index 9a70754205d85..cf63a592b7649 100644
--- a/polly/lib/CodeGen/IslAst.cpp
+++ b/polly/lib/CodeGen/IslAst.cpp
@@ -398,23 +398,22 @@ static isl::ast_expr buildCondition(Scop &S, isl::ast_build Build,
return NonAliasGroup;
}
-__isl_give isl_ast_expr *
-IslAst::buildRunCondition(Scop &S, __isl_keep isl_ast_build *Build) {
- isl_ast_expr *RunCondition;
+isl::ast_expr IslAst::buildRunCondition(Scop &S, const isl::ast_build &Build) {
+ isl::ast_expr RunCondition;
// The conditions that need to be checked at run-time for this scop are
// available as an isl_set in the runtime check context from which we can
// directly derive a run-time condition.
- auto *PosCond =
- isl_ast_build_expr_from_set(Build, S.getAssumedContext().release());
+ auto PosCond = Build.expr_from(S.getAssumedContext());
if (S.hasTrivialInvalidContext()) {
- RunCondition = PosCond;
+ RunCondition = std::move(PosCond);
} else {
- auto *ZeroV = isl_val_zero(isl_ast_build_get_ctx(Build));
- auto *NegCond =
- isl_ast_build_expr_from_set(Build, S.getInvalidContext().release());
- auto *NotNegCond = isl_ast_expr_eq(isl_ast_expr_from_val(ZeroV), NegCond);
- RunCondition = isl_ast_expr_and(PosCond, NotNegCond);
+ auto ZeroV = isl::val::zero(Build.get_ctx());
+ auto NegCond = Build.expr_from(S.getInvalidContext());
+ auto NotNegCond =
+ isl::ast_expr::from_val(std::move(ZeroV)).eq(std::move(NegCond));
+ RunCondition =
+ isl::manage(isl_ast_expr_and(PosCond.release(), NotNegCond.release()));
}
// Create the alias checks from the minimal/maximal accesses in each alias
@@ -429,15 +428,13 @@ IslAst::buildRunCondition(Scop &S, __isl_keep isl_ast_build *Build) {
for (auto RWAccIt0 = MinMaxReadWrite.begin(); RWAccIt0 != RWAccEnd;
++RWAccIt0) {
for (auto RWAccIt1 = RWAccIt0 + 1; RWAccIt1 != RWAccEnd; ++RWAccIt1)
- RunCondition = isl_ast_expr_and(
- RunCondition,
- buildCondition(S, isl::manage_copy(Build), RWAccIt0, RWAccIt1)
- .release());
+ RunCondition = isl::manage(isl_ast_expr_and(
+ RunCondition.release(),
+ buildCondition(S, Build, RWAccIt0, RWAccIt1).release()));
for (const Scop::MinMaxAccessTy &ROAccIt : MinMaxReadOnly)
- RunCondition = isl_ast_expr_and(
- RunCondition,
- buildCondition(S, isl::manage_copy(Build), RWAccIt0, &ROAccIt)
- .release());
+ RunCondition = isl::manage(isl_ast_expr_and(
+ RunCondition.release(),
+ buildCondition(S, Build, RWAccIt0, &ROAccIt).release()));
}
}
@@ -465,10 +462,10 @@ static bool benefitsFromPolly(Scop &Scop, bool PerformParallelTest) {
}
/// Collect statistics for the syntax tree rooted at @p Ast.
-static void walkAstForStatistics(__isl_keep isl_ast_node *Ast) {
- assert(Ast);
+static void walkAstForStatistics(const isl::ast_node &Ast) {
+ assert(!Ast.is_null());
isl_ast_node_foreach_descendant_top_down(
- Ast,
+ Ast.get(),
[](__isl_keep isl_ast_node *Node, void *User) -> isl_bool {
switch (isl_ast_node_get_type(Node)) {
case isl_ast_node_for:
@@ -502,15 +499,8 @@ static void walkAstForStatistics(__isl_keep isl_ast_node *Ast) {
IslAst::IslAst(Scop &Scop) : S(Scop), Ctx(Scop.getSharedIslCtx()) {}
IslAst::IslAst(IslAst &&O)
- : S(O.S), Root(O.Root), RunCondition(O.RunCondition), Ctx(O.Ctx) {
- O.Root = nullptr;
- O.RunCondition = nullptr;
-}
-
-IslAst::~IslAst() {
- isl_ast_node_free(Root);
- isl_ast_expr_free(RunCondition);
-}
+ : S(O.S), Ctx(O.Ctx), RunCondition(std::move(O.RunCondition)),
+ Root(std::move(O.Root)) {}
void IslAst::init(const Dependences &D) {
bool PerformParallelTest = PollyParallel || DetectParallel ||
@@ -557,9 +547,10 @@ void IslAst::init(const Dependences &D) {
&BuildInfo);
}
- RunCondition = buildRunCondition(S, Build);
+ RunCondition = buildRunCondition(S, isl::manage_copy(Build));
- Root = isl_ast_build_node_from_schedule(Build, S.getScheduleTree().release());
+ Root = isl::manage(
+ isl_ast_build_node_from_schedule(Build, S.getScheduleTree().release()));
walkAstForStatistics(Root);
isl_ast_build_free(Build);
@@ -571,15 +562,11 @@ IslAst IslAst::create(Scop &Scop, const Dependences &D) {
return Ast;
}
-__isl_give isl_ast_node *IslAst::getAst() { return isl_ast_node_copy(Root); }
-__isl_give isl_ast_expr *IslAst::getRunCondition() {
- return isl_ast_expr_copy(RunCondition);
-}
+isl::ast_node IslAst::getAst() { return Root; }
+isl::ast_expr IslAst::getRunCondition() { return RunCondition; }
-__isl_give isl_ast_node *IslAstInfo::getAst() { return Ast.getAst(); }
-__isl_give isl_ast_expr *IslAstInfo::getRunCondition() {
- return Ast.getRunCondition();
-}
+isl::ast_node IslAstInfo::getAst() { return Ast.getAst(); }
+isl::ast_expr IslAstInfo::getRunCondition() { return Ast.getRunCondition(); }
IslAstUserPayload *IslAstInfo::getNodePayload(const isl::ast_node &Node) {
isl::id Id = Node.get_annotation();
@@ -745,12 +732,12 @@ static __isl_give isl_printer *cbPrintUser(__isl_take isl_printer *P,
void IslAstInfo::print(raw_ostream &OS) {
isl_ast_print_options *Options;
- isl_ast_node *RootNode = Ast.getAst();
+ isl::ast_node RootNode = Ast.getAst();
Function &F = S.getFunction();
OS << ":: isl ast :: " << F.getName() << " :: " << S.getNameStr() << "\n";
- if (!RootNode) {
+ if (RootNode.is_null()) {
OS << ":: isl ast generation and code generation was skipped!\n\n";
OS << ":: This is either because no useful optimizations could be applied "
"(use -polly-process-unprofitable to enforce code generation) or "
@@ -760,7 +747,7 @@ void IslAstInfo::print(raw_ostream &OS) {
return;
}
- isl_ast_expr *RunCondition = Ast.getRunCondition();
+ isl::ast_expr RunCondition = Ast.getRunCondition();
char *RtCStr, *AstStr;
Options = isl_ast_print_options_alloc(S.getIslCtx().get());
@@ -772,11 +759,11 @@ void IslAstInfo::print(raw_ostream &OS) {
isl_printer *P = isl_printer_to_str(S.getIslCtx().get());
P = isl_printer_set_output_format(P, ISL_FORMAT_C);
- P = isl_printer_print_ast_expr(P, RunCondition);
+ P = isl_printer_print_ast_expr(P, RunCondition.get());
RtCStr = isl_printer_get_str(P);
P = isl_printer_flush(P);
P = isl_printer_indent(P, 4);
- P = isl_ast_node_print(RootNode, P, Options);
+ P = isl_ast_node_print(RootNode.get(), P, Options);
AstStr = isl_printer_get_str(P);
auto *Schedule = S.getScheduleTree().release();
@@ -793,9 +780,7 @@ void IslAstInfo::print(raw_ostream &OS) {
free(RtCStr);
free(AstStr);
- isl_ast_expr_free(RunCondition);
isl_schedule_free(Schedule);
- isl_ast_node_free(RootNode);
isl_printer_free(P);
}
diff --git a/polly/lib/CodeGen/PPCGCodeGeneration.cpp b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
index af5e91f83ef59..dd46cfb107c97 100644
--- a/polly/lib/CodeGen/PPCGCodeGeneration.cpp
+++ b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
@@ -3506,9 +3506,11 @@ class PPCGCodeGeneration : public ScopPass {
Builder.SetInsertPoint(SplitBlock->getTerminator());
isl_ast_build *Build = isl_ast_build_alloc(S->getIslCtx().get());
- isl_ast_expr *Condition = IslAst::buildRunCondition(*S, Build);
+ isl::ast_expr Condition =
+ IslAst::buildRunCondition(*S, isl::manage_copy(Build));
isl_ast_expr *SufficientCompute = createSufficientComputeCheck(*S, Build);
- Condition = isl_ast_expr_and(Condition, SufficientCompute);
+ Condition =
+ isl::manage(isl_ast_expr_and(Condition.release(), SufficientCompute));
isl_ast_build_free(Build);
// preload invariant loads. Note: This should happen before the RTC
@@ -3535,7 +3537,6 @@ class PPCGCodeGeneration : public ScopPass {
DT->changeImmediateDominator(MergeBlock, ExitingBB);
DT->eraseNode(ExitingBlock);
- isl_ast_expr_free(Condition);
isl_ast_node_free(Root);
} else {
@@ -3556,7 +3557,7 @@ class PPCGCodeGeneration : public ScopPass {
}
NodeBuilder.addParameters(S->getContext().release());
- Value *RTC = NodeBuilder.createRTC(Condition);
+ Value *RTC = NodeBuilder.createRTC(Condition.release());
Builder.GetInsertBlock()->getTerminator()->setOperand(0, RTC);
Builder.SetInsertPoint(&*StartBlock->begin());
More information about the llvm-commits
mailing list