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