6#ifndef JLM_LLVM_IR_ANNOTATION_HPP
7#define JLM_LLVM_IR_ANNOTATION_HPP
14#include <unordered_map>
15#include <unordered_set>
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));
460 DebugString() const noexcept override;
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_;
528std::unique_ptr<AnnotationMap>
static bool Contains(const jlm::llvm::InterProceduralGraphModule &module, const std::string &)
std::unordered_map< const AggregationNode *, std::unique_ptr< AnnotationSet > > Map_
T & Lookup(const AggregationNode &aggregationNode) const noexcept
AnnotationMap(const AnnotationMap &)=delete
void Insert(const AggregationNode &aggregationNode, std::unique_ptr< AnnotationSet > annotationSet)
static std::unique_ptr< AnnotationMap > Create()
AnnotationMap(AnnotationMap &&) noexcept=delete
virtual ~AnnotationSet() noexcept
VariableSet FullWriteSet_
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
const VariableSet & AllWriteSet() const noexcept
const VariableSet & FullWriteSet() const noexcept
~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
const VariableSet & OutputVariables() const noexcept
VariableSet OutputVariables_
BranchAnnotationSet(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet, VariableSet inputVariables, VariableSet outputVariables)
~BranchAnnotationSet() noexcept override
static std::unique_ptr< BranchAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
static std::unique_ptr< EntryAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
~EntryAnnotationSet() noexcept override
EntryAnnotationSet(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet, VariableSet topSet)
static std::unique_ptr< ExitAnnotationSet > Create(VariableSet readSet, VariableSet allWriteSet, VariableSet fullWriteSet)
~ExitAnnotationSet() noexcept override
~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)
ConstIterator & operator++()
bool operator!=(const ConstIterator &other) const
const llvm::Variable & GetVariable() const noexcept
std::ptrdiff_t difference_type
ConstIterator operator++(int)
std::unordered_set< constllvm::Variable * >::const_iterator It_
std::forward_iterator_tag iterator_category
const llvm::Variable * operator->() const
ConstIterator(const std::unordered_set< const llvm::Variable * >::const_iterator &it)
const llvm::Variable & operator*() const
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)