1dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko/*
2dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * Copyright (C) 2015 The Android Open Source Project
3dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko *
4dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * Licensed under the Apache License, Version 2.0 (the "License");
5dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * you may not use this file except in compliance with the License.
6dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * You may obtain a copy of the License at
7dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko *
8dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko *      http://www.apache.org/licenses/LICENSE-2.0
9dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko *
10dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * Unless required by applicable law or agreed to in writing, software
11dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * distributed under the License is distributed on an "AS IS" BASIS,
12dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * See the License for the specific language governing permissions and
14dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko * limitations under the License.
15dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko */
16dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
17dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko#ifndef ART_COMPILER_OPTIMIZING_SHARPENING_H_
18dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko#define ART_COMPILER_OPTIMIZING_SHARPENING_H_
19dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
20dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko#include "optimization.h"
21dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
22dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Markonamespace art {
23dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
24dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Markoclass CodeGenerator;
25dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Markoclass CompilerDriver;
26dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Markoclass DexCompilationUnit;
27dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Markoclass HInvokeStaticOrDirect;
28dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
29dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko// Optimization that tries to improve the way we dispatch methods and access types,
30dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko// fields, etc. Besides actual method sharpening based on receiver type (for example
31dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko// virtual->direct), this includes selecting the best available dispatch for
32dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko// invoke-static/-direct based on code generator support.
33dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Markoclass HSharpening : public HOptimization {
34dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko public:
35dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  HSharpening(HGraph* graph,
36dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko              CodeGenerator* codegen,
37dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko              const DexCompilationUnit& compilation_unit,
38dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko              CompilerDriver* compiler_driver)
39dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko      : HOptimization(graph, kSharpeningPassName),
40dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko        codegen_(codegen),
41dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko        compilation_unit_(compilation_unit),
42dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko        compiler_driver_(compiler_driver) { }
43dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
44dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  void Run() OVERRIDE;
45dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
46dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  static constexpr const char* kSharpeningPassName = "sharpening";
47dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
48dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko private:
49dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  void ProcessInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke);
50cac5a7e871f1f346b317894359ad06fa7bd67fbaVladimir Marko  void ProcessLoadString(HLoadString* load_string);
51dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
52dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  CodeGenerator* codegen_;
53dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  const DexCompilationUnit& compilation_unit_;
54dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko  CompilerDriver* compiler_driver_;
55dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko};
56dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
57dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko}  // namespace art
58dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko
59dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko#endif  // ART_COMPILER_OPTIMIZING_SHARPENING_H_
60