1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_COMPILER_DEX_PASS_ME_H_
18 #define ART_COMPILER_DEX_PASS_ME_H_
19 
20 #include <string>
21 #include "pass.h"
22 
23 namespace art {
24 
25 // Forward declarations.
26 struct BasicBlock;
27 struct CompilationUnit;
28 class Pass;
29 
30 /**
31  * @brief OptimizationFlag is an enumeration to perform certain tasks for a given pass.
32  * @details Each enum should be a power of 2 to be correctly used.
33  */
34 enum OptimizationFlag {
35   kOptimizationBasicBlockChange = 1,  /**< @brief Has there been a change to a BasicBlock? */
36   kOptimizationDefUsesChange = 2,     /**< @brief Has there been a change to a def-use? */
37   kLoopStructureChange = 4,           /**< @brief Has there been a loop structural change? */
38 };
39 
40 // Data holder class.
41 class PassMEDataHolder: public PassDataHolder {
42   public:
43     CompilationUnit* c_unit;
44     BasicBlock* bb;
45     void* data;
46 };
47 
48 enum DataFlowAnalysisMode {
49   kAllNodes = 0,                           /**< @brief All nodes. */
50   kPreOrderDFSTraversal,                   /**< @brief Depth-First-Search / Pre-Order. */
51   kRepeatingPreOrderDFSTraversal,          /**< @brief Depth-First-Search / Repeating Pre-Order. */
52   kReversePostOrderDFSTraversal,           /**< @brief Depth-First-Search / Reverse Post-Order. */
53   kRepeatingPostOrderDFSTraversal,         /**< @brief Depth-First-Search / Repeating Post-Order. */
54   kRepeatingReversePostOrderDFSTraversal,  /**< @brief Depth-First-Search / Repeating Reverse Post-Order. */
55   kPostOrderDOMTraversal,                  /**< @brief Dominator tree / Post-Order. */
56   kTopologicalSortTraversal,               /**< @brief Topological Order traversal. */
57   kRepeatingTopologicalSortTraversal,      /**< @brief Repeating Topological Order traversal. */
58   kLoopRepeatingTopologicalSortTraversal,  /**< @brief Loop-repeating Topological Order traversal. */
59   kNoNodes,                                /**< @brief Skip BasicBlock traversal. */
60 };
61 
62 /**
63  * @class Pass
64  * @brief Pass is the Pass structure for the optimizations.
65  * @details The following structure has the different optimization passes that we are going to do.
66  */
67 class PassME: public Pass {
68  public:
69   explicit PassME(const char* name, DataFlowAnalysisMode type = kAllNodes,
70           unsigned int flags = 0u, const char* dump = "")
Pass(name)71     : Pass(name), traversal_type_(type), flags_(flags), dump_cfg_folder_(dump) {
72   }
73 
PassME(const char * name,DataFlowAnalysisMode type,const char * dump)74   PassME(const char* name, DataFlowAnalysisMode type, const char* dump)
75     : Pass(name), traversal_type_(type), flags_(0), dump_cfg_folder_(dump) {
76   }
77 
PassME(const char * name,const char * dump)78   PassME(const char* name, const char* dump)
79     : Pass(name), traversal_type_(kAllNodes), flags_(0), dump_cfg_folder_(dump) {
80   }
81 
~PassME()82   ~PassME() {
83   }
84 
GetTraversal()85   virtual DataFlowAnalysisMode GetTraversal() const {
86     return traversal_type_;
87   }
88 
GetDumpCFGFolder()89   const char* GetDumpCFGFolder() const {
90     return dump_cfg_folder_;
91   }
92 
GetFlag(OptimizationFlag flag)93   bool GetFlag(OptimizationFlag flag) const {
94     return (flags_ & flag);
95   }
96 
97  protected:
98   /** @brief Type of traversal: determines the order to execute the pass on the BasicBlocks. */
99   const DataFlowAnalysisMode traversal_type_;
100 
101   /** @brief Flags for additional directives: used to determine if a particular post-optimization pass is necessary. */
102   const unsigned int flags_;
103 
104   /** @brief CFG Dump Folder: what sub-folder to use for dumping the CFGs post pass. */
105   const char* const dump_cfg_folder_;
106 };
107 }  // namespace art
108 #endif  // ART_COMPILER_DEX_PASS_ME_H_
109