diff --git a/mlir/include/mlir/Interfaces/SideEffectInterfaces.h b/mlir/include/mlir/Interfaces/SideEffectInterfaces.h --- a/mlir/include/mlir/Interfaces/SideEffectInterfaces.h +++ b/mlir/include/mlir/Interfaces/SideEffectInterfaces.h @@ -250,7 +250,8 @@ // SideEffect Utilities //===----------------------------------------------------------------------===// -/// Returns true if this operation only has the given effect on `value`. +/// Returns true if `op` has only an effect of type `EffectTy` (and of no other +/// type) on `value`. template bool hasSingleEffect(Operation *op, Value value); diff --git a/mlir/lib/Interfaces/SideEffectInterfaces.cpp b/mlir/lib/Interfaces/SideEffectInterfaces.cpp --- a/mlir/lib/Interfaces/SideEffectInterfaces.cpp +++ b/mlir/lib/Interfaces/SideEffectInterfaces.cpp @@ -97,25 +97,24 @@ return false; SmallVector, 4> effects; memOp.getEffects(effects); - bool doesOpOnlyHaveSingleEffectOnVal = false; - // Iterate through `effects` and check if and only if effect of type - // `EffectTy` is present. + bool hasSingleEffectOnVal = false; + // Iterate through `effects` and check if an effect of type `EffectTy` and + // only of that type is present. for (auto &effect : effects) { - if (effect.getValue() == value && isa(effect.getEffect())) - doesOpOnlyHaveSingleEffectOnVal = true; - if (effect.getValue() == value && !isa(effect.getEffect())) { - doesOpOnlyHaveSingleEffectOnVal = false; - break; - } + if (effect.getValue() != value) + continue; + hasSingleEffectOnVal = isa(effect.getEffect()); + if (!hasSingleEffectOnVal) + return false; } - return doesOpOnlyHaveSingleEffectOnVal; + return hasSingleEffectOnVal; } template bool mlir::hasSingleEffect(Operation *, Value); template bool mlir::hasSingleEffect(Operation *, Value); -template bool mlir::hasSingleEffect(Operation *, Value); template bool mlir::hasSingleEffect(Operation *, Value); +template bool mlir::hasSingleEffect(Operation *, Value); bool mlir::wouldOpBeTriviallyDead(Operation *op) { if (op->mightHaveTrait())