| //===------ Simplify.h ------------------------------------------*- C++ -*-===// |
| // |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Simplify a SCoP by removing unnecessary statements and accesses. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef POLLY_TRANSFORM_SIMPLIFY_H |
| #define POLLY_TRANSFORM_SIMPLIFY_H |
| |
| #include "polly/ScopPass.h" |
| #include "llvm/ADT/SmallVector.h" |
| |
| namespace llvm { |
| class PassRegistry; |
| class Pass; |
| } // namespace llvm |
| |
| namespace polly { |
| class MemoryAccess; |
| class ScopStmt; |
| |
| /// Return a vector that contains MemoryAccesses in the order in |
| /// which they are executed. |
| /// |
| /// The order is: |
| /// - Implicit reads (BlockGenerator::generateScalarLoads) |
| /// - Explicit reads and writes (BlockGenerator::generateArrayLoad, |
| /// BlockGenerator::generateArrayStore) |
| /// - In block statements, the accesses are in order in which their |
| /// instructions are executed. |
| /// - In region statements, that order of execution is not predictable at |
| /// compile-time. |
| /// - Implicit writes (BlockGenerator::generateScalarStores) |
| /// The order in which implicit writes are executed relative to each other is |
| /// undefined. |
| llvm::SmallVector<MemoryAccess *, 32> getAccessesInOrder(ScopStmt &Stmt); |
| |
| /// Create a Simplify pass |
| /// |
| /// @param CallNo Disambiguates this instance for when there are multiple |
| /// instances of this pass in the pass manager. It is used only to |
| /// keep the statistics apart and has no influence on the |
| /// simplification itself. |
| /// |
| /// @return The Simplify pass. |
| llvm::Pass *createSimplifyWrapperPass(int CallNo = 0); |
| |
| struct SimplifyPass : public PassInfoMixin<SimplifyPass> { |
| SimplifyPass(int CallNo = 0) : CallNo(CallNo) {} |
| |
| llvm::PreservedAnalyses run(Scop &S, ScopAnalysisManager &SAM, |
| ScopStandardAnalysisResults &AR, SPMUpdater &U); |
| |
| private: |
| int CallNo; |
| }; |
| |
| struct SimplifyPrinterPass : public PassInfoMixin<SimplifyPrinterPass> { |
| SimplifyPrinterPass(raw_ostream &OS, int CallNo = 0) |
| : OS(OS), CallNo(CallNo) {} |
| |
| PreservedAnalyses run(Scop &S, ScopAnalysisManager &, |
| ScopStandardAnalysisResults &, SPMUpdater &); |
| |
| private: |
| raw_ostream &OS; |
| int CallNo; |
| }; |
| } // namespace polly |
| |
| namespace llvm { |
| void initializeSimplifyWrapperPassPass(llvm::PassRegistry &); |
| } // namespace llvm |
| |
| #endif /* POLLY_TRANSFORM_SIMPLIFY_H */ |