//===- Liveness.cpp - Liveness analysis for MLIR --------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // Implementation of the liveness analysis. // //===----------------------------------------------------------------------===// #include "mlir/Analysis/Liveness.h" #include "mlir/IR/Block.h" #include "mlir/IR/Operation.h" #include "mlir/IR/Region.h" #include "mlir/IR/Value.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetOperations.h" #include "llvm/ADT/SetVector.h" #include "llvm/Support/raw_ostream.h" usingnamespacemlir; namespace { /// Builds and holds block information during the construction phase. struct BlockInfoBuilder { … }; } // namespace /// Builds the internal liveness block mapping. static void buildBlockMapping(Operation *operation, DenseMap<Block *, BlockInfoBuilder> &builders) { … } //===----------------------------------------------------------------------===// // Liveness //===----------------------------------------------------------------------===// /// Creates a new Liveness analysis that computes liveness information for all /// associated regions. Liveness::Liveness(Operation *op) : … { … } /// Initializes the internal mappings. void Liveness::build() { … } /// Gets liveness info (if any) for the given value. Liveness::OperationListT Liveness::resolveLiveness(Value value) const { … } /// Gets liveness info (if any) for the block. const LivenessBlockInfo *Liveness::getLiveness(Block *block) const { … } /// Returns a reference to a set containing live-in values. const Liveness::ValueSetT &Liveness::getLiveIn(Block *block) const { … } /// Returns a reference to a set containing live-out values. const Liveness::ValueSetT &Liveness::getLiveOut(Block *block) const { … } /// Returns true if `value` is not live after `operation`. bool Liveness::isDeadAfter(Value value, Operation *operation) const { … } /// Dumps the liveness information in a human readable format. void Liveness::dump() const { … } /// Dumps the liveness information to the given stream. void Liveness::print(raw_ostream &os) const { … } //===----------------------------------------------------------------------===// // LivenessBlockInfo //===----------------------------------------------------------------------===// /// Returns true if the given value is in the live-in set. bool LivenessBlockInfo::isLiveIn(Value value) const { … } /// Returns true if the given value is in the live-out set. bool LivenessBlockInfo::isLiveOut(Value value) const { … } /// Gets the start operation for the given value (must be referenced in this /// block). Operation *LivenessBlockInfo::getStartOperation(Value value) const { … } /// Gets the end operation for the given value using the start operation /// provided (must be referenced in this block). Operation *LivenessBlockInfo::getEndOperation(Value value, Operation *startOperation) const { … } /// Return the values that are currently live as of the given operation. LivenessBlockInfo::ValueSetT LivenessBlockInfo::currentlyLiveValues(Operation *op) const { … }