[Mlir-commits] [mlir] [MLIR][SideEffects][MemoryEffects] Modified LICM to be more aggressive when checking movability of ops with MemWrite effects (PR #155344)
Mehdi Amini
llvmlistbot at llvm.org
Wed Aug 27 02:17:30 PDT 2025
================
@@ -338,9 +379,101 @@ bool mlir::isMemoryEffectFree(Operation *op) {
for (Operation &op : region.getOps())
if (!isMemoryEffectFree(&op))
return false;
+
return true;
}
+bool mlir::isMemoryEffectConflictFree(Operation *op) {
+ auto memInterface = dyn_cast<MemoryEffectOpInterface>(op);
+ // op does not implement the memory effect op interface
+ // shouldn't be flagged as movable to be conservative
+ if (!memInterface) return false;
+
+ // check parent loop to make sure it's not dead
+ Operation *parent = op->getParentOp();
+ if (!parent)
+ return false;
+
+ auto loopInterface = dyn_cast<LoopLikeOpInterface>(parent);
+ if (!loopInterface)
+ return false;
+
+ auto isDead = isZeroTrip(loopInterface);
+ if (!isDead.has_value() || isDead.value())
+ return false;
+
+ // gather all effects on op
+ llvm::SmallVector<MemoryEffects::EffectInstance> effects;
+ memInterface.getEffects(effects);
+
+ // op has interface but no effects, be conservative
+ if (effects.empty()) return false;
+
+ DenseMap<TypeID, int> resourceCounts;
+
+ // ensure op only has Write effects and gather unique
+ // resource names
+ for (const MemoryEffects::EffectInstance &effect : effects) {
+ if (!isa<MemoryEffects::Write>(effect.getEffect()))
+ return false;
+
+ resourceCounts.try_emplace(effect.getResource()->getResourceID(), 0);
+ }
+
+ mlir::DominanceInfo dom(parent);
+
+ for (Region ®ion : parent->getRegions())
+ for (Operation &opI : region.getOps())
+ if (hasMemoryEffectConflict(op, &opI, dom, resourceCounts))
+ return false;
+
+ return true;
+}
+
+bool mlir::hasMemoryEffectConflict(
+ Operation *mainOp, Operation *op,
+ mlir::DominanceInfo &dom, DenseMap<TypeID, int> &resourceCounts) {
+
+ if (auto memInterface = dyn_cast<MemoryEffectOpInterface>(op)) {
+
+ llvm::SmallVector<MemoryEffects::EffectInstance> effects;
+ memInterface.getEffects(effects);
+
+ auto isDominated = dom.properlyDominates(mainOp, op);
+
+ // ensure op only has Write or dominated Read effects
+ // check used resources
+ for (const MemoryEffects::EffectInstance &effect : effects) {
+ auto resourceID = effect.getResource()->getResourceID();
+
+ if (resourceCounts.contains(resourceID)) {
+ if (isa<MemoryEffects::Read>(effect.getEffect())) {
+ if (isDominated) {
+ continue; // skip dominated reads
+ }
----------------
joker-eph wrote:
```suggestion
if (isDominated)
continue; // skip dominated reads
```
https://github.com/llvm/llvm-project/pull/155344
More information about the Mlir-commits
mailing list