Jlm
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 
9 #include <jlm/llvm/ir/types.hpp>
12 #include <jlm/util/Statistics.hpp>
13 
14 namespace jlm::llvm
15 {
17 {
18  class Statistics;
19  class Context;
20 
21 public:
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 
39 private:
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.