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