14f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott/* 24f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * Copyright (C) 2014 The Android Open Source Project 34f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * 44f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * Licensed under the Apache License, Version 2.0 (the "License"); 54f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * you may not use this file except in compliance with the License. 64f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * You may obtain a copy of the License at 74f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * 84f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * http://www.apache.org/licenses/LICENSE-2.0 94f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * 104f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * Unless required by applicable law or agreed to in writing, software 114f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * distributed under the License is distributed on an "AS IS" BASIS, 124f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * See the License for the specific language governing permissions and 144f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * limitations under the License. 154f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott */ 164f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 174f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#ifndef ART_COMPILER_DEX_PASS_ME_H_ 184f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#define ART_COMPILER_DEX_PASS_ME_H_ 194f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 204f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#include <string> 214f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#include "pass.h" 224f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 234f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottnamespace art { 244f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 254f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott// Forward declarations. 264f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottstruct BasicBlock; 274f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottstruct CompilationUnit; 284f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass Pass; 294f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 304f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott/** 314f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief OptimizationFlag is an enumeration to perform certain tasks for a given pass. 324f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @details Each enum should be a power of 2 to be correctly used. 334f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott */ 344f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottenum OptimizationFlag { 352469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler kOptimizationBasicBlockChange = 1, /**< @brief Has there been a change to a BasicBlock? */ 362469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler kOptimizationDefUsesChange = 2, /**< @brief Has there been a change to a def-use? */ 372469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler kLoopStructureChange = 4, /**< @brief Has there been a loop structural change? */ 384f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 394f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 404f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott// Data holder class. 414f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass PassMEDataHolder: public PassDataHolder { 424f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott public: 434f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott CompilationUnit* c_unit; 444f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott BasicBlock* bb; 45e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void* data; 464f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 474f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 484f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottenum DataFlowAnalysisMode { 494f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kAllNodes = 0, /**< @brief All nodes. */ 504f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kPreOrderDFSTraversal, /**< @brief Depth-First-Search / Pre-Order. */ 514f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kRepeatingPreOrderDFSTraversal, /**< @brief Depth-First-Search / Repeating Pre-Order. */ 524f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kReversePostOrderDFSTraversal, /**< @brief Depth-First-Search / Reverse Post-Order. */ 534f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kRepeatingPostOrderDFSTraversal, /**< @brief Depth-First-Search / Repeating Post-Order. */ 544f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kRepeatingReversePostOrderDFSTraversal, /**< @brief Depth-First-Search / Repeating Reverse Post-Order. */ 554f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kPostOrderDOMTraversal, /**< @brief Dominator tree / Post-Order. */ 5644e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler kTopologicalSortTraversal, /**< @brief Topological Order traversal. */ 5744e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler kRepeatingTopologicalSortTraversal, /**< @brief Repeating Topological Order traversal. */ 5855fff044d3a4f7196098e25bab1dad106d9b54a2Vladimir Marko kLoopRepeatingTopologicalSortTraversal, /**< @brief Loop-repeating Topological Order traversal. */ 594f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kNoNodes, /**< @brief Skip BasicBlock traversal. */ 604f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 614f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 624f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott/** 634f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @class Pass 644f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Pass is the Pass structure for the optimizations. 654f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @details The following structure has the different optimization passes that we are going to do. 664f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott */ 674f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass PassME: public Pass { 684f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott public: 694f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott explicit PassME(const char* name, DataFlowAnalysisMode type = kAllNodes, 704f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott unsigned int flags = 0u, const char* dump = "") 714f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : Pass(name), traversal_type_(type), flags_(flags), dump_cfg_folder_(dump) { 724f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 734f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 744f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott PassME(const char* name, DataFlowAnalysisMode type, const char* dump) 754f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : Pass(name), traversal_type_(type), flags_(0), dump_cfg_folder_(dump) { 764f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 774f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 784f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott PassME(const char* name, const char* dump) 794f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : Pass(name), traversal_type_(kAllNodes), flags_(0), dump_cfg_folder_(dump) { 804f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 814f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 824f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott ~PassME() { 834f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 844f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 854f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual DataFlowAnalysisMode GetTraversal() const { 864f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott return traversal_type_; 874f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 884f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 894f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const char* GetDumpCFGFolder() const { 904f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott return dump_cfg_folder_; 914f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 924f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 934f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott bool GetFlag(OptimizationFlag flag) const { 944f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott return (flags_ & flag); 954f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 964f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 974f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott protected: 984f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott /** @brief Type of traversal: determines the order to execute the pass on the BasicBlocks. */ 994f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const DataFlowAnalysisMode traversal_type_; 1004f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 1012469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler /** @brief Flags for additional directives: used to determine if a particular post-optimization pass is necessary. */ 1024f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const unsigned int flags_; 1034f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 1044f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott /** @brief CFG Dump Folder: what sub-folder to use for dumping the CFGs post pass. */ 1054f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const char* const dump_cfg_folder_; 1064f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 1074f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott} // namespace art 1084f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#endif // ART_COMPILER_DEX_PASS_ME_H_ 109