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