19 return ioBarrier && ioBarrier->
Type() == Type();
28std::unique_ptr<rvsdg::Operation>
31 return std::make_unique<IOBarrierOperation>(*
this);
49std::unique_ptr<rvsdg::Operation>
52 return std::make_unique<MemoryHoistBarrierOperation>(*
this);
55std::optional<std::vector<rvsdg::Output *>>
58 const std::vector<rvsdg::Output *> & operands)
61 auto & lowerMhbAddressOperand = *operands[0];
62 auto & lowerMhbIOStateOperand = *operands[1];
69 auto & tracedLowerMhbAddressOperand = tracer.
trace(lowerMhbAddressOperand,
nullptr);
70 auto [upperMhbNode, upperMhbOp] =
72 tracedLowerMhbAddressOperand);
78 if (upperMhbNode->region() != lowerMhbAddressOperand.region())
86 const auto & tracedUpperMhbIOStateOperand = tracer.
trace(upperMhbIOStateOperand,
nullptr);
87 const auto & tracedLowerMhbIOStateOperand = tracer.
trace(lowerMhbIOStateOperand,
nullptr);
88 if (&tracedLowerMhbIOStateOperand != &tracedUpperMhbIOStateOperand)
94 upperMhbAddressOperand,
95 upperMhbIOStateOperand,
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
std::string debug_string() const override
~IOBarrierOperation() noexcept override
std::unique_ptr< Operation > copy() const override
static std::optional< std::vector< rvsdg::Output * > > normalizeNestedMemoryHoistBarriers(const MemoryHoistBarrierOperation &lowerMhbOp, const std::vector< rvsdg::Output * > &operands)
static rvsdg::SimpleNode & createNode(rvsdg::Output &address, rvsdg::Output &ioState, const std::size_t dereferenceableSize)
static rvsdg::Input & getAddressInput(const rvsdg::Node &node) noexcept
std::unique_ptr< Operation > copy() const override
~MemoryHoistBarrierOperation() noexcept override
std::size_t getDereferenceableSize() const noexcept
std::string debug_string() const override
static rvsdg::Input & getIOStateInput(const rvsdg::Node &node) noexcept
void setTracingThroughHoistBarriers(const bool traceThroughHoistBarriers)
void setRegionPredicateCheckingEnabled(bool value) noexcept
Output & trace(Output &output)
void setStructuralNodePolicy(StructuralNodePolicy value) noexcept
Global memory state passed between functions.
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
static std::string strfmt(Args... args)