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