reference_type_propagation.h revision d9994f069dfeaa32ba929ca78816b5b83e2a4134
1184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray/* 210e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle * Copyright (C) 2015 The Android Open Source Project 3184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * 4184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License"); 5184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * you may not use this file except in compliance with the License. 6184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * You may obtain a copy of the License at 7184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * 8184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * http://www.apache.org/licenses/LICENSE-2.0 9184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * 10184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software 11184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS, 12184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * See the License for the specific language governing permissions and 14184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray * limitations under the License. 15184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray */ 16184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 1710e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle#ifndef ART_COMPILER_OPTIMIZING_REFERENCE_TYPE_PROPAGATION_H_ 1810e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle#define ART_COMPILER_OPTIMIZING_REFERENCE_TYPE_PROPAGATION_H_ 19184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 202aaa4b5532d30c4e65d8892b556400bb61f9dc8cVladimir Marko#include "base/arena_containers.h" 21acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle#include "driver/dex_compilation_unit.h" 22acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle#include "handle_scope-inl.h" 23184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray#include "nodes.h" 2410e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle#include "optimization.h" 25b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle#include "optimizing_compiler_stats.h" 26184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 27184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffraynamespace art { 28184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 2910e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle/** 3010e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle * Propagates reference types to instructions. 3110e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle */ 326c0c4f230f417ed484bae5c01b79551af7659389Calin Juravleclass ReferenceTypePropagation : public HOptimization { 33184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray public: 34a5ae3c3f468ffe3a317b498d7fde1f8e9325346aCalin Juravle ReferenceTypePropagation(HGraph* graph, 35a5ae3c3f468ffe3a317b498d7fde1f8e9325346aCalin Juravle StackHandleScopeCollection* handles, 36d9994f069dfeaa32ba929ca78816b5b83e2a4134Nicolas Geoffray bool is_first_run, 372e76830f0b3f23825677436c0633714402715099Calin Juravle const char* name = kReferenceTypePropagationPassName); 38184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 39be10e8e99a78caae01fb65769218800d465144aeVladimir Marko // Visit a single instruction. 40be10e8e99a78caae01fb65769218800d465144aeVladimir Marko void Visit(HInstruction* instruction); 41be10e8e99a78caae01fb65769218800d465144aeVladimir Marko 4210e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle void Run() OVERRIDE; 43184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 447c3952f423b8213083d60596a5f0bf4237ca3f7bAndreas Gampe static constexpr const char* kReferenceTypePropagationPassName = "reference_type_propagation"; 457c3952f423b8213083d60596a5f0bf4237ca3f7bAndreas Gampe 46184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray private: 477d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko class HandleCache { 487d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko public: 497d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko explicit HandleCache(StackHandleScopeCollection* handles) : handles_(handles) { } 507d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 517d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko template <typename T> 527d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko MutableHandle<T> NewHandle(T* object) SHARED_REQUIRES(Locks::mutator_lock_) { 537d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko return handles_->NewHandle(object); 547d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko } 557d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 567d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle GetObjectClassHandle(); 577d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle GetClassClassHandle(); 587d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle GetStringClassHandle(); 597d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle GetThrowableClassHandle(); 607d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 617d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko private: 627d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko StackHandleScopeCollection* handles_; 637d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 647d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle object_class_handle_; 657d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle class_class_handle_; 667d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle string_class_handle_; 677d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko ReferenceTypeInfo::TypeHandle throwable_class_handle_; 687d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko }; 697d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 707d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko class RTPVisitor; 717d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 72b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle void VisitPhi(HPhi* phi); 73184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray void VisitBasicBlock(HBasicBlock* block); 7490443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void UpdateBoundType(HBoundType* bound_type) SHARED_REQUIRES(Locks::mutator_lock_); 7590443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier void UpdatePhi(HPhi* phi) SHARED_REQUIRES(Locks::mutator_lock_); 7661d544bfb812d79f5c9ddad171198836cea719dbCalin Juravle void BoundTypeForIfNotNull(HBasicBlock* block); 77b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle void BoundTypeForIfInstanceOf(HBasicBlock* block); 78184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray void ProcessWorklist(); 79b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle void AddToWorklist(HInstruction* instr); 80b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle void AddDependentInstructionsToWorklist(HInstruction* instr); 81b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle 82b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle bool UpdateNullability(HInstruction* instr); 83b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle bool UpdateReferenceTypeInfo(HInstruction* instr); 84b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle 857d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko static void UpdateArrayGet(HArrayGet* instr, HandleCache* handle_cache) 867d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko SHARED_REQUIRES(Locks::mutator_lock_); 877d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko 88b1498f67b444c897fa8f1530777ef118e05aa631Calin Juravle ReferenceTypeInfo MergeTypes(const ReferenceTypeInfo& a, const ReferenceTypeInfo& b) 8990443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier SHARED_REQUIRES(Locks::mutator_lock_); 90acf735c13998ad2a175f5a17e7bfce220073279dCalin Juravle 91cdfed3dc422d0e1a9a0a948863308e58c39d01baCalin Juravle void ValidateTypes(); 92cdfed3dc422d0e1a9a0a948863308e58c39d01baCalin Juravle 937d1fbf38412078090e81e9d9fa502635d8541707Vladimir Marko HandleCache handle_cache_; 94184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 952aaa4b5532d30c4e65d8892b556400bb61f9dc8cVladimir Marko ArenaVector<HInstruction*> worklist_; 96184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 97d9994f069dfeaa32ba929ca78816b5b83e2a4134Nicolas Geoffray // Whether this reference type propagation is the first run we are doing. 98d9994f069dfeaa32ba929ca78816b5b83e2a4134Nicolas Geoffray const bool is_first_run_; 992e76830f0b3f23825677436c0633714402715099Calin Juravle 100184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray static constexpr size_t kDefaultWorklistSize = 8; 101184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 10210e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle DISALLOW_COPY_AND_ASSIGN(ReferenceTypePropagation); 103184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray}; 104184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 105184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray} // namespace art 106184d640d2a3ac86d871dab58386a50cc9bb973f9Nicolas Geoffray 10710e244f9e7f6d96a95c910a2bedef5bd3810c637Calin Juravle#endif // ART_COMPILER_OPTIMIZING_REFERENCE_TYPE_PROPAGATION_H_ 108