From 9cf4a0621f64534ea821ce1e2486785d07bff790 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Staff=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Tue, 2 Oct 2018 19:03:25 +0900 Subject: [PATCH] [enco] Dead Bag Elimination as an independent module (#1726) This commit introduces "DeadBagElimination" module (header and source) which includes the declaration and implementation of 'eliminate_dead_bag'. Previously, the declaration and implementation was in Optimizations module. Signed-off-by: Jonghyun Park --- contrib/enco/core/src/Backend.cpp | 1 + .../core/src/Transforms/DeadBagElimination.cpp | 72 ++++++++++++++++++++++ .../enco/core/src/Transforms/DeadBagElimination.h | 37 +++++++++++ contrib/enco/core/src/Transforms/Optimizations.cpp | 58 ----------------- contrib/enco/core/src/Transforms/Optimizations.h | 10 --- 5 files changed, 110 insertions(+), 68 deletions(-) create mode 100644 contrib/enco/core/src/Transforms/DeadBagElimination.cpp create mode 100644 contrib/enco/core/src/Transforms/DeadBagElimination.h diff --git a/contrib/enco/core/src/Backend.cpp b/contrib/enco/core/src/Backend.cpp index c97ee5f..d11bd44 100644 --- a/contrib/enco/core/src/Backend.cpp +++ b/contrib/enco/core/src/Backend.cpp @@ -29,6 +29,7 @@ #include "Transforms/IdenticalObjectReduction.h" #include "Transforms/DuplicatedObjectReduction.h" #include "Transforms/DeadObjectElimination.h" +#include "Transforms/DeadBagElimination.h" #include "Transforms/Optimizations.h" #include "Transforms/Split.h" diff --git a/contrib/enco/core/src/Transforms/DeadBagElimination.cpp b/contrib/enco/core/src/Transforms/DeadBagElimination.cpp new file mode 100644 index 0000000..8c0dd7a --- /dev/null +++ b/contrib/enco/core/src/Transforms/DeadBagElimination.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DeadBagElimination.h" + +#include + +namespace +{ + +// @brief Return true if a given bag is marked as either input or output +bool is_public(const coco::Bag *b) { return b->isInput() || b->isOutput(); } + +// @brief Return the set of "dead" bags in a given module +std::set dead_bags(const coco::Module *m) +{ + std::set res; + + for (uint32_t n = 0; n < m->entity()->bag()->size(); ++n) + { + auto bag = m->entity()->bag()->at(n); + + if (coco::readers(bag).empty() && !is_public(bag)) + { + res.insert(bag); + } + } + + return res; +} + +} // namespace + +namespace enco +{ + +void eliminate_dead_bag(enco::Code *code) +{ + auto m = code->module(); + + // Destroy a dead bag and its updaters + for (auto bag : dead_bags(m)) + { + for (auto updater : coco::updaters(bag)) + { + auto ins = updater->loc(); + + assert(ins != nullptr); + + ins->detach(); + m->entity()->instr()->destroy(ins); + } + + bag->replaceWith(nullptr); + m->entity()->bag()->destroy(bag); + } +} + +} // namespace enco diff --git a/contrib/enco/core/src/Transforms/DeadBagElimination.h b/contrib/enco/core/src/Transforms/DeadBagElimination.h new file mode 100644 index 0000000..ab81cb2 --- /dev/null +++ b/contrib/enco/core/src/Transforms/DeadBagElimination.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __ENCO_TRANSFORM_DEAD_BAG_ELIMINATION_H__ +#define __ENCO_TRANSFORM_DEAD_BAG_ELIMINATION_H__ + +#include "Code.h" + +namespace enco +{ + +/** + * @brief Eliminate dead bags + * + * A bag is referred to as dead if it is neither input nor output, and has no read. If a bag is + * dead, it is unnecessary to updates its values as these values are never used. + * + * "eliminate_dead_bag" removes all the dead bags and its updaters from IR. + */ +void eliminate_dead_bag(enco::Code *code); + +} // namespace enco + +#endif // __ENCO_TRANSFORM_DEAD_BAG_ELIMINATION_H__ diff --git a/contrib/enco/core/src/Transforms/Optimizations.cpp b/contrib/enco/core/src/Transforms/Optimizations.cpp index 6b86a06..90ad1b7 100644 --- a/contrib/enco/core/src/Transforms/Optimizations.cpp +++ b/contrib/enco/core/src/Transforms/Optimizations.cpp @@ -255,61 +255,3 @@ void hoist_object(enco::Code *code) } } // namespace enco - -// -// Dead Bag Elimination -// -#include - -namespace -{ - -// @brief Return true if a given bag is marked as either input or output -bool is_public(const coco::Bag *b) { return b->isInput() || b->isOutput(); } - -// @brief Return the set of "dead" bags in a given module -std::set dead_bags(const coco::Module *m) -{ - std::set res; - - for (uint32_t n = 0; n < m->entity()->bag()->size(); ++n) - { - auto bag = m->entity()->bag()->at(n); - - if (coco::readers(bag).empty() && !is_public(bag)) - { - res.insert(bag); - } - } - - return res; -} - -} // namespace - -namespace enco -{ - -void eliminate_dead_bag(enco::Code *code) -{ - auto m = code->module(); - - // Destroy a dead bag and its updaters - for (auto bag : dead_bags(m)) - { - for (auto updater : coco::updaters(bag)) - { - auto ins = updater->loc(); - - assert(ins != nullptr); - - ins->detach(); - m->entity()->instr()->destroy(ins); - } - - bag->replaceWith(nullptr); - m->entity()->bag()->destroy(bag); - } -} - -} // namespace enco diff --git a/contrib/enco/core/src/Transforms/Optimizations.h b/contrib/enco/core/src/Transforms/Optimizations.h index 1b4cc17..c5f0f9c 100644 --- a/contrib/enco/core/src/Transforms/Optimizations.h +++ b/contrib/enco/core/src/Transforms/Optimizations.h @@ -87,16 +87,6 @@ void generate_bypass_shuffle(enco::Code *code); */ void hoist_object(enco::Code *code); -/** - * @brief Eliminate dead bags - * - * A bag is referred to as dead if it is neither input nor output, and has no read. If a bag is - * dead, it is unnecessary to updates its values as these values are never used. - * - * "eliminate_dead_bag" removes all the dead bags and its updaters from IR. - */ -void eliminate_dead_bag(enco::Code *code); - } // namespace enco #endif // __ENCO_OPTIMIZATIONS_H__ -- 2.7.4