83 mlir::Value location) {
84 LDBG() <<
"getModRef: "
85 << mlir::OpWithFlags(op, mlir::OpPrintingFlags().skipRegions())
86 <<
" on location " << location;
88 auto effects = mlir::dyn_cast<mlir::MemoryEffectOpInterface>(op);
90 LDBG() <<
"No memory effect interface, returning ModAndRef";
91 return mlir::ModRefResult::getModAndRef();
95 effects.getEffects(effectList);
97 auto classifyEffect = [location,
this](
98 const mlir::MemoryEffects::EffectInstance &effect) {
99 if (mlir::isa<mlir::MemoryEffects::Allocate>(effect.getEffect())) {
100 LDBG() <<
"Skipping allocate effect";
101 return mlir::ModRefResult::getNoModRef();
104 mlir::AliasResult aliasResult = mlir::AliasResult::MayAlias;
105 if (mlir::Value affectedLocation = effect.getValue()) {
106 LDBG() <<
" Checking alias between affected location "
107 << affectedLocation <<
" and query location " << location;
108 aliasResult =
alias(affectedLocation, location);
109 LDBG() <<
" Alias result: "
110 << (aliasResult.isMust() ?
"MustAlias"
111 : aliasResult.isNo() ?
"NoAlias"
116 if (!effect.getResource()->isAddressable()) {
117 LDBG() <<
" Effect on non-addressable resource '"
118 << effect.getResource()->getName() <<
"', skipping (NoAlias)";
119 aliasResult = mlir::AliasResult::NoAlias;
121 LDBG() <<
" No effect value, assuming MayAlias";
127 if (aliasResult.isNo()) {
128 LDBG() <<
"No alias with affected location";
129 return mlir::ModRefResult::getNoModRef();
133 if (mlir::isa<mlir::MemoryEffects::Free>(effect.getEffect())) {
134 LDBG() <<
"Skipping free effect";
135 return mlir::ModRefResult::getModAndRef();
138 if (mlir::isa<mlir::MemoryEffects::Write>(effect.getEffect())) {
139 LDBG() <<
"Write effect, adding Mod";
140 return mlir::ModRefResult::getMod();
143 if (mlir::isa<mlir::MemoryEffects::Read>(effect.getEffect())) {
144 LDBG() <<
"Read effect, adding Ref";
145 return mlir::ModRefResult::getRef();
148 LDBG() <<
"Unexpected memory effect: " << effect.getEffect();
149 return mlir::ModRefResult::getNoModRef();
152 return llvm::accumulate(llvm::map_range(effectList, classifyEffect),
153 mlir::ModRefResult::getNoModRef(),
154 [](mlir::ModRefResult lhs, mlir::ModRefResult rhs) {
155 return lhs.merge(rhs);