sharpening.h revision dc151b2346bb8a4fdeed0c06e54c2fca21d59b5d
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); 50dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko 51dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko CodeGenerator* codegen_; 52dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko const DexCompilationUnit& compilation_unit_; 53dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko CompilerDriver* compiler_driver_; 54dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko}; 55dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko 56dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko} // namespace art 57dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko 58dc151b2346bb8a4fdeed0c06e54c2fca21d59b5dVladimir Marko#endif // ART_COMPILER_OPTIMIZING_SHARPENING_H_ 59