12469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/* 22469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * Copyright (C) 2014 The Android Open Source Project 32469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * 42469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * Licensed under the Apache License, Version 2.0 (the "License"); 52469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * you may not use this file except in compliance with the License. 62469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * You may obtain a copy of the License at 72469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * 82469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * http://www.apache.org/licenses/LICENSE-2.0 92469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * 102469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * Unless required by applicable law or agreed to in writing, software 112469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * distributed under the License is distributed on an "AS IS" BASIS, 122469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * See the License for the specific language governing permissions and 142469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * limitations under the License. 152469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 162469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 17fd5a852e49796374899772381f15c9033dae0057Narayan Kamath#ifndef ART_COMPILER_DEX_POST_OPT_PASSES_H_ 18fd5a852e49796374899772381f15c9033dae0057Narayan Kamath#define ART_COMPILER_DEX_POST_OPT_PASSES_H_ 192469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 202469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler#include "compiler_internals.h" 212469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler#include "pass_me.h" 222469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 232469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylernamespace art { 242469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 252469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 262469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class InitializeData 272469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief There is some data that needs to be initialized before performing 282469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * the post optimization passes. 292469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 302469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass InitializeData : public PassME { 312469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 322469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler InitializeData() : PassME("InitializeData") { 332469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 342469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 35e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 362469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler // New blocks may have been inserted so the first thing we do is ensure that 372469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler // the c_unit's number of blocks matches the actual count of basic blocks. 382469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 39e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 402469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 412469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->InitializeBasicBlockData(); 422469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->SSATransformationStart(); 432469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 442469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 452469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 462469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 472469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class MethodUseCount 482469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Count the register uses of the method 492469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 502469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass MethodUseCount : public PassME { 512469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 522469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler MethodUseCount() : PassME("UseCount") { 532469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 542469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 552469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler bool Worker(const PassDataHolder* data) const; 562469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 572469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler bool Gate(const PassDataHolder* data) const; 582469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 592469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 602469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 612469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class ClearPhiInformation 622469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Clear the PHI nodes from the CFG. 632469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 642469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass ClearPhiInstructions : public PassME { 652469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 662469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler ClearPhiInstructions() : PassME("ClearPhiInstructions") { 672469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 682469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 692469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler bool Worker(const PassDataHolder* data) const; 702469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 712469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 722469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 732469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class CalculatePredecessors 742469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Calculate the predecessor BitVector of each Basicblock. 752469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 762469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass CalculatePredecessors : public PassME { 772469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 782469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler CalculatePredecessors() : PassME("CalculatePredecessors") { 792469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 802469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 81e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const; 822469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 832469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 842469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 852469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class DFSOrders 862469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Compute the DFS order of the MIR graph 872469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 882469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass DFSOrders : public PassME { 892469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 902469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DFSOrders() : PassME("DFSOrders") { 912469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 922469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 93e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 942469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 95e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 962469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 972469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->ComputeDFSOrders(); 982469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 992469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 1002469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 1012469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 1022469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class BuildDomination 1032469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Build the domination information of the MIR Graph 1042469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 1052469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass BuildDomination : public PassME { 1062469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 1072469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler BuildDomination() : PassME("BuildDomination") { 1082469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1092469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 110e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 1112469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 112e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 1132469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 1142469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->ComputeDominators(); 1152469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->CompilerInitializeSSAConversion(); 1162469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1172469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 118e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void End(PassDataHolder* data) const { 1192469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 120e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 1212469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 1222469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler // Verify the dataflow information after the pass. 1232469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler if (c_unit->enable_debug & (1 << kDebugVerifyDataflow)) { 1242469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph->VerifyDataflow(); 1252469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1262469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1272469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 1282469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 1292469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 130622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko * @class TopologicalSortOrders 131622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko * @brief Compute the topological sort order of the MIR graph 132622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko */ 133622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Markoclass TopologicalSortOrders : public PassME { 134622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko public: 135622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko TopologicalSortOrders() : PassME("TopologicalSortOrders") { 136622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko } 137622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko 138622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko void Start(PassDataHolder* data) const { 139622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko DCHECK(data != nullptr); 140622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 141622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko DCHECK(c_unit != nullptr); 142622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko c_unit->mir_graph.get()->ComputeTopologicalSortOrder(); 143622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko } 144622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko}; 145622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko 146622bdbe6c295b08d06dfaa8d896b9ca152aa899cVladimir Marko/** 1472469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class DefBlockMatrix 1482469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Calculate the matrix of definition per basic block 1492469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 1502469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass DefBlockMatrix : public PassME { 1512469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 1522469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DefBlockMatrix() : PassME("DefBlockMatrix") { 1532469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1542469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 155e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 1562469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 157e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 1582469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 1592469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->ComputeDefBlockMatrix(); 1602469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1612469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 1622469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 1632469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 1642469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class CreatePhiNodes 1652469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Pass to create the phi nodes after SSA calculation 1662469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 1672469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass CreatePhiNodes : public PassME { 1682469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 1692469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler CreatePhiNodes() : PassME("CreatePhiNodes") { 1702469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1712469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 172e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 1732469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 174e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 1752469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 1762469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->InsertPhiNodes(); 1772469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1782469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 1792469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 1802469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 1812469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class ClearVisitedFlag 1822469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Pass to clear the visited flag for all basic blocks. 1832469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 1842469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 1852469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass ClearVisitedFlag : public PassME { 1862469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 1872469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler ClearVisitedFlag() : PassME("ClearVisitedFlag") { 1882469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1892469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 190e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 1912469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 192e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 1932469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 1942469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->ClearAllVisitedFlags(); 1952469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 1962469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 1972469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 1982469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 1992469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class SSAConversion 2002469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Pass for SSA conversion of MIRs 2012469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 2022469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass SSAConversion : public PassME { 2032469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 2042469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler SSAConversion() : PassME("SSAConversion") { 2052469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2062469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 207e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 2082469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 209e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 2102469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 2112469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler MIRGraph *mir_graph = c_unit->mir_graph.get(); 2122469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler mir_graph->DoDFSPreOrderSSARename(mir_graph->GetEntryBlock()); 2132469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2142469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 2152469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2162469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 2172469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class PhiNodeOperands 2182469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Pass to insert the Phi node operands to basic blocks 2192469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 2202469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass PhiNodeOperands : public PassME { 2212469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 2222469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler PhiNodeOperands() : PassME("PhiNodeOperands", kPreOrderDFSTraversal) { 2232469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2242469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2252469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler bool Worker(const PassDataHolder* data) const { 2262469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 2272469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; 2282469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 2292469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler BasicBlock* bb = down_cast<const PassMEDataHolder*>(data)->bb; 2302469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(bb != nullptr); 2312469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph->InsertPhiNodeOperands(bb); 2322469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler // No need of repeating, so just return false. 2332469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler return false; 2342469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2352469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 2362469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2372469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 2382469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class InitRegLocations 2392469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Initialize Register Locations. 2402469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 2412469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass PerformInitRegLocations : public PassME { 2422469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 2432469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler PerformInitRegLocations() : PassME("PerformInitRegLocation") { 2442469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2452469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 246e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 2472469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 248e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 2492469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 2502469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph->InitRegLocations(); 2512469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2522469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 2532469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2542469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 2552469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class ConstantPropagation 2562469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief Perform a constant propagation pass. 2572469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 2582469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass ConstantPropagation : public PassME { 2592469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 2602469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler ConstantPropagation() : PassME("ConstantPropagation") { 2612469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2622469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2632469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler bool Worker(const PassDataHolder* data) const { 2642469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 2652469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler CompilationUnit* c_unit = down_cast<const PassMEDataHolder*>(data)->c_unit; 2662469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 2672469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler BasicBlock* bb = down_cast<const PassMEDataHolder*>(data)->bb; 2682469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(bb != nullptr); 2692469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph->DoConstantPropagation(bb); 2702469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler // No need of repeating, so just return false. 2712469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler return false; 2722469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2732469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 274e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void Start(PassDataHolder* data) const { 2752469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 276e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 2772469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 2782469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph->InitializeConstantPropagation(); 2792469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2802469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 2812469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2822469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler/** 2832469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @class FreeData 2842469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler * @brief There is some data that needs to be freed after performing the post optimization passes. 2852469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler */ 2862469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beylerclass FreeData : public PassME { 2872469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler public: 2882469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler FreeData() : PassME("FreeData") { 2892469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2902469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 291e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler void End(PassDataHolder* data) const { 2922469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(data != nullptr); 293e1f65bcb957a65c6d45b319d968bc53a833f2c65Jean Christophe Beyler CompilationUnit* c_unit = down_cast<PassMEDataHolder*>(data)->c_unit; 2942469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler DCHECK(c_unit != nullptr); 2952469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler c_unit->mir_graph.get()->SSATransformationEnd(); 2962469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler } 2972469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler}; 2982469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 2992469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler} // namespace art 3002469e60e6ff08c2a0b4cd1e209246c5d91027679Jean Christophe Beyler 301fd5a852e49796374899772381f15c9033dae0057Narayan Kamath#endif // ART_COMPILER_DEX_POST_OPT_PASSES_H_ 302