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>> { 17722f909fSRiver Riddle void runOnOperation() override { 18722f909fSRiver Riddle auto module = getOperation(); 19f8923584SRiver Riddle 20f8923584SRiver Riddle // Walk operations detecting side effects. 21f8923584SRiver Riddle SmallVector<MemoryEffects::EffectInstance, 8> effects; 22f8923584SRiver Riddle module.walk([&](MemoryEffectOpInterface op) { 23f8923584SRiver Riddle effects.clear(); 24f8923584SRiver Riddle op.getEffects(effects); 25f8923584SRiver Riddle 26f8923584SRiver Riddle // Check to see if this operation has any memory effects. 27f8923584SRiver Riddle if (effects.empty()) { 28f8923584SRiver Riddle op.emitRemark() << "operation has no memory effects"; 29f8923584SRiver Riddle return; 30f8923584SRiver Riddle } 31f8923584SRiver Riddle 32f8923584SRiver Riddle for (MemoryEffects::EffectInstance instance : effects) { 33f8923584SRiver Riddle auto diag = op.emitRemark() << "found an instance of "; 34f8923584SRiver Riddle 35f8923584SRiver Riddle if (isa<MemoryEffects::Allocate>(instance.getEffect())) 36f8923584SRiver Riddle diag << "'allocate'"; 37f8923584SRiver Riddle else if (isa<MemoryEffects::Free>(instance.getEffect())) 38f8923584SRiver Riddle diag << "'free'"; 39f8923584SRiver Riddle else if (isa<MemoryEffects::Read>(instance.getEffect())) 40f8923584SRiver Riddle diag << "'read'"; 41f8923584SRiver Riddle else if (isa<MemoryEffects::Write>(instance.getEffect())) 42f8923584SRiver Riddle diag << "'write'"; 43f8923584SRiver Riddle 44f8923584SRiver Riddle if (instance.getValue()) 45f8923584SRiver Riddle diag << " on a value,"; 46f8923584SRiver Riddle 47f8923584SRiver Riddle diag << " on resource '" << instance.getResource()->getName() << "'"; 48f8923584SRiver Riddle } 49f8923584SRiver Riddle }); 50*052d24afSAlex Zinenko 51*052d24afSAlex Zinenko SmallVector<TestEffects::EffectInstance, 1> testEffects; 52*052d24afSAlex Zinenko module.walk([&](TestEffectOpInterface op) { 53*052d24afSAlex Zinenko testEffects.clear(); 54*052d24afSAlex Zinenko op.getEffects(testEffects); 55*052d24afSAlex Zinenko 56*052d24afSAlex Zinenko if (testEffects.empty()) 57*052d24afSAlex Zinenko return; 58*052d24afSAlex Zinenko 59*052d24afSAlex Zinenko for (const TestEffects::EffectInstance &instance : testEffects) { 60*052d24afSAlex Zinenko op.emitRemark() << "found a parametric effect with " 61*052d24afSAlex Zinenko << instance.getParameters(); 62*052d24afSAlex Zinenko } 63*052d24afSAlex Zinenko }); 64f8923584SRiver Riddle } 65f8923584SRiver Riddle }; 66f8923584SRiver Riddle } // end anonymous namespace 67f8923584SRiver Riddle 68f8923584SRiver Riddle namespace mlir { 69f8923584SRiver Riddle void registerSideEffectTestPasses() { 70f8923584SRiver Riddle PassRegistration<SideEffectsPass>("test-side-effects", 71f8923584SRiver Riddle "Test side effects interfaces"); 72f8923584SRiver Riddle } 73f8923584SRiver Riddle } // namespace mlir 74