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