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