dbb3d97046d476e873720bc6a0dfb1f8ebd0f87d
[lldb.git] / mlir / tools / mlir-reduce / OptReductionPass.cpp
1 //===- OptReductionPass.cpp - Optimization Reduction Pass Wrapper ---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the Opt Reduction Pass class. It creates a pass to run
10 // any optimization pass within it and only replaces the output module with the
11 // transformed version if it is smaller and interesting.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "mlir/Reducer/OptReductionPass.h"
16
17 #define DEBUG_TYPE "mlir-reduce"
18
19 using namespace mlir;
20
21 OptReductionPass::OptReductionPass(const Tester *test, MLIRContext *context,
22                                    std::unique_ptr<Pass> optPass)
23     : context(context), test(test), optPass(std::move(optPass)) {}
24
25 OptReductionPass::OptReductionPass(const OptReductionPass &srcPass)
26     : test(srcPass.test), optPass(srcPass.optPass.get()) {}
27
28 /// Runs the pass instance in the pass pipeline.
29 void OptReductionPass::runOnOperation() {
30   LLVM_DEBUG(llvm::dbgs() << "\nOptimization Reduction pass: ");
31   LLVM_DEBUG(llvm::dbgs() << optPass.get()->getName() << "\nTesting:\n");
32
33   ModuleOp module = this->getOperation();
34   ModuleOp moduleVariant = module.clone();
35   PassManager pmTransform(context);
36   pmTransform.addPass(std::move(optPass));
37
38   if (failed(pmTransform.run(moduleVariant)))
39     return;
40
41   ReductionNode original(module, nullptr);
42   original.measureAndTest(test);
43
44   ReductionNode reduced(moduleVariant, nullptr);
45   reduced.measureAndTest(test);
46
47   if (reduced.isInteresting() && reduced.getSize() < original.getSize()) {
48     ReductionTreeUtils::updateGoldenModule(module, reduced.getModule().clone());
49     LLVM_DEBUG(llvm::dbgs() << "\nSuccessful Transformed version\n\n");
50   } else {
51     LLVM_DEBUG(llvm::dbgs() << "\nUnsuccessful Transformed version\n\n");
52   }
53
54   LLVM_DEBUG(llvm::dbgs() << "Pass Complete\n\n");
55 }