From cc3b56c72874176ce94af2b68dfb65b29fe5efdb 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: Fri, 10 Aug 2018 07:59:39 +0900 Subject: [PATCH] [coco] Update OpLink on UnitF::op update (#939) This commit revises UnitF::op method to update OpLink properly. Signed-off-by: Jonghyun Park --- contrib/coco/core/include/coco/IR/Instr.h | 10 ++++------ contrib/coco/core/src/IR/Instr.cpp | 21 +++++++++++++++++++++ contrib/coco/core/src/IR/Instr.test.cpp | 19 ++++++++++++++----- contrib/coco/core/src/IR/InstrManager.cpp | 2 +- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/contrib/coco/core/include/coco/IR/Instr.h b/contrib/coco/core/include/coco/IR/Instr.h index 9d5c93c..af9fcd5 100644 --- a/contrib/coco/core/include/coco/IR/Instr.h +++ b/contrib/coco/core/include/coco/IR/Instr.h @@ -185,7 +185,8 @@ namespace coco class UnitF final : public FeatureInstr { public: - UnitF(const PtrLink *link) : _link{link}, _op{nullptr} + UnitF(PtrLink *op_link, const PtrLink *link) + : _op_link{op_link}, _link{link}, _op{nullptr} { // DO NOTHING } @@ -199,6 +200,7 @@ public: std::set updates(void) const override; private: + PtrLink *const _op_link; const PtrLink *const _link; private: @@ -211,11 +213,7 @@ public: Op *op(void) const { return _op; } public: - void op(Op *op) - { - // TODO Update Op-Instr relation - _op = op; - } + void op(Op *op); }; } // namespace coco diff --git a/contrib/coco/core/src/IR/Instr.cpp b/contrib/coco/core/src/IR/Instr.cpp index 056dc02..4bb1b60 100644 --- a/contrib/coco/core/src/IR/Instr.cpp +++ b/contrib/coco/core/src/IR/Instr.cpp @@ -33,6 +33,8 @@ void FeatureInstr::ofm(FeatureObject *ofm) // #include "coco/IR/Op.h" +#include + namespace { std::set &operator+=(std::set &res, const coco::Object *o) @@ -74,4 +76,23 @@ std::set UnitF::updates(void) const return res; } +void UnitF::op(Op *op) +{ + if (_op != nullptr) + { + assert(_op_link->find(_op) == this); + _op_link->unset(_op); + _op = nullptr; + } + + assert(_op == nullptr); + + if (op != nullptr) + { + assert(_op_link->find(op) == nullptr); + _op = op; + _op_link->set(_op, this); + } +} + } // namespace coco diff --git a/contrib/coco/core/src/IR/Instr.test.cpp b/contrib/coco/core/src/IR/Instr.test.cpp index 9a20ec1..4de57d9 100644 --- a/contrib/coco/core/src/IR/Instr.test.cpp +++ b/contrib/coco/core/src/IR/Instr.test.cpp @@ -88,8 +88,9 @@ struct UnitFMutator : public coco::Instr::DefaultMutator TEST(IR_UNIT_F, ctor) { + coco::PtrLink op_link; coco::PtrLink link; - coco::UnitF ins{&link}; + coco::UnitF ins{&op_link, &link}; ASSERT_EQ(ins.op(), nullptr); ASSERT_TRUE(ins.reads().empty()); @@ -98,8 +99,9 @@ TEST(IR_UNIT_F, ctor) TEST(IR_UNIT_F, asUnitF) { + coco::PtrLink op_link; coco::PtrLink link; - coco::UnitF ins{&link}; + coco::UnitF ins{&op_link, &link}; coco::Instr *mutable_ptr = &ins; const coco::Instr *immutable_ptr = &ins; @@ -120,16 +122,22 @@ TEST(IR_UNIT_F, op_update) // Test UnitF coco::PtrLink link; - coco::UnitF ins{&link}; + coco::UnitF ins{&op_link, &link}; ins.op(op); ASSERT_EQ(ins.op(), op); + ASSERT_EQ(op_link.find(op), &ins); + + ins.op(nullptr); + ASSERT_EQ(ins.op(), nullptr); + ASSERT_EQ(op_link.find(op), nullptr); } TEST(IR_UNIT_F, visitor) { + coco::PtrLink op_link; coco::PtrLink link; - coco::UnitF ins{&link}; + coco::UnitF ins{&op_link, &link}; coco::Instr *mutable_ptr = &ins; const coco::Instr *immutable_ptr = &ins; @@ -140,8 +148,9 @@ TEST(IR_UNIT_F, visitor) TEST(IR_UNIT_F, mutator) { + coco::PtrLink op_link; coco::PtrLink link; - coco::UnitF ins{&link}; + coco::UnitF ins{&op_link, &link}; UnitFMutator m{}; diff --git a/contrib/coco/core/src/IR/InstrManager.cpp b/contrib/coco/core/src/IR/InstrManager.cpp index f4f4755..3e40366 100644 --- a/contrib/coco/core/src/IR/InstrManager.cpp +++ b/contrib/coco/core/src/IR/InstrManager.cpp @@ -9,7 +9,7 @@ namespace coco template <> UnitF *InstrManager::create(void) { - return take(nncc::foundation::make_unique(_instr_link)); + return take(nncc::foundation::make_unique(_op_link, _instr_link)); } } // namespace coco -- 2.7.4