builder.h revision 624279f3c70f9904cbaf428078981b05d3b324c0
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" 2401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray#include "primitive.h" 250279ebb3efd653e6bb255470c99d26949c7bcd95Ian Rogers#include "utils/arena_object.h" 26be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray#include "utils/growable_array.h" 2720dfc797dc631bf8d655dcf123f46f13332d3074Dave Allison#include "nodes.h" 28818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 29818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffraynamespace art { 30818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 31818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass Instruction; 32818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 33818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass HGraphBuilder : public ValueObject { 34818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray public: 358ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray HGraphBuilder(ArenaAllocator* arena, 367fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray DexCompilationUnit* dex_compilation_unit, 377fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray const DexFile* dex_file, 387fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray CompilerDriver* driver) 39818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray : arena_(arena), 40be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray branch_targets_(arena, 0), 413ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray locals_(arena, 0), 42818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray entry_block_(nullptr), 43818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray exit_block_(nullptr), 44818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray current_block_(nullptr), 453ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray graph_(nullptr), 46bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray constant0_(nullptr), 478ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray constant1_(nullptr), 488ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray dex_file_(dex_file), 49e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray dex_compilation_unit_(dex_compilation_unit), 507fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray compiler_driver_(driver), 51a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray return_type_(Primitive::GetType(dex_compilation_unit_->GetShorty()[0])), 52a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray code_start_(nullptr), 53a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray latest_result_(nullptr) {} 547fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 557fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray // Only for unit testing. 567fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray HGraphBuilder(ArenaAllocator* arena, Primitive::Type return_type = Primitive::kPrimInt) 577fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray : arena_(arena), 587fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray branch_targets_(arena, 0), 597fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray locals_(arena, 0), 607fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray entry_block_(nullptr), 617fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray exit_block_(nullptr), 627fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray current_block_(nullptr), 637fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray graph_(nullptr), 647fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray constant0_(nullptr), 657fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray constant1_(nullptr), 667fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray dex_file_(nullptr), 677fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray dex_compilation_unit_(nullptr), 687fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray compiler_driver_(nullptr), 69a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray return_type_(return_type), 70a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray code_start_(nullptr), 71a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray latest_result_(nullptr) {} 72818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 733ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray HGraph* BuildGraph(const DexFile::CodeItem& code); 74818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 75818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray private: 76818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray // Analyzes the dex instruction and adds HInstruction to the graph 77818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray // to execute that instruction. Returns whether the instruction can 78818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray // be handled. 79225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle bool AnalyzeDexInstruction(const Instruction& instruction, uint32_t dex_pc); 80be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 81be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // Finds all instructions that start a new block, and populates branch_targets_ with 82be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // the newly created blocks. 8343a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray // As a side effect, also compute the number of dex instructions, blocks, and 8443a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray // branches. 8543a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray void ComputeBranchTargets(const uint16_t* start, 8643a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray const uint16_t* end, 8743a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray size_t* number_of_dex_instructions, 8843a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray size_t* number_of_block, 8943a539f780af20a1854bca81c3d4835a585f0620Nicolas Geoffray size_t* number_of_branches); 90be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray void MaybeUpdateCurrentBlock(size_t index); 91be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray HBasicBlock* FindBlockStartingAt(int32_t index) const; 92818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 9301bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HIntConstant* GetIntConstant0(); 9401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HIntConstant* GetIntConstant1(); 9501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HIntConstant* GetIntConstant(int32_t constant); 9601bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HLongConstant* GetLongConstant(int64_t constant); 97f583e5976e1de9aa206fb8de4f91000180685066Nicolas Geoffray void InitializeLocals(uint16_t count); 983ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray HLocal* GetLocalAt(int register_index) const; 993ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray void UpdateLocal(int register_index, HInstruction* instruction) const; 10001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray HInstruction* LoadLocal(int register_index, Primitive::Type type) const; 101225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle void PotentiallyAddSuspendCheck(int32_t target_offset, uint32_t dex_pc); 10252e832b1278449e62d9eb502d54d5ff18f8606edNicolas Geoffray void InitializeParameters(uint16_t number_of_parameters); 103f583e5976e1de9aa206fb8de4f91000180685066Nicolas Geoffray 10401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 10588cb1755e1d6acaed0f66ce65d7a2a4465053342Roland Levillain void Unop_12x(const Instruction& instruction, Primitive::Type type); 10688cb1755e1d6acaed0f66ce65d7a2a4465053342Roland Levillain 10788cb1755e1d6acaed0f66ce65d7a2a4465053342Roland Levillain template<typename T> 108412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray void Binop_23x(const Instruction& instruction, Primitive::Type type); 10901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 11001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 111d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle void Binop_23x(const Instruction& instruction, Primitive::Type type, uint32_t dex_pc); 112d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 113d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle template<typename T> 1149aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle void Binop_23x_shift(const Instruction& instruction, Primitive::Type type); 1159aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 116ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle void Binop_23x_cmp(const Instruction& instruction, Primitive::Type type, HCompare::Bias bias); 117ddb7df25af45d7cd19ed1138e537973735cc78a5Calin Juravle 1189aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle template<typename T> 11901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void Binop_12x(const Instruction& instruction, Primitive::Type type); 12001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 12101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 122d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle void Binop_12x(const Instruction& instruction, Primitive::Type type, uint32_t dex_pc); 123d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle 124d6fb6cfb6f2d0d9595f55e8cc18d2753be5d9a13Calin Juravle template<typename T> 1259aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle void Binop_12x_shift(const Instruction& instruction, Primitive::Type type); 1269aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle 1279aec02fc5df5518c16f1e5a9b6cb198a192db973Calin Juravle template<typename T> 12801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void Binop_22b(const Instruction& instruction, bool reverse); 12901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 13001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray template<typename T> 13101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void Binop_22s(const Instruction& instruction, bool reverse); 13201bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 133225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle template<typename T> void If_21t(const Instruction& instruction, uint32_t dex_pc); 134225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle template<typename T> void If_22t(const Instruction& instruction, uint32_t dex_pc); 135f583e5976e1de9aa206fb8de4f91000180685066Nicolas Geoffray 136dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain void Conversion_12x(const Instruction& instruction, 137dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain Primitive::Type input_type, 138624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain Primitive::Type result_type, 139624279f3c70f9904cbaf428078981b05d3b324c0Roland Levillain uint32_t dex_pc); 140dff1f2812ecdaea89978c5351f0c70cdabbc0821Roland Levillain 141bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle void BuildCheckedDivRem(uint16_t out_reg, 142bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle uint16_t first_reg, 143bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle int64_t second_reg_or_constant, 144bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle uint32_t dex_pc, 145bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle Primitive::Type type, 146bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle bool second_is_lit, 147bacfec30ee9f2f6fdfd190f11b105b609938efcaCalin Juravle bool is_div); 148d0d4852847432368b090c184d6639e573538dccfCalin Juravle 14901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray void BuildReturn(const Instruction& instruction, Primitive::Type type); 15001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 15119a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray // Builds an instance field access node and returns whether the instruction is supported. 152225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle bool BuildInstanceFieldAccess(const Instruction& instruction, uint32_t dex_pc, bool is_put); 15319a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray 15419a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray // Builds a static field access node and returns whether the instruction is supported. 155225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle bool BuildStaticFieldAccess(const Instruction& instruction, uint32_t dex_pc, bool is_put); 15619a19cffd197a28ae4c9c3e59eff6352fd392241Nicolas Geoffray 1573c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray void BuildArrayAccess(const Instruction& instruction, 158225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc, 1593c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray bool is_get, 1603c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray Primitive::Type anticipated_type); 161e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray 16201bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray // Builds an invocation node and returns whether the instruction is supported. 16301bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray bool BuildInvoke(const Instruction& instruction, 164225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc, 16501bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t method_idx, 16601bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t number_of_vreg_arguments, 16701bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray bool is_range, 16801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t* args, 16901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray uint32_t register_index); 17001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray 171a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // Builds a new array node and the instructions that fill it. 172225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle void BuildFilledNewArray(uint32_t dex_pc, 173a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t type_index, 174a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t number_of_vreg_arguments, 175a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray bool is_range, 176a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t* args, 177a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t register_index); 178a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 179225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle void BuildFillArrayData(const Instruction& instruction, uint32_t dex_pc); 180d0d4852847432368b090c184d6639e573538dccfCalin Juravle 181a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // Fills the given object with data as specified in the fill-array-data 182a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // instruction. Currently only used for non-reference and non-floating point 183a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // arrays. 184a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray template <typename T> 185a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray void BuildFillArrayData(HInstruction* object, 186a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray const T* data, 187a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t element_count, 188a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray Primitive::Type anticipated_type, 189225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc); 190a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 191a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // Fills the given object with data as specified in the fill-array-data 192a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // instruction. The data must be for long and double arrays. 193a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray void BuildFillWideArrayData(HInstruction* object, 1948d6ae524ed5d2fed1f9e789d6de9764d374afa43Nicolas Geoffray const int64_t* data, 195a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray uint32_t element_count, 196225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc); 197a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 19857a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray // Builds a `HInstanceOf`, or a `HCheckCast` instruction. 19957a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray // Returns whether we succeeded in building the instruction. 20057a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray bool BuildTypeCheck(const Instruction& instruction, 20157a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray uint8_t destination, 20257a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray uint8_t reference, 20357a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray uint16_t type_index, 204225ff81cd34e20c97897a6b3f755a0a284b08f46Calin Juravle uint32_t dex_pc); 20557a88d4ac205874dc85d22f9f6a9ca3c4c373eebNicolas Geoffray 206818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray ArenaAllocator* const arena_; 207be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 208be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // A list of the size of the dex code holding block information for 209be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // the method. If an entry contains a block, then the dex instruction 210be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray // starting at that entry is the first instruction of a new block. 211be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray GrowableArray<HBasicBlock*> branch_targets_; 212be9a92aa804c0d210f80966b74ef8ed3987f335aNicolas Geoffray 2133ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray GrowableArray<HLocal*> locals_; 2143ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray 215818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HBasicBlock* entry_block_; 216818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HBasicBlock* exit_block_; 217818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HBasicBlock* current_block_; 218818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray HGraph* graph_; 219818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 2203ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray HIntConstant* constant0_; 221bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray HIntConstant* constant1_; 2223ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray 2238ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray const DexFile* const dex_file_; 22401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray DexCompilationUnit* const dex_compilation_unit_; 225e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray CompilerDriver* const compiler_driver_; 2267fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray const Primitive::Type return_type_; 2278ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray 228a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // The pointer in the dex file where the instructions of the code item 229a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // being currently compiled start. 230a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray const uint16_t* code_start_; 231a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 232a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // The last invoke or fill-new-array being built. Only to be 233a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray // used by move-result instructions. 234a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray HInstruction* latest_result_; 235a3d05a40de076aabf12ea284c67c99ff28b43dbfNicolas Geoffray 236818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); 237818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray}; 238818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 239818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray} // namespace art 240818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 241818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray#endif // ART_COMPILER_OPTIMIZING_BUILDER_H_ 242