pass_me.h revision 2469e60e6ff08c2a0b4cd1e209246c5d91027679
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; 454f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 464f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 474f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottenum DataFlowAnalysisMode { 484f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kAllNodes = 0, /**< @brief All nodes. */ 494f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kPreOrderDFSTraversal, /**< @brief Depth-First-Search / Pre-Order. */ 504f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kRepeatingPreOrderDFSTraversal, /**< @brief Depth-First-Search / Repeating Pre-Order. */ 514f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kReversePostOrderDFSTraversal, /**< @brief Depth-First-Search / Reverse Post-Order. */ 524f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kRepeatingPostOrderDFSTraversal, /**< @brief Depth-First-Search / Repeating Post-Order. */ 534f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kRepeatingReversePostOrderDFSTraversal, /**< @brief Depth-First-Search / Repeating Reverse Post-Order. */ 544f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kPostOrderDOMTraversal, /**< @brief Dominator tree / Post-Order. */ 5544e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler kTopologicalSortTraversal, /**< @brief Topological Order traversal. */ 5644e5bdec17d0528b90cc0773be2beb76dcafdc5bJean Christophe Beyler kRepeatingTopologicalSortTraversal, /**< @brief Repeating Topological Order traversal. */ 574f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott kNoNodes, /**< @brief Skip BasicBlock traversal. */ 584f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 594f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 604f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott/** 614f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @class Pass 624f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @brief Pass is the Pass structure for the optimizations. 634f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott * @details The following structure has the different optimization passes that we are going to do. 644f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott */ 654f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scottclass PassME: public Pass { 664f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott public: 674f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott explicit PassME(const char* name, DataFlowAnalysisMode type = kAllNodes, 684f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott unsigned int flags = 0u, const char* dump = "") 694f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : Pass(name), traversal_type_(type), flags_(flags), dump_cfg_folder_(dump) { 704f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 714f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 724f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott PassME(const char* name, DataFlowAnalysisMode type, const char* dump) 734f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : Pass(name), traversal_type_(type), flags_(0), dump_cfg_folder_(dump) { 744f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 754f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 764f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott PassME(const char* name, const char* dump) 774f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott : Pass(name), traversal_type_(kAllNodes), flags_(0), dump_cfg_folder_(dump) { 784f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 794f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 804f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott ~PassME() { 814f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 824f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 834f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott virtual DataFlowAnalysisMode GetTraversal() const { 844f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott return traversal_type_; 854f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 864f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 874f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const char* GetDumpCFGFolder() const { 884f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott return dump_cfg_folder_; 894f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 904f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 914f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott bool GetFlag(OptimizationFlag flag) const { 924f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott return (flags_ & flag); 934f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott } 944f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 954f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott protected: 964f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott /** @brief Type of traversal: determines the order to execute the pass on the BasicBlocks. */ 974f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const DataFlowAnalysisMode traversal_type_; 984f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 992469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler /** @brief Flags for additional directives: used to determine if a particular post-optimization pass is necessary. */ 1004f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const unsigned int flags_; 1014f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott 1024f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott /** @brief CFG Dump Folder: what sub-folder to use for dumping the CFGs post pass. */ 1034f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott const char* const dump_cfg_folder_; 1044f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott}; 1054f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott} // namespace art 1064f59668b3d51f63601ebe59dbd2b7e8a7c5bd093James C Scott#endif // ART_COMPILER_DEX_PASS_ME_H_ 107