6 #ifndef JLM_LLVM_OPT_UNROLL_HPP
7 #define JLM_LLVM_OPT_UNROLL_HPP
18 class LlvmRvsdgModule;
84 return util::assertedCast<rvsdg::ThetaNode>(node);
111 std::unique_ptr<jlm::rvsdg::BitValueRepresentation>
183 return jlm::rvsdg::is<jlm::rvsdg::bitadd_op>(
armnode());
189 return jlm::rvsdg::is<jlm::rvsdg::bitsub_op>(
armnode());
207 static std::unique_ptr<LoopUnrollInfo>
215 auto [_, constantOperation] =
216 rvsdg::TryGetSimpleNodeAndOptionalOp<rvsdg::BitConstantOperation>(tracedOutput);
217 return constantOperation && constantOperation->value().is_known();
227 auto [_, constantOperation] =
228 rvsdg::TryGetSimpleNodeAndOptionalOp<rvsdg::BitConstantOperation>(tracedOutput);
229 return constantOperation ==
nullptr ? nullptr : &constantOperation->value();
rvsdg::Output * idv() const noexcept
std::unique_ptr< jlm::rvsdg::BitValueRepresentation > niterations() const noexcept
bool is_subtractive() const noexcept
rvsdg::Output * end() const noexcept
const rvsdg::SimpleOperation & cmpoperation() const noexcept
LoopUnrollInfo(LoopUnrollInfo &&)=delete
const rvsdg::BitValueRepresentation * value(const rvsdg::Output *output) const noexcept
~LoopUnrollInfo() noexcept=default
rvsdg::SimpleNode * armnode() const noexcept
bool has_known_init() const noexcept
bool is_additive() const noexcept
bool has_known_end() const noexcept
jlm::rvsdg::Output * init() const noexcept
static std::unique_ptr< LoopUnrollInfo > create(rvsdg::ThetaNode *theta)
rvsdg::Output * step() const noexcept
const jlm::rvsdg::BitValueRepresentation * end_value() const noexcept
bool is_known() const noexcept
bool is_known(const rvsdg::Output *output) const noexcept
LoopUnrollInfo & operator=(LoopUnrollInfo &&)=delete
const rvsdg::SimpleOperation & armoperation() const noexcept
bool has_known_step() const noexcept
rvsdg::ThetaNode * theta() const noexcept
size_t nbits() const noexcept
rvsdg::SimpleNode * cmpnode_
rvsdg::SimpleNode * cmpnode() const noexcept
jlm::rvsdg::BitValueRepresentation remainder(size_t factor) const noexcept
rvsdg::SimpleNode * armnode_
LoopUnrollInfo & operator=(const LoopUnrollInfo &)=delete
const jlm::rvsdg::BitValueRepresentation * step_value() const noexcept
const jlm::rvsdg::BitValueRepresentation * init_value() const noexcept
LoopUnrollInfo(const LoopUnrollInfo &)=delete
Optimization that attempts to unroll loops (thetas).
~LoopUnrolling() noexcept override
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
rvsdg::Region * region() const noexcept
rvsdg::StructuralNode * node() const noexcept
const SimpleOperation & GetOperation() const noexcept override
LoopVar MapPreLoopVar(const rvsdg::Output &argument) const
Maps variable at start of loop iteration to full varibale description.
Global memory state passed between functions.
rvsdg::Output & traceOutput(rvsdg::Output &output)
void unroll(rvsdg::ThetaNode *otheta, size_t factor)
static std::string type(const Node *n)
rvsdg::Input * input
Variable at loop entry (input to theta).