14#include <mlir/Analysis/DataFlow/DenseAnalysis.h>
16#include <llvm/Support/Debug.h>
28 llvm::DenseMap<llvm::StringRef, Present> isPresent;
29 bool _value_is(llvm::StringRef key, Present present)
const {
30 return isPresent.
contains(key) && isPresent.at(key) == present;
32 bool _set_to(llvm::StringRef key, Present present) {
33 bool changed = !_value_is(key, present);
34 isPresent[key] = present;
43 bool contains(llvm::StringRef key)
const {
return _value_is(key,
true); }
47 bool doesNotContain(llvm::StringRef key)
const {
return _value_is(key,
false); }
51 bool insert(llvm::StringRef key) {
return _set_to(key,
true); }
55 bool remove(llvm::StringRef key) {
return _set_to(key,
false); }
64 llvm::DenseSet<llvm::StringRef> allKeys;
66 for (
auto [key, _] : isPresent) {
69 for (
auto [key, _] : other.isPresent) {
73 for (
auto key : allKeys) {
74 if (isPresent.contains(key) && other.isPresent.contains(key)) {
75 changed |= _set_to(key, isPresent.at(key) && other.isPresent.at(key));
76 }
else if (other.isPresent.contains(key)) {
77 changed |= _set_to(key, other.isPresent.at(key));
89 for (
auto [key, c] : set.isPresent) {
90 os << (c ?
"" :
"x") << key <<
' ';
98using Overwrite = std::pair<component::MemberWriteOp, component::MemberWriteOp>;
100llvm::FailureOr<std::pair<llvm::SetVector<Overwrite>,
FuzzySet>>
104 llvm::DenseMap<llvm::StringRef, component::MemberWriteOp> mayWrites;
105 llvm::SetVector<Overwrite> overwrites;
110 friend llvm::FailureOr<std::pair<llvm::SetVector<Overwrite>,
FuzzySet>>
114 using AbstractDenseLattice::AbstractDenseLattice;
115 mlir::ChangeResult
join(
const mlir::dataflow::AbstractDenseLattice &other)
override;
118 return std::tie(mayWrites, overwrites, mustWrites) ==
119 std::tie(other.mayWrites, other.overwrites, mustWrites);
122 void print(llvm::raw_ostream &os)
const override;
125 auto structDef = dyn_cast<mlir::ProgramPoint *>(getAnchor())
129 for (
auto memberDef : structDef.getMemberDefs()) {
130 mustWrites.remove(memberDef.getSymName());
142 :
public mlir::dataflow::DenseForwardDataFlowAnalysis<MemberOverwriteLattice> {
144 using DenseForwardDataFlowAnalysis::DenseForwardDataFlowAnalysis;
Represents a set where the membership predicate can take three values: true, false,...
bool contains(llvm::StringRef key) const
key \in *this == true (key is definitely present)
bool remove(llvm::StringRef key)
Mark key as definitely not present.
bool intersect(const FuzzySet &other)
Perform an intersection in-place.
bool doesNotContain(llvm::StringRef key) const
key \in *this == false (key is definitely not present)
bool insert(llvm::StringRef key)
Mark key as definitely present.
bool operator==(const FuzzySet &other) const =default
friend llvm::raw_ostream & operator<<(llvm::raw_ostream &os, const FuzzySet &set)
mlir::LogicalResult visitOperation(mlir::Operation *op, const MemberOverwriteLattice &before, MemberOverwriteLattice *after) override
void setToEntryState(MemberOverwriteLattice *lattice) override
void print(llvm::raw_ostream &os) const override
llvm::SetVector< Overwrite > getOverwrites() const
bool checkWritten(component::MemberDefOp) const
friend llvm::raw_ostream & operator<<(llvm::raw_ostream &os, const MemberOverwriteLattice &lat)
mlir::ChangeResult join(const mlir::dataflow::AbstractDenseLattice &other) override
friend llvm::FailureOr< std::pair< llvm::SetVector< Overwrite >, FuzzySet > > analyzeStruct(component::StructDefOp)
bool hasOverwrites() const
bool operator==(const MemberOverwriteLattice &other) const
mlir::ChangeResult record(component::MemberWriteOp write)
std::pair< component::MemberWriteOp, component::MemberWriteOp > Overwrite
Interval operator<<(const Interval &lhs, const Interval &rhs)
llvm::FailureOr< std::pair< llvm::SetVector< Overwrite >, FuzzySet > > analyzeStruct(component::StructDefOp structDef)