//===- 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 { void runOnOperation() override; }; } // namespace void CSE::runOnOperation() { IRRewriter rewriter(&getContext()); auto &domInfo = getAnalysis(); 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(); }