OSDN Git Service

Merge "Hash-based DexCache field array."
authorTreehugger Robot <treehugger-gerrit@google.com>
Fri, 10 Mar 2017 15:13:31 +0000 (15:13 +0000)
committerGerrit Code Review <noreply-gerritcodereview@google.com>
Fri, 10 Mar 2017 15:13:31 +0000 (15:13 +0000)
1  2 
compiler/optimizing/inliner.cc
compiler/optimizing/inliner.h

Simple merge
@@@ -107,54 -97,16 +107,55 @@@ class HInliner : public HOptimization 
      REQUIRES_SHARED(Locks::mutator_lock_);
  
    // Create a new HInstanceFieldGet.
-   HInstanceFieldGet* CreateInstanceFieldGet(Handle<mirror::DexCache> dex_cache,
-                                             uint32_t field_index,
+   HInstanceFieldGet* CreateInstanceFieldGet(uint32_t field_index,
+                                             ArtMethod* referrer,
                                              HInstruction* obj);
    // Create a new HInstanceFieldSet.
-   HInstanceFieldSet* CreateInstanceFieldSet(Handle<mirror::DexCache> dex_cache,
-                                             uint32_t field_index,
+   HInstanceFieldSet* CreateInstanceFieldSet(uint32_t field_index,
+                                             ArtMethod* referrer,
                                              HInstruction* obj,
-                                             HInstruction* value);
+                                             HInstruction* value,
+                                             bool* is_final = nullptr);
  
 +  // Try inlining the invoke instruction using inline caches.
 +  bool TryInlineFromInlineCache(
 +      const DexFile& caller_dex_file,
 +      HInvoke* invoke_instruction,
 +      ArtMethod* resolved_method)
 +    REQUIRES_SHARED(Locks::mutator_lock_);
 +
 +  // Try getting the inline cache from JIT code cache.
 +  // Return true if the inline cache was successfully allocated and the
 +  // invoke info was found in the profile info.
 +  InlineCacheType GetInlineCacheJIT(
 +      HInvoke* invoke_instruction,
 +      StackHandleScope<1>* hs,
 +      /*out*/Handle<mirror::ObjectArray<mirror::Class>>* inline_cache)
 +    REQUIRES_SHARED(Locks::mutator_lock_);
 +
 +  // Try getting the inline cache from AOT offline profile.
 +  // Return true if the inline cache was successfully allocated and the
 +  // invoke info was found in the profile info.
 +  InlineCacheType GetInlineCacheAOT(const DexFile& caller_dex_file,
 +      HInvoke* invoke_instruction,
 +      StackHandleScope<1>* hs,
 +      /*out*/Handle<mirror::ObjectArray<mirror::Class>>* inline_cache)
 +    REQUIRES_SHARED(Locks::mutator_lock_);
 +
 +  // Extract the mirror classes from the offline profile and add them to the `inline_cache`.
 +  // Note that even if we have profile data for the invoke the inline_cache might contain
 +  // only null entries if the types cannot be resolved.
 +  InlineCacheType ExtractClassesFromOfflineProfile(
 +      const HInvoke* invoke_instruction,
 +      const ProfileCompilationInfo::OfflineProfileMethodInfo& offline_profile,
 +      /*out*/Handle<mirror::ObjectArray<mirror::Class>> inline_cache)
 +    REQUIRES_SHARED(Locks::mutator_lock_);
 +
 +  // Compute the inline cache type.
 +  InlineCacheType GetInlineCacheType(
 +      const Handle<mirror::ObjectArray<mirror::Class>>& classes)
 +    REQUIRES_SHARED(Locks::mutator_lock_);
 +
    // Try to inline the target of a monomorphic call. If successful, the code
    // in the graph will look like:
    // if (receiver.getClass() != ic.GetMonomorphicType()) deopt