Jlm
Loading...
Searching...
No Matches
LoopStrengthReduction.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2026 Andreas Lilleby Hjulstad <andreas.lilleby.hjulstad@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#ifndef JLM_LLVM_OPT_LOOP_STRENGTH_REDUCTION_HPP
7#define JLM_LLVM_OPT_LOOP_STRENGTH_REDUCTION_HPP
8
13
14namespace jlm::llvm
15{
17{
18 class Statistics;
19 class Context;
20
21public:
22 ~LoopStrengthReduction() noexcept override;
23
25
27
29
31 operator=(const LoopStrengthReduction &) = delete;
32
34 operator=(LoopStrengthReduction &&) = delete;
35
36 void
37 Run(rvsdg::RvsdgModule & rvsdgModule, util::StatisticsCollector & statisticsCollector) override;
38
39private:
40 void
41 ProcessRegion(rvsdg::Region & region);
42
43 void
44 ReduceStrength(rvsdg::ThetaNode & thetaNode);
45
53 bool
54 ContainsMul(const rvsdg::Output & output);
55
64 bool
65 DependsOnInductionVariable(const rvsdg::Output & output);
66
67 bool
68 IsValidCandidateOperation(const rvsdg::Output & output, const rvsdg::SimpleOperation & operation);
69
70 void
72 rvsdg::Output & output,
73 rvsdg::ThetaNode & thetaNode,
74 util::HashSet<rvsdg::Output *> & candidateOperations,
75 util::HashSet<rvsdg::Output *> & visited);
76
77 void
78 ReplaceCandidateOperation(rvsdg::Output & output, rvsdg::ThetaNode & thetaNode);
79
80 std::optional<rvsdg::Output *>
81 HoistChrec(const SCEVChainRecurrence & chrec, const rvsdg::ThetaNode & thetaNode, size_t numBits);
82
83 std::optional<rvsdg::Output *>
84 HoistSCEVExpresssion(const SCEV & scev, rvsdg::ThetaNode & thetaNode, size_t numBits);
85
86 std::optional<rvsdg::ThetaNode::LoopVar>
87 CreateNewGEPInductionVariable(const SCEVChainRecurrence & chrec, rvsdg::ThetaNode & thetaNode);
88
89 std::optional<rvsdg::ThetaNode::LoopVar>
91 const SCEVChainRecurrence & chrec,
92 rvsdg::ThetaNode & thetaNode,
93 size_t numBits);
94
95 std::unordered_map<const rvsdg::Output *, std::unique_ptr<SCEVChainRecurrence>> ChrecMap_;
96 std::unordered_map<const rvsdg::Output *, std::unique_ptr<SCEV>> SCEVMap_;
97 std::unordered_map<const rvsdg::Output *, bool> DependsOnIVMemo_;
98 std::unordered_map<const rvsdg::Output *, bool> ContainsMulMemo_;
99
100 std::unique_ptr<Context> Context_;
101};
102
103}
104
105#endif
static jlm::util::StatisticsCollector statisticsCollector
bool IsValidCandidateOperation(const rvsdg::Output &output, const rvsdg::SimpleOperation &operation)
~LoopStrengthReduction() noexcept override
std::optional< rvsdg::ThetaNode::LoopVar > CreateNewArithmeticInductionVariable(const SCEVChainRecurrence &chrec, rvsdg::ThetaNode &thetaNode, size_t numBits)
std::optional< rvsdg::Output * > HoistChrec(const SCEVChainRecurrence &chrec, const rvsdg::ThetaNode &thetaNode, size_t numBits)
void ReplaceCandidateOperation(rvsdg::Output &output, rvsdg::ThetaNode &thetaNode)
std::optional< rvsdg::Output * > HoistSCEVExpresssion(const SCEV &scev, rvsdg::ThetaNode &thetaNode, size_t numBits)
void ProcessOutput(rvsdg::Output &output, rvsdg::ThetaNode &thetaNode, util::HashSet< rvsdg::Output * > &candidateOperations, util::HashSet< rvsdg::Output * > &visited)
bool DependsOnInductionVariable(const rvsdg::Output &output)
std::unordered_map< const rvsdg::Output *, bool > ContainsMulMemo_
std::unordered_map< const rvsdg::Output *, bool > DependsOnIVMemo_
void ReduceStrength(rvsdg::ThetaNode &thetaNode)
std::unordered_map< const rvsdg::Output *, std::unique_ptr< SCEVChainRecurrence > > ChrecMap_
bool ContainsMul(const rvsdg::Output &output)
void ProcessRegion(rvsdg::Region &region)
std::unordered_map< const rvsdg::Output *, std::unique_ptr< SCEV > > SCEVMap_
std::optional< rvsdg::ThetaNode::LoopVar > CreateNewGEPInductionVariable(const SCEVChainRecurrence &chrec, rvsdg::ThetaNode &thetaNode)
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
Represents an RVSDG transformation.
Global memory state passed between functions.