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 202aaa4b5532d30c4e65d8892b556400bb61f9dc8cVladimir Marko#include "base/arena_containers.h" 21b666f4805c8ae707ea6fd7f6c7f375e0b000dba8Mathieu Chartier#include "base/arena_object.h" 2286ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil#include "block_builder.h" 233ff386aafefd5282bb76c8a50506a70a4321e698Nicolas Geoffray#include "dex_file.h" 247fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray#include "dex_file-inl.h" 25e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray#include "driver/compiler_driver.h" 268ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray#include "driver/dex_compilation_unit.h" 27dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil#include "instruction_builder.h" 2848c2b03965830c73cdddeae8aea8030f08430137Calin Juravle#include "optimizing_compiler_stats.h" 2901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray#include "primitive.h" 3020dfc797dc631bf8d655dcf123f46f13332d3074Dave Allison#include "nodes.h" 31dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil#include "ssa_builder.h" 32818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 33818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffraynamespace art { 34818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 35818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffrayclass HGraphBuilder : public ValueObject { 36818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray public: 375e8b137d28c840b128e2488f954cccee3e86db14David Brazdil HGraphBuilder(HGraph* graph, 387fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray DexCompilationUnit* dex_compilation_unit, 39e53798a7e3267305f696bf658e418c92e63e0834Nicolas Geoffray const DexCompilationUnit* const outer_compilation_unit, 407fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray const DexFile* dex_file, 4186ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil const DexFile::CodeItem& code_item, 4248c2b03965830c73cdddeae8aea8030f08430137Calin Juravle CompilerDriver* driver, 439523a3ed0ae6fa31cd978a3999fd88233218f98bNicolas Geoffray OptimizingCompilerStats* compiler_stats, 44736b560f2d2c89b63dc895888c671b5519afa4c8Mathieu Chartier const uint8_t* interpreter_metadata, 45dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil Handle<mirror::DexCache> dex_cache, 46dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil StackHandleScopeCollection* handles) 47dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil : graph_(graph), 488ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray dex_file_(dex_file), 4986ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil code_item_(code_item), 50e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray dex_compilation_unit_(dex_compilation_unit), 517fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray compiler_driver_(driver), 5260328910cad396589474f8513391ba733d19390bDavid Brazdil compilation_stats_(compiler_stats), 53dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil block_builder_(graph, dex_file, code_item), 54a4336d253b88f95c49891a8084579a4599785e90Vladimir Marko ssa_builder_(graph, dex_compilation_unit->GetDexCache(), handles), 55dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil instruction_builder_(graph, 56dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil &block_builder_, 57dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil &ssa_builder_, 58dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil dex_file, 59dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil code_item_, 60dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil Primitive::GetType(dex_compilation_unit_->GetShorty()[0]), 61dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil dex_compilation_unit, 62dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil outer_compilation_unit, 63dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil driver, 64dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil interpreter_metadata, 65dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil compiler_stats, 66dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil dex_cache) {} 677fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray 687fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray // Only for unit testing. 6986ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil HGraphBuilder(HGraph* graph, 7086ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil const DexFile::CodeItem& code_item, 71dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil StackHandleScopeCollection* handles, 7286ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil Primitive::Type return_type = Primitive::kPrimInt) 73dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil : graph_(graph), 747fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray dex_file_(nullptr), 7586ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil code_item_(code_item), 767fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray dex_compilation_unit_(nullptr), 777fb49da8ec62e8a10ed9419ade9f32c6b1174687Nicolas Geoffray compiler_driver_(nullptr), 7860328910cad396589474f8513391ba733d19390bDavid Brazdil null_dex_cache_(), 79dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil compilation_stats_(nullptr), 80dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil block_builder_(graph, nullptr, code_item), 81a4336d253b88f95c49891a8084579a4599785e90Vladimir Marko ssa_builder_(graph, null_dex_cache_, handles), 82dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil instruction_builder_(graph, 83dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil &block_builder_, 84dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil &ssa_builder_, 85dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil /* dex_file */ nullptr, 86dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil code_item_, 87dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil return_type, 88dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil /* dex_compilation_unit */ nullptr, 89dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil /* outer_compilation_unit */ nullptr, 90dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil /* compiler_driver */ nullptr, 91dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil /* interpreter_metadata */ nullptr, 92dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil /* compiler_stats */ nullptr, 93dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil null_dex_cache_) {} 94dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil 95dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil GraphAnalysisResult BuildGraph(); 96818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 977c3952f423b8213083d60596a5f0bf4237ca3f7bAndreas Gampe static constexpr const char* kBuilderPassName = "builder"; 987c3952f423b8213083d60596a5f0bf4237ca3f7bAndreas Gampe 99818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray private: 10060328910cad396589474f8513391ba733d19390bDavid Brazdil void MaybeRecordStat(MethodCompilationStat compilation_stat); 101dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil bool SkipCompilation(size_t number_of_branches); 10260328910cad396589474f8513391ba733d19390bDavid Brazdil 1035e8b137d28c840b128e2488f954cccee3e86db14David Brazdil HGraph* const graph_; 1048ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray const DexFile* const dex_file_; 10586ea7eeabe30c98bbe1651a51d03cb89776724e7David Brazdil const DexFile::CodeItem& code_item_; 106e53798a7e3267305f696bf658e418c92e63e0834Nicolas Geoffray 107e53798a7e3267305f696bf658e418c92e63e0834Nicolas Geoffray // The compilation unit of the current method being compiled. Note that 108e53798a7e3267305f696bf658e418c92e63e0834Nicolas Geoffray // it can be an inlined method. 10901bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray DexCompilationUnit* const dex_compilation_unit_; 110e53798a7e3267305f696bf658e418c92e63e0834Nicolas Geoffray 111e50383288a75244255d3ecedcc79ffe9caf774cbNicolas Geoffray CompilerDriver* const compiler_driver_; 112e53798a7e3267305f696bf658e418c92e63e0834Nicolas Geoffray 113dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil ScopedNullHandle<mirror::DexCache> null_dex_cache_; 11460328910cad396589474f8513391ba733d19390bDavid Brazdil 11560328910cad396589474f8513391ba733d19390bDavid Brazdil OptimizingCompilerStats* compilation_stats_; 11660328910cad396589474f8513391ba733d19390bDavid Brazdil 117dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil HBasicBlockBuilder block_builder_; 118dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil SsaBuilder ssa_builder_; 119dee58d6bb6d567fcd0c4f39d8d690c3acaf0e432David Brazdil HInstructionBuilder instruction_builder_; 120736b560f2d2c89b63dc895888c671b5519afa4c8Mathieu Chartier 121818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray DISALLOW_COPY_AND_ASSIGN(HGraphBuilder); 122818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray}; 123818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 124818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray} // namespace art 125818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray 126818f2107e6d2d9e80faac8ae8c92faffa83cbd11Nicolas Geoffray#endif // ART_COMPILER_OPTIMIZING_BUILDER_H_ 127