#ifndef TRITON_ANALYSIS_ALIAS_H
#define TRITON_ANALYSIS_ALIAS_H
#include "mlir/Analysis/AliasAnalysis.h"
#include "mlir/Analysis/DataFlow/SparseAnalysis.h"
#include "llvm/ADT/DenseSet.h"
namespace mlir {
class AliasInfo {
public:
AliasInfo() = default;
AliasInfo(Value value) { insert(value); }
void insert(Value value) { allocs.insert(value); }
const DenseSet<Value> &getAllocs() const { return allocs; }
bool operator==(const AliasInfo &other) const {
return allocs == other.allocs;
}
static AliasInfo getPessimisticValueState(MLIRContext *context = nullptr) {
return AliasInfo();
}
static AliasInfo getPessimisticValueState(Value value) { return AliasInfo(); }
static AliasInfo join(const AliasInfo &lhs, const AliasInfo &rhs);
void print(raw_ostream &os) const {
llvm::interleaveComma(allocs, os, [&](Value alloc) { alloc.print(os); });
}
private:
DenseSet<Value> allocs;
};
class SharedMemoryAliasAnalysis
: public dataflow::SparseForwardDataFlowAnalysis<
dataflow::Lattice<AliasInfo>> {
public:
using dataflow::SparseForwardDataFlowAnalysis<
dataflow::Lattice<AliasInfo>>::SparseForwardDataFlowAnalysis;
using dataflow::SparseForwardDataFlowAnalysis<
dataflow::Lattice<AliasInfo>>::getLatticeElement;
AliasResult alias(Value lhs, Value rhs);
ModRefResult getModRef(Operation *op, Value location);
void setToEntryState(dataflow::Lattice<AliasInfo> *lattice) override {
propagateIfChanged(lattice,
lattice->join(AliasInfo::getPessimisticValueState(
lattice->getAnchor())));
}
LogicalResult
visitOperation(Operation *op,
ArrayRef<const dataflow::Lattice<AliasInfo> *> operands,
ArrayRef<dataflow::Lattice<AliasInfo> *> results) override;
void visitNonControlFlowArguments(
Operation *op, const RegionSuccessor &successor,
ArrayRef<dataflow::Lattice<AliasInfo> *> argLattices,
unsigned firstIndex) override;
};
}
#endif