class UnitF final : public FeatureInstr
{
public:
- UnitF(const PtrLink<Instr, Block> *link) : _link{link}, _op{nullptr}
+ UnitF(PtrLink<Op, Instr> *op_link, const PtrLink<Instr, Block> *link)
+ : _op_link{op_link}, _link{link}, _op{nullptr}
{
// DO NOTHING
}
std::set<Bag *> updates(void) const override;
private:
+ PtrLink<Op, Instr> *const _op_link;
const PtrLink<Instr, Block> *const _link;
private:
Op *op(void) const { return _op; }
public:
- void op(Op *op)
- {
- // TODO Update Op-Instr relation
- _op = op;
- }
+ void op(Op *op);
};
} // namespace coco
TEST(IR_UNIT_F, ctor)
{
+ coco::PtrLink<coco::Op, coco::Instr> op_link;
coco::PtrLink<coco::Instr, coco::Block> link;
- coco::UnitF ins{&link};
+ coco::UnitF ins{&op_link, &link};
ASSERT_EQ(ins.op(), nullptr);
ASSERT_TRUE(ins.reads().empty());
TEST(IR_UNIT_F, asUnitF)
{
+ coco::PtrLink<coco::Op, coco::Instr> op_link;
coco::PtrLink<coco::Instr, coco::Block> link;
- coco::UnitF ins{&link};
+ coco::UnitF ins{&op_link, &link};
coco::Instr *mutable_ptr = &ins;
const coco::Instr *immutable_ptr = &ins;
// Test UnitF
coco::PtrLink<coco::Instr, coco::Block> 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<coco::Op, coco::Instr> op_link;
coco::PtrLink<coco::Instr, coco::Block> link;
- coco::UnitF ins{&link};
+ coco::UnitF ins{&op_link, &link};
coco::Instr *mutable_ptr = &ins;
const coco::Instr *immutable_ptr = &ins;
TEST(IR_UNIT_F, mutator)
{
+ coco::PtrLink<coco::Op, coco::Instr> op_link;
coco::PtrLink<coco::Instr, coco::Block> link;
- coco::UnitF ins{&link};
+ coco::UnitF ins{&op_link, &link};
UnitFMutator m{};