| //===- CSE.cpp - Common Sub-expression Elimination ------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements the CSE pass. The actual CSE algorithm lives in |
| // mlir/lib/Transforms/Utils/CSE.cpp so that it can be invoked from other |
| // utilities (e.g. the greedy pattern rewrite driver). |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "mlir/Transforms/CSE.h" |
| |
| #include "mlir/IR/Dominance.h" |
| #include "mlir/IR/PatternMatch.h" |
| #include "mlir/Pass/Pass.h" |
| |
| namespace mlir { |
| #define GEN_PASS_DEF_CSEPASS |
| #include "mlir/Transforms/Passes.h.inc" |
| } // namespace mlir |
| |
| using namespace mlir; |
| |
| namespace { |
| /// CSE pass. |
| struct CSE : public impl::CSEPassBase<CSE> { |
| void runOnOperation() override; |
| }; |
| } // namespace |
| |
| void CSE::runOnOperation() { |
| IRRewriter rewriter(&getContext()); |
| auto &domInfo = getAnalysis<DominanceInfo>(); |
| bool changed = false; |
| // `numCSE` / `numDCE` are `llvm::Statistic` objects, not raw `int64_t`, so |
| // the public API's out-parameters cannot point at them directly. |
| int64_t cseCount = 0; |
| int64_t dceCount = 0; |
| eliminateCommonSubExpressions(rewriter, domInfo, getOperation(), &changed, |
| &cseCount, &dceCount); |
| |
| numCSE = cseCount; |
| numDCE = dceCount; |
| |
| // If there was no change to the IR, we mark all analyses as preserved. |
| if (!changed) |
| return markAllAnalysesPreserved(); |
| |
| // We only delete redundant operations without moving any operation to a |
| // different block, so the dominance tree structure remains unchanged and |
| // DominanceInfo/PostDominanceInfo can be safely preserved. |
| markAnalysesPreserved<DominanceInfo, PostDominanceInfo>(); |
| } |