16#include <llvm/ADT/TypeSwitch.h>
17#include <llvm/Support/Debug.h>
19#define DEBUG_TYPE "member-overwrite-analysis"
22using namespace mlir::dataflow;
25using namespace component;
37 if (
auto it = mayWrites.find(name); it != mayWrites.end() && it->second != write) {
40 changed |= overwrites.insert({mayWrites.at(name), write});
42 mayWrites.insert({name, write});
46 changed |= mustWrites.insert(name);
47 return ChangeResult {changed};
52 ensure(rhs,
"cannot join incomparable lattices");
55 llvm::dbgs() <<
"Joining " << *dyn_cast<ProgramPoint *>(getAnchor()) <<
"(" << *
this
56 <<
") with " << *dyn_cast<ProgramPoint *>(rhs->getAnchor()) <<
"(" << *rhs
62 for (
auto [name, write] : rhs->mayWrites) {
63 auto it = mayWrites.find(name);
64 changed |= it == mayWrites.end() || it->second != write;
65 mayWrites[name] = write;
67 changed |= overwrites.set_union(rhs->overwrites);
70 changed |= mustWrites.intersect(rhs->mustWrites);
72 return ChangeResult {changed};
80 return mustWrites.contains(memberDef.
getSymName());
88 ChangeResult result = after->
join(before);
90 LLVM_DEBUG(llvm::dbgs() <<
"Visiting operation: " << *op <<
": " << before <<
"\n");
92 if (
auto write = dyn_cast<MemberWriteOp>(op)) {
93 result |= after->
record(write);
96 propagateIfChanged(after, result);
100llvm::FailureOr<std::pair<llvm::SetVector<Overwrite>,
FuzzySet>>
103 if (!computeOrProductFunc) {
107 DataFlowSolver solver {DataFlowConfig {}.setInterprocedural(
false)};
110 if (failed(solver.initializeAndRun(computeOrProductFunc))) {
111 return llvm::failure();
114 auto &funcBody = computeOrProductFunc.
getBody();
115 if (funcBody.empty()) {
121 auto *returnOp = funcBody.back().getTerminator();
122 const auto *lattice =
124 return {{lattice->getOverwrites(), lattice->mustWrites}};
Represents a set where the membership predicate can take three values: true, false,...
mlir::LogicalResult visitOperation(mlir::Operation *op, const MemberOverwriteLattice &before, MemberOverwriteLattice *after) override
void print(llvm::raw_ostream &os) const override
llvm::SetVector< Overwrite > getOverwrites() const
bool checkWritten(component::MemberDefOp) const
mlir::ChangeResult join(const mlir::dataflow::AbstractDenseLattice &other) override
bool hasOverwrites() const
mlir::ChangeResult record(component::MemberWriteOp write)
::llvm::StringRef getSymName()
::llvm::StringRef getMemberName()
::llzk::function::FuncDefOp getProductFuncOp()
Gets the FuncDefOp that defines the product function in this structure, if present,...
::llzk::function::FuncDefOp getComputeFuncOp()
Gets the FuncDefOp that defines the compute function in this structure, if present,...
::mlir::Region & getBody()
void loadRequiredAnalyses(DataFlowSolver &solver)
void ensure(bool condition, const llvm::Twine &errMsg)
Interval operator<<(const Interval &lhs, const Interval &rhs)
llvm::FailureOr< std::pair< llvm::SetVector< Overwrite >, FuzzySet > > analyzeStruct(component::StructDefOp structDef)