builder.h revision 48c2b03965830c73cdddeae8aea8030f08430137
1818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray/* 2818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * Copyright (C) 2014 The Android Open Source Project 3818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * 4818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 5818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * you may not use this file except in compliance with the License. 6818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * You may obtain a copy of the License at 7818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * 8818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 9818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * 10818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software 11818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 12818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * See the License for the specific language governing permissions and 14818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray * limitations under the License. 15818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray */ 16818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 17818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray#ifndef ART_COMPILER_OPTIMIZING_BUILDER_H_ 18818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray#define ART_COMPILER_OPTIMIZING_BUILDER_H_ 19818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 203ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray#include "dex_file.h" 217fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray#include "dex_file-inl.h" 22e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray#include "driver/compiler_driver.h" 238ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray#include "driver/dex_compilation_unit.h" 2448c2b03965830c73cdddeae8aea8030f08430137Calin Juravle#include "optimizing_compiler_stats.h" 2501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray#include "primitive.h" 260279ebb3efd653e6bb255470c99d26949c7bcd95Ian Rogers#include "utils/arena_object.h" 27be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray#include "utils/growable_array.h" 2820dfc797dc631bf8d655dcf123f46f13332d3074Dave Allison#include "nodes.h" 29818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 30818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffraynamespace art { 31818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 32818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass Instruction; 33e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampeclass SwitchTable; 34818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 35818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass HGraphBuilder : public ValueObject { 36818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray public: 378ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray HGraphBuilder(ArenaAllocator* arena, 387fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray DexCompilationUnit* dex_compilation_unit, 397fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray const DexFile* dex_file, 4048c2b03965830c73cdddeae8aea8030f08430137Calin Juravle CompilerDriver* driver, 4148c2b03965830c73cdddeae8aea8030f08430137Calin Juravle OptimizingCompilerStats* compiler_stats) 42818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray : arena_(arena), 43be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray branch_targets_(arena, 0), 443ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray locals_(arena, 0), 45818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray entry_block_(nullptr), 46818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray exit_block_(nullptr), 47818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray current_block_(nullptr), 483ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray graph_(nullptr), 49bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray constant0_(nullptr), 508ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray constant1_(nullptr), 518ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray dex_file_(dex_file), 52e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray dex_compilation_unit_(dex_compilation_unit), 537fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray compiler_driver_(driver), 54a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray return_type_(Primitive::GetType(dex_compilation_unit_->GetShorty()[0])), 55a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray code_start_(nullptr), 5648c2b03965830c73cdddeae8aea8030f08430137Calin Juravle latest_result_(nullptr), 5748c2b03965830c73cdddeae8aea8030f08430137Calin Juravle compilation_stats_(compiler_stats) {} 587fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 597fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray // Only for unit testing. 607fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray HGraphBuilder(ArenaAllocator* arena, Primitive::Type return_type = Primitive::kPrimInt) 617fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray : arena_(arena), 627fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray branch_targets_(arena, 0), 637fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray locals_(arena, 0), 647fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray entry_block_(nullptr), 657fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray exit_block_(nullptr), 667fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray current_block_(nullptr), 677fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray graph_(nullptr), 687fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray constant0_(nullptr), 697fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray constant1_(nullptr), 707fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray dex_file_(nullptr), 717fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray dex_compilation_unit_(nullptr), 727fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray compiler_driver_(nullptr), 73a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray return_type_(return_type), 74a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray code_start_(nullptr), 7548c2b03965830c73cdddeae8aea8030f08430137Calin Juravle latest_result_(nullptr), 7648c2b03965830c73cdddeae8aea8030f08430137Calin Juravle compilation_stats_(nullptr) {} 77818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 783ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray HGraph* BuildGraph(const DexFile::CodeItem& code); 79818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 80818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray private: 81818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray // Analyzes the dex instruction and adds HInstruction to the graph 82818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray // to execute that instruction. Returns whether the instruction can 83818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray // be handled. 84225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle bool AnalyzeDexInstruction(const Instruction& instruction, uint32_t dex_pc); 85be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 86be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // Finds all instructions that start a new block, and populates branch_targets_ with 87be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // the newly created blocks. 8843a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray // As a side effect, also compute the number of dex instructions, blocks, and 8943a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray // branches. 9043a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray void ComputeBranchTargets(const uint16_t* start, 9143a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray const uint16_t* end, 9243a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray size_t* number_of_dex_instructions, 9343a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray size_t* number_of_block, 9443a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray size_t* number_of_branches); 95be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray void MaybeUpdateCurrentBlock(size_t index); 96be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray HBasicBlock* FindBlockStartingAt(int32_t index) const; 97818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 9801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HIntConstant* GetIntConstant0(); 9901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HIntConstant* GetIntConstant1(); 10001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HIntConstant* GetIntConstant(int32_t constant); 10101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HLongConstant* GetLongConstant(int64_t constant); 102f583e5976e1de9aa206fb8de4f91000180685066Nicolas Geoffray void InitializeLocals(uint16_t count); 1033ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray HLocal* GetLocalAt(int register_index) const; 1043ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray void UpdateLocal(int register_index, HInstruction* instruction) const; 10501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HInstruction* LoadLocal(int register_index, Primitive::Type type) const; 106225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle void PotentiallyAddSuspendCheck(int32_t target_offset, uint32_t dex_pc); 10752e832b1278449e62d9eb502d54d5ff18f8606edNicolas Geoffray void InitializeParameters(uint16_t number_of_parameters); 108f583e5976e1de9aa206fb8de4f91000180685066Nicolas Geoffray 10901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 11088cb1755e1d6acaed0f66ce65d7a2a4465053342Roland Levillain void Unop_12x(const Instruction& instruction, Primitive::Type type); 11188cb1755e1d6acaed0f66ce65d7a2a4465053342Roland Levillain 11288cb1755e1d6acaed0f66ce65d7a2a4465053342Roland Levillain template<typename T> 113412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray void Binop_23x(const Instruction& instruction, Primitive::Type type); 11401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 11501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 116d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle void Binop_23x(const Instruction& instruction, Primitive::Type type, uint32_t dex_pc); 117d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 118d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle template<typename T> 1199aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle void Binop_23x_shift(const Instruction& instruction, Primitive::Type type); 1209aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 121ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle void Binop_23x_cmp(const Instruction& instruction, Primitive::Type type, HCompare::Bias bias); 122ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1239aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle template<typename T> 12401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void Binop_12x(const Instruction& instruction, Primitive::Type type); 12501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 12601bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 127d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle void Binop_12x(const Instruction& instruction, Primitive::Type type, uint32_t dex_pc); 128d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 129d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle template<typename T> 1309aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle void Binop_12x_shift(const Instruction& instruction, Primitive::Type type); 1319aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 1329aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle template<typename T> 13301bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void Binop_22b(const Instruction& instruction, bool reverse); 13401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 13501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 13601bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void Binop_22s(const Instruction& instruction, bool reverse); 13701bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 138225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle template<typename T> void If_21t(const Instruction& instruction, uint32_t dex_pc); 139225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle template<typename T> void If_22t(const Instruction& instruction, uint32_t dex_pc); 140f583e5976e1de9aa206fb8de4f91000180685066Nicolas Geoffray 141dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain void Conversion_12x(const Instruction& instruction, 142dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain Primitive::Type input_type, 143624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain Primitive::Type result_type, 144624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain uint32_t dex_pc); 145dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 146bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle void BuildCheckedDivRem(uint16_t out_reg, 147bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle uint16_t first_reg, 148bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle int64_t second_reg_or_constant, 149bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle uint32_t dex_pc, 150bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle Primitive::Type type, 151bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle bool second_is_lit, 152bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle bool is_div); 153d0d4852847432368b090c184d6639e573538dccfCalin Juravle 15401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void BuildReturn(const Instruction& instruction, Primitive::Type type); 15501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 15619a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray // Builds an instance field access node and returns whether the instruction is supported. 157225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle bool BuildInstanceFieldAccess(const Instruction& instruction, uint32_t dex_pc, bool is_put); 15819a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray 15919a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray // Builds a static field access node and returns whether the instruction is supported. 160225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle bool BuildStaticFieldAccess(const Instruction& instruction, uint32_t dex_pc, bool is_put); 16119a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray 1623c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray void BuildArrayAccess(const Instruction& instruction, 163225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc, 1643c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray bool is_get, 1653c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray Primitive::Type anticipated_type); 166e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray 16701bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray // Builds an invocation node and returns whether the instruction is supported. 16801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray bool BuildInvoke(const Instruction& instruction, 169225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc, 17001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t method_idx, 17101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t number_of_vreg_arguments, 17201bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray bool is_range, 17301bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t* args, 17401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t register_index); 17501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 176a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // Builds a new array node and the instructions that fill it. 177225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle void BuildFilledNewArray(uint32_t dex_pc, 178a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t type_index, 179a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t number_of_vreg_arguments, 180a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray bool is_range, 181a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t* args, 182a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t register_index); 183a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 184225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle void BuildFillArrayData(const Instruction& instruction, uint32_t dex_pc); 185d0d4852847432368b090c184d6639e573538dccfCalin Juravle 186a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // Fills the given object with data as specified in the fill-array-data 187a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // instruction. Currently only used for non-reference and non-floating point 188a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // arrays. 189a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray template <typename T> 190a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray void BuildFillArrayData(HInstruction* object, 191a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray const T* data, 192a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t element_count, 193a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray Primitive::Type anticipated_type, 194225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc); 195a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 196a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // Fills the given object with data as specified in the fill-array-data 197a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // instruction. The data must be for long and double arrays. 198a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray void BuildFillWideArrayData(HInstruction* object, 1998d6ae524ed5d2fed1f9e789d6de9764d374afa43Nicolas Geoffray const int64_t* data, 200a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t element_count, 201225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc); 202a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 20357a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray // Builds a `HInstanceOf`, or a `HCheckCast` instruction. 20457a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray // Returns whether we succeeded in building the instruction. 20557a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray bool BuildTypeCheck(const Instruction& instruction, 20657a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray uint8_t destination, 20757a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray uint8_t reference, 20857a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray uint16_t type_index, 209225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc); 21057a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray 211e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe // Builds an instruction sequence for a packed switch statement. 21248c2b03965830c73cdddeae8aea8030f08430137Calin Juravle void BuildPackedSwitch(const Instruction& instruction, uint32_t dex_pc); 213d881df5aad7950a185480876951762c1f60ea708Andreas Gampe 214e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe // Builds an instruction sequence for a sparse switch statement. 21548c2b03965830c73cdddeae8aea8030f08430137Calin Juravle void BuildSparseSwitch(const Instruction& instruction, uint32_t dex_pc); 216e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe 217e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe void BuildSwitchCaseHelper(const Instruction& instruction, size_t index, 218e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe bool is_last_case, const SwitchTable& table, 219e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe HInstruction* value, int32_t case_value_int, 220e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe int32_t target_offset, uint32_t dex_pc); 221e4d4d323aa42506351b03e842818e9ec09ea6c37Andreas Gampe 22248c2b03965830c73cdddeae8aea8030f08430137Calin Juravle bool SkipCompilation(size_t number_of_dex_instructions, 22348c2b03965830c73cdddeae8aea8030f08430137Calin Juravle size_t number_of_blocks, 22448c2b03965830c73cdddeae8aea8030f08430137Calin Juravle size_t number_of_branches); 22548c2b03965830c73cdddeae8aea8030f08430137Calin Juravle 22648c2b03965830c73cdddeae8aea8030f08430137Calin Juravle void MaybeRecordStat(MethodCompilationStat compilation_stat); 22748c2b03965830c73cdddeae8aea8030f08430137Calin Juravle 228818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray ArenaAllocator* const arena_; 229be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 230be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // A list of the size of the dex code holding block information for 231be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // the method. If an entry contains a block, then the dex instruction 232be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // starting at that entry is the first instruction of a new block. 233be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray GrowableArray<HBasicBlock*> branch_targets_; 234be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 2353ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray GrowableArray<HLocal*> locals_; 2363ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray 237818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HBasicBlock* entry_block_; 238818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HBasicBlock* exit_block_; 239818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HBasicBlock* current_block_; 240818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HGraph* graph_; 241818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 2423ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray HIntConstant* constant0_; 243bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray HIntConstant* constant1_; 2443ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray 2458ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray const DexFile* const dex_file_; 24601bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray DexCompilationUnit* const dex_compilation_unit_; 247e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray CompilerDriver* const compiler_driver_; 2487fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray const Primitive::Type return_type_; 2498ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 250a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // The pointer in the dex file where the instructions of the code item 251a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // being currently compiled start. 252a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray const uint16_t* code_start_; 253a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 254a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // The last invoke or fill-new-array being built. Only to be 255a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // used by move-result instructions. 256a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray HInstruction* latest_result_; 257a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 25848c2b03965830c73cdddeae8aea8030f08430137Calin Juravle OptimizingCompilerStats* compilation_stats_; 25948c2b03965830c73cdddeae8aea8030f08430137Calin Juravle 260818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); 261818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray}; 262818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 263818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray} // namespace art 264818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 265818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray#endif // ART_COMPILER_OPTIMIZING_BUILDER_H_ 266