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