1f8923584SRiver Riddle //===- TestSidEffects.cpp - Pass to test side effects ---------------------===// 2f8923584SRiver Riddle // 3f8923584SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4f8923584SRiver Riddle // See https://llvm.org/LICENSE.txt for license information. 5f8923584SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f8923584SRiver Riddle // 7f8923584SRiver Riddle //===----------------------------------------------------------------------===// 8f8923584SRiver Riddle 9f8923584SRiver Riddle #include "TestDialect.h" 10f8923584SRiver Riddle #include "mlir/Pass/Pass.h" 11f8923584SRiver Riddle 12f8923584SRiver Riddle using namespace mlir; 13f8923584SRiver Riddle 14f8923584SRiver Riddle namespace { 1580aca1eaSRiver Riddle struct SideEffectsPass 1680aca1eaSRiver Riddle : public PassWrapper<SideEffectsPass, OperationPass<ModuleOp>> { MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID__anoncf7915770111::SideEffectsPass17*5e50dd04SRiver Riddle MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(SideEffectsPass) 18*5e50dd04SRiver Riddle 19b5e22e6dSMehdi Amini StringRef getArgument() const final { return "test-side-effects"; } getDescription__anoncf7915770111::SideEffectsPass20b5e22e6dSMehdi Amini StringRef getDescription() const final { 21b5e22e6dSMehdi Amini return "Test side effects interfaces"; 22b5e22e6dSMehdi Amini } runOnOperation__anoncf7915770111::SideEffectsPass23722f909fSRiver Riddle void runOnOperation() override { 24722f909fSRiver Riddle auto module = getOperation(); 25f8923584SRiver Riddle 26f8923584SRiver Riddle // Walk operations detecting side effects. 27f8923584SRiver Riddle SmallVector<MemoryEffects::EffectInstance, 8> effects; 28f8923584SRiver Riddle module.walk([&](MemoryEffectOpInterface op) { 29f8923584SRiver Riddle effects.clear(); 30f8923584SRiver Riddle op.getEffects(effects); 31f8923584SRiver Riddle 32f8923584SRiver Riddle // Check to see if this operation has any memory effects. 33f8923584SRiver Riddle if (effects.empty()) { 34f8923584SRiver Riddle op.emitRemark() << "operation has no memory effects"; 35f8923584SRiver Riddle return; 36f8923584SRiver Riddle } 37f8923584SRiver Riddle 38f8923584SRiver Riddle for (MemoryEffects::EffectInstance instance : effects) { 39f8923584SRiver Riddle auto diag = op.emitRemark() << "found an instance of "; 40f8923584SRiver Riddle 41f8923584SRiver Riddle if (isa<MemoryEffects::Allocate>(instance.getEffect())) 42f8923584SRiver Riddle diag << "'allocate'"; 43f8923584SRiver Riddle else if (isa<MemoryEffects::Free>(instance.getEffect())) 44f8923584SRiver Riddle diag << "'free'"; 45f8923584SRiver Riddle else if (isa<MemoryEffects::Read>(instance.getEffect())) 46f8923584SRiver Riddle diag << "'read'"; 47f8923584SRiver Riddle else if (isa<MemoryEffects::Write>(instance.getEffect())) 48f8923584SRiver Riddle diag << "'write'"; 49f8923584SRiver Riddle 50f8923584SRiver Riddle if (instance.getValue()) 51f8923584SRiver Riddle diag << " on a value,"; 52c0958b7bSRiver Riddle else if (SymbolRefAttr symbolRef = instance.getSymbolRef()) 53c0958b7bSRiver Riddle diag << " on a symbol '" << symbolRef << "',"; 54f8923584SRiver Riddle 55f8923584SRiver Riddle diag << " on resource '" << instance.getResource()->getName() << "'"; 56f8923584SRiver Riddle } 57f8923584SRiver Riddle }); 58052d24afSAlex Zinenko 59052d24afSAlex Zinenko SmallVector<TestEffects::EffectInstance, 1> testEffects; 60052d24afSAlex Zinenko module.walk([&](TestEffectOpInterface op) { 61052d24afSAlex Zinenko testEffects.clear(); 62052d24afSAlex Zinenko op.getEffects(testEffects); 63052d24afSAlex Zinenko 64052d24afSAlex Zinenko if (testEffects.empty()) 65052d24afSAlex Zinenko return; 66052d24afSAlex Zinenko 67052d24afSAlex Zinenko for (const TestEffects::EffectInstance &instance : testEffects) { 68052d24afSAlex Zinenko op.emitRemark() << "found a parametric effect with " 69052d24afSAlex Zinenko << instance.getParameters(); 70052d24afSAlex Zinenko } 71052d24afSAlex Zinenko }); 72f8923584SRiver Riddle } 73f8923584SRiver Riddle }; 74be0a7e9fSMehdi Amini } // namespace 75f8923584SRiver Riddle 76f8923584SRiver Riddle namespace mlir { registerSideEffectTestPasses()77b5e22e6dSMehdi Aminivoid registerSideEffectTestPasses() { PassRegistration<SideEffectsPass>(); } 78f8923584SRiver Riddle } // namespace mlir 79