1 //===------ Simplify.h ------------------------------------------*- C++ -*-===//
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 // Simplify a SCoP by removing unnecessary statements and accesses.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef POLLY_TRANSFORM_SIMPLIFY_H
14 #define POLLY_TRANSFORM_SIMPLIFY_H
15 
16 #include "polly/ScopPass.h"
17 #include "llvm/ADT/SmallVector.h"
18 
19 namespace llvm {
20 class PassRegistry;
21 class Pass;
22 } // namespace llvm
23 
24 namespace polly {
25 class MemoryAccess;
26 class ScopStmt;
27 
28 /// Return a vector that contains MemoryAccesses in the order in
29 /// which they are executed.
30 ///
31 /// The order is:
32 /// - Implicit reads (BlockGenerator::generateScalarLoads)
33 /// - Explicit reads and writes (BlockGenerator::generateArrayLoad,
34 ///   BlockGenerator::generateArrayStore)
35 ///   - In block statements, the accesses are in order in which their
36 ///     instructions are executed.
37 ///   - In region statements, that order of execution is not predictable at
38 ///     compile-time.
39 /// - Implicit writes (BlockGenerator::generateScalarStores)
40 ///   The order in which implicit writes are executed relative to each other is
41 ///   undefined.
42 llvm::SmallVector<MemoryAccess *, 32> getAccessesInOrder(ScopStmt &Stmt);
43 
44 /// Create a Simplify pass
45 ///
46 /// @param CallNo Disambiguates this instance for when there are multiple
47 ///               instances of this pass in the pass manager. It is used only to
48 ///               keep the statistics apart and has no influence on the
49 ///               simplification itself.
50 ///
51 /// @return The Simplify pass.
52 llvm::Pass *createSimplifyWrapperPass(int CallNo = 0);
53 llvm::Pass *createSimplifyPrinterLegacyPass(llvm::raw_ostream &OS);
54 
55 struct SimplifyPass final : PassInfoMixin<SimplifyPass> {
CallNofinal56   SimplifyPass(int CallNo = 0) : CallNo(CallNo) {}
57 
58   llvm::PreservedAnalyses run(Scop &S, ScopAnalysisManager &SAM,
59                               ScopStandardAnalysisResults &AR, SPMUpdater &U);
60 
61 private:
62   int CallNo;
63 };
64 
65 struct SimplifyPrinterPass final : PassInfoMixin<SimplifyPrinterPass> {
66   SimplifyPrinterPass(raw_ostream &OS, int CallNo = 0)
OSfinal67       : OS(OS), CallNo(CallNo) {}
68 
69   PreservedAnalyses run(Scop &S, ScopAnalysisManager &,
70                         ScopStandardAnalysisResults &, SPMUpdater &);
71 
72 private:
73   raw_ostream &OS;
74   int CallNo;
75 };
76 } // namespace polly
77 
78 namespace llvm {
79 void initializeSimplifyWrapperPassPass(llvm::PassRegistry &);
80 void initializeSimplifyPrinterLegacyPassPass(llvm::PassRegistry &);
81 } // namespace llvm
82 
83 #endif /* POLLY_TRANSFORM_SIMPLIFY_H */
84