bb_optimizations.h revision 1fd4821f6b3ac57a44c2ce91025686da4641d197
17d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/*
27d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * Copyright (C) 2014 The Android Open Source Project
37d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin *
47d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * Licensed under the Apache License, Version 2.0 (the "License");
57d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * you may not use this file except in compliance with the License.
67d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * You may obtain a copy of the License at
77d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin *
87d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin *      http://www.apache.org/licenses/LICENSE-2.0
97d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin *
10c8e41c591741b3da1077f7000274ad040bef8002Sylvestre Ledru * Unless required by applicable law or agreed to in writing, software
117d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * distributed under the License is distributed on an "AS IS" BASIS,
127d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * See the License for the specific language governing permissions and
147d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * limitations under the License.
150b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth */
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth
177d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#ifndef ART_COMPILER_DEX_BB_OPTIMIZATIONS_H_
187d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#define ART_COMPILER_DEX_BB_OPTIMIZATIONS_H_
197d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
207d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#include "compiler_internals.h"
217d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#include "pass_me.h"
227d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
237d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinnamespace art {
247d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
257d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/**
267d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @class CacheFieldLoweringInfo
277d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @brief Cache the lowering info for fields used by IGET/IPUT/SGET/SPUT insns.
287d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin */
297d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass CacheFieldLoweringInfo : public PassME {
307d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
317d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  CacheFieldLoweringInfo() : PassME("CacheFieldLoweringInfo", kNoNodes) {
327d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
337d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
347d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void Start(PassDataHolder* data) const {
357d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
367d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
377d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
387d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->DoCacheFieldLoweringInfo();
397d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
407d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
417d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Gate(const PassDataHolder* data) const {
427d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
437d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
447d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
457d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    return cUnit->mir_graph->HasFieldAccess();
462d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  }
472d24e2a396a1d211baaeedf32148a3b657240170David Blaikie};
487d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
497d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/**
507d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @class CacheMethodLoweringInfo
517d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @brief Cache the lowering info for methods called by INVOKEs.
527d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin */
537d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass CacheMethodLoweringInfo : public PassME {
547d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
557d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  CacheMethodLoweringInfo() : PassME("CacheMethodLoweringInfo", kNoNodes) {
567d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
577d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
587d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void Start(PassDataHolder* data) const {
597d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
607d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
617d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
627d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->DoCacheMethodLoweringInfo();
637d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
647d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
657d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Gate(const PassDataHolder* data) const {
667d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
677d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
68fd22883a345b2e04d0bdb4d4b9ed64ceebdc0601John McCall    DCHECK(cUnit != nullptr);
69bd3c5ecd37e760f0430c9cbd1fda5740eb7c0e27John McCall    return cUnit->mir_graph->HasInvokes();
70bd3c5ecd37e760f0430c9cbd1fda5740eb7c0e27John McCall  }
71bd3c5ecd37e760f0430c9cbd1fda5740eb7c0e27John McCall};
727d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
737d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/**
747d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @class SpecialMethodInliner
757d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @brief Performs method inlining pass on special kinds of methods.
767d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @details Special methods are methods that fall in one of the following categories:
777d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * empty, instance getter, instance setter, argument return, and constant return.
787d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin */
797d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass SpecialMethodInliner : public PassME {
807d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
817d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  SpecialMethodInliner() : PassME("SpecialMethodInliner") {
827d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
837d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
847d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Gate(const PassDataHolder* data) const {
857d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
867d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
877d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
887d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    return cUnit->mir_graph->InlineSpecialMethodsGate();
897d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
907d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
917d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void Start(PassDataHolder* data) const {
927d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
937d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
947d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
957d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->InlineSpecialMethodsStart();
967d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
977d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
987d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Worker(const PassDataHolder* data) const {
997d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1007d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data);
1017d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = pass_me_data_holder->c_unit;
1027d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1037d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    BasicBlock* bb = pass_me_data_holder->bb;
1047d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(bb != nullptr);
1057d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->InlineSpecialMethods(bb);
1067d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    // No need of repeating, so just return false.
1077d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    return false;
1087d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1097d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1107d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void End(PassDataHolder* data) const {
1117d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1127d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
1137d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1147d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->InlineSpecialMethodsEnd();
1157d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1167d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin};
1177d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1187d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/**
1197d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @class CodeLayout
1207d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @brief Perform the code layout pass.
1217d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin */
1227d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass CodeLayout : public PassME {
1237d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
1247d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  CodeLayout() : PassME("CodeLayout", kAllNodes, kOptimizationBasicBlockChange, "2_post_layout_cfg") {
1257d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1267d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1277d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void Start(PassDataHolder* data) const {
1287d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1297d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
1307d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1317d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->VerifyDataflow();
1327d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1337d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1347d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Worker(const PassDataHolder* data) const;
1357d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin};
1367d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1377d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/**
1387d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @class NullCheckEliminationAndTypeInference
1397d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @brief Null check elimination and type inference.
1407d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin */
1417d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass NullCheckEliminationAndTypeInference : public PassME {
1427d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
1437d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  NullCheckEliminationAndTypeInference()
1447d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    : PassME("NCE_TypeInference", kRepeatingTopologicalSortTraversal, "4_post_nce_cfg") {
1457d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1467d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1477d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void Start(PassDataHolder* data) const {
1487d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1497d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
1507d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1517d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->EliminateNullChecksAndInferTypesStart();
1527d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1537d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1547d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Worker(const PassDataHolder* data) const {
1557d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1567d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data);
1577d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = pass_me_data_holder->c_unit;
1587d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1597d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    BasicBlock* bb = pass_me_data_holder->bb;
1607d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(bb != nullptr);
1617d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    return cUnit->mir_graph->EliminateNullChecksAndInferTypes(bb);
1627d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1637d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1647d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void End(PassDataHolder* data) const {
1657d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1667d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
1677d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1687d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->EliminateNullChecksAndInferTypesEnd();
1697d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1707d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin};
1717d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1727d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass ClassInitCheckElimination : public PassME {
1737d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
1747d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  ClassInitCheckElimination()
1757d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    : PassME("ClInitCheckElimination", kLoopRepeatingTopologicalSortTraversal) {
1767d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1777d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1787d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Gate(const PassDataHolder* data) const {
1797d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1807d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
1817d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1827d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    return cUnit->mir_graph->EliminateClassInitChecksGate();
1837d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1847d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1857d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Worker(const PassDataHolder* data) const {
1867d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1877d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data);
1887d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = pass_me_data_holder->c_unit;
1897d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1907d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    BasicBlock* bb = pass_me_data_holder->bb;
1917d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(bb != nullptr);
1927d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    return cUnit->mir_graph->EliminateClassInitChecks(bb);
1937d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
1947d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
1957d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  void End(PassDataHolder* data) const {
1967d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
1977d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
1987d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(cUnit != nullptr);
1997d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    cUnit->mir_graph->EliminateClassInitChecksEnd();
2007d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
2017d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin};
2027d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
2037d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin/**
2047d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @class GlobalValueNumberingPass
2057d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin * @brief Performs the global value numbering pass.
2067d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin */
2077d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinclass GlobalValueNumberingPass : public PassME {
2087d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public:
2097d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  GlobalValueNumberingPass()
2107d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    : PassME("GVN", kLoopRepeatingTopologicalSortTraversal, "4_post_gvn_cfg") {
2117d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  }
2127d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin
2137d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin  bool Gate(const PassDataHolder* data) const OVERRIDE {
2147d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin    DCHECK(data != nullptr);
215    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
216    DCHECK(cUnit != nullptr);
217    return cUnit->mir_graph->ApplyGlobalValueNumberingGate();
218  }
219
220  bool Worker(const PassDataHolder* data) const OVERRIDE {
221    DCHECK(data != nullptr);
222    const PassMEDataHolder* pass_me_data_holder = down_cast<const PassMEDataHolder*>(data);
223    CompilationUnit* cUnit = pass_me_data_holder->c_unit;
224    DCHECK(cUnit != nullptr);
225    BasicBlock* bb = pass_me_data_holder->bb;
226    DCHECK(bb != nullptr);
227    return cUnit->mir_graph->ApplyGlobalValueNumbering(bb);
228  }
229
230  void End(PassDataHolder* data) const OVERRIDE {
231    DCHECK(data != nullptr);
232    CompilationUnit* cUnit = down_cast<PassMEDataHolder*>(data)->c_unit;
233    DCHECK(cUnit != nullptr);
234    cUnit->mir_graph->ApplyGlobalValueNumberingEnd();
235  }
236};
237
238/**
239 * @class BBCombine
240 * @brief Perform the basic block combination pass.
241 */
242class BBCombine : public PassME {
243 public:
244  BBCombine() : PassME("BBCombine", kPreOrderDFSTraversal, "5_post_bbcombine_cfg") {
245  }
246
247  bool Gate(const PassDataHolder* data) const {
248    DCHECK(data != nullptr);
249    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
250    DCHECK(cUnit != nullptr);
251    return ((cUnit->disable_opt & (1 << kSuppressExceptionEdges)) != 0);
252  }
253
254  bool Worker(const PassDataHolder* data) const;
255};
256
257/**
258 * @class BasicBlock Optimizations
259 * @brief Any simple BasicBlock optimization can be put here.
260 */
261class BBOptimizations : public PassME {
262 public:
263  BBOptimizations() : PassME("BBOptimizations", kNoNodes, "5_post_bbo_cfg") {
264  }
265
266  bool Gate(const PassDataHolder* data) const {
267    DCHECK(data != nullptr);
268    CompilationUnit* cUnit = down_cast<const PassMEDataHolder*>(data)->c_unit;
269    DCHECK(cUnit != nullptr);
270    return ((cUnit->disable_opt & (1 << kBBOpt)) == 0);
271  }
272
273  void Start(PassDataHolder* data) const;
274};
275
276}  // namespace art
277
278#endif  // ART_COMPILER_DEX_BB_OPTIMIZATIONS_H_
279