#include "triton/Analysis/Alias.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Support/LLVM.h"
#include "triton/Analysis/Utility.h"
#include "triton/Dialect/TritonGPU/IR/Dialect.h"
#include "triton/Dialect/TritonNvidiaGPU/IR/Dialect.h"
namespace mlir {
AliasInfo AliasInfo::join(const AliasInfo &lhs, const AliasInfo &rhs) {
if (lhs == rhs)
return lhs;
AliasInfo ret;
for (auto value : lhs.allocs) {
ret.insert(value);
}
for (auto value : rhs.allocs) {
ret.insert(value);
}
return ret;
}
LogicalResult SharedMemoryAliasAnalysis::visitOperation(
Operation *op, ArrayRef<const dataflow::Lattice<AliasInfo> *> operands,
ArrayRef<dataflow::Lattice<AliasInfo> *> results) {
AliasInfo aliasInfo;
bool pessimistic = true;
auto result = op->getResult(0);
if (auto memdescTy = dyn_cast<triton::MemDescType>(result.getType())) {
if (!isa_and_nonnull<triton::gpu::SharedMemorySpaceAttr>(
memdescTy.getMemorySpace()))
return success();
}
if (isa<triton::gpu::LocalAllocOp>(op)) {
aliasInfo.insert(result);
pessimistic = false;
} else if (isa<triton::gpu::MemDescSubviewOp, triton::TransOp>(op)) {
aliasInfo = AliasInfo(operands[0]->getValue());
pessimistic = false;
} else {
assert(!isa<triton::MemDescType>(result.getType()) &&
"unknown operation creating memory descriptor");
}
if (pessimistic) {
setAllToEntryStates(results);
return success();
}
for (auto *result : results)
propagateIfChanged(result, result->join(aliasInfo));
return success();
}
AliasResult SharedMemoryAliasAnalysis::alias(Value lhs, Value rhs) {
return AliasResult::MayAlias;
}
ModRefResult SharedMemoryAliasAnalysis::getModRef(Operation *op,
Value location) {
return ModRefResult::getModAndRef();
}
}