6 #ifndef JLM_LLVM_IR_ANNOTATION_HPP
7 #define JLM_LLVM_IR_ANNOTATION_HPP
14 #include <unordered_map>
15 #include <unordered_set>
20 class AggregationNode;
35 explicit ConstIterator(
const std::unordered_set<const llvm::Variable *>::const_iterator & it)
86 std::unordered_set<const llvm::Variable *>::const_iterator
It_;
117 variableSet.
Set_.begin(),
118 variableSet.
Set_.end(),
140 Set_.insert(variableSet.
Set_.begin(), variableSet.
Set_.end());
159 for (
auto it =
Set_.begin(); it !=
Set_.end();)
186 return !(*
this == other);
202 : ReadSet_(std::move(readSet)),
203 AllWriteSet_(std::move(allWriteSet)),
204 FullWriteSet_(std::move(fullWriteSet))
218 ReadSet() const noexcept
232 return FullWriteSet_;
245 return !(*
this == other);
263 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet))
271 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet)),
272 TopSet_(std::move(topSet))
275 static std::unique_ptr<EntryAnnotationSet>
278 return std::make_unique<EntryAnnotationSet>(
280 std::move(allWriteSet),
281 std::move(fullWriteSet));
299 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet))
302 static std::unique_ptr<ExitAnnotationSet>
305 return std::make_unique<ExitAnnotationSet>(
307 std::move(allWriteSet),
308 std::move(fullWriteSet));
324 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet))
327 static std::unique_ptr<BasicBlockAnnotationSet>
330 return std::make_unique<BasicBlockAnnotationSet>(
332 std::move(allWriteSet),
333 std::move(fullWriteSet));
349 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet))
352 static std::unique_ptr<LinearAnnotationSet>
355 return std::make_unique<LinearAnnotationSet>(
357 std::move(allWriteSet),
358 std::move(fullWriteSet));
374 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet))
383 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet)),
384 InputVariables_(std::move(inputVariables)),
385 OutputVariables_(std::move(outputVariables))
388 static std::unique_ptr<BranchAnnotationSet>
391 return std::make_unique<BranchAnnotationSet>(
393 std::move(allWriteSet),
394 std::move(fullWriteSet));
404 InputVariables() const noexcept
406 return InputVariables_;
412 InputVariables_ = std::move(inputVariables);
418 return OutputVariables_;
424 OutputVariables_ = std::move(outputVariables);
438 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet))
446 :
AnnotationSet(std::move(readSet), std::move(allWriteSet), std::move(fullWriteSet)),
447 LoopVariables_(std::move(loopVariables))
450 static std::unique_ptr<LoopAnnotationSet>
453 return std::make_unique<LoopAnnotationSet>(
455 std::move(allWriteSet),
456 std::move(fullWriteSet));
466 LoopVariables() const noexcept
468 return LoopVariables_;
474 LoopVariables_ = std::move(loopVariables);
499 return Map_.find(&aggregationNode) != Map_.end();
507 auto & demandSet = Map_.find(&aggregationNode)->second;
508 return *jlm::util::assertedCast<T>(demandSet.get());
515 Map_[&aggregationNode] = std::move(annotationSet);
518 static std::unique_ptr<AnnotationMap>
521 return std::make_unique<AnnotationMap>();
525 std::unordered_map<const AggregationNode *, std::unique_ptr<AnnotationSet>>
Map_;
528 std::unique_ptr<AnnotationMap>
std::unordered_map< const AggregationNode *, std::unique_ptr< AnnotationSet > > Map_
T & Lookup(const AggregationNode &aggregationNode) const noexcept
AnnotationMap(const AnnotationMap &)=delete
static std::unique_ptr< AnnotationMap > Create()
void Insert(const AggregationNode &aggregationNode, std::unique_ptr< AnnotationSet > annotationSet)
AnnotationMap(AnnotationMap &&) noexcept=delete
virtual ~AnnotationSet() noexcept
VariableSet FullWriteSet_
const VariableSet & FullWriteSet() const noexcept
const VariableSet & AllWriteSet() const noexcept
AnnotationSet(const AnnotationSet &)=delete
virtual bool operator==(const AnnotationSet &other) const
virtual std::string DebugString() const noexcept=0
bool operator!=(const AnnotationSet &other) const
AnnotationSet(AnnotationSet &&) noexcept=delete
~BasicBlockAnnotationSet() noexcept override
static std::unique_ptr< BasicBlockAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
void SetInputVariables(VariableSet inputVariables) noexcept
VariableSet InputVariables_
void SetOutputVariables(VariableSet outputVariables) noexcept
VariableSet OutputVariables_
BranchAnnotationSet(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet, VariableSet inputVariables, VariableSet outputVariables)
static std::unique_ptr< BranchAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
const VariableSet & OutputVariables() const noexcept
~BranchAnnotationSet() noexcept override
static std::unique_ptr< EntryAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
~EntryAnnotationSet() noexcept override
EntryAnnotationSet(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet, VariableSet topSet)
~ExitAnnotationSet() noexcept override
static std::unique_ptr< ExitAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
~LinearAnnotationSet() noexcept override
static std::unique_ptr< LinearAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
~LoopAnnotationSet() noexcept override
void SetLoopVariables(VariableSet loopVariables) noexcept
static std::unique_ptr< LoopAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
VariableSet LoopVariables_
LoopAnnotationSet(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet, VariableSet loopVariables)
bool operator!=(const ConstIterator &other) const
const llvm::Variable * operator->() const
const llvm::Variable & GetVariable() const noexcept
std::ptrdiff_t difference_type
const llvm::Variable & operator*() const
ConstIterator operator++(int)
std::forward_iterator_tag iterator_category
ConstIterator & operator++()
ConstIterator(const std::unordered_set< const llvm::Variable * >::const_iterator &it)
std::unordered_set< const llvm::Variable * >::const_iterator It_
bool operator==(const ConstIterator &other) const
bool Contains(const VariableSet &variableSet) const
util::IteratorRange< ConstIterator > ConstRange
void Remove(const VariableSet &variableSet)
void Insert(const Variable &v)
std::string DebugString() const noexcept
VariableSet(std::initializer_list< const Variable * > init)
bool operator!=(const VariableSet &other) const
std::unordered_set< const Variable * > Set_
size_t Size() const noexcept
bool Contains(const Variable &v) const
void Insert(const VariableSet &variableSet)
ConstRange Variables() const noexcept
void Remove(const Variable &v)
void Intersect(const VariableSet &variableSet)
bool operator==(const VariableSet &other) const
Global memory state passed between functions.
std::unique_ptr< AnnotationMap > Annotate(const AggregationNode &aggregationTreeRoot)