diff options
| author | 2013-04-30 12:09:45 -0700 | |
|---|---|---|
| committer | 2013-05-02 14:19:17 -0700 | |
| commit | 02c42237741b5573f9d790a5a0f17f408dceb543 (patch) | |
| tree | 293d72039e2e1a0e56fbcb572c6d92ccedc5581a /src/compiler/llvm/gbc_expander.cc | |
| parent | cf9773a7adff883012dbd519a66e85f1f7aaaa11 (diff) | |
Supporting de-virtualization for precise types.
Sharpening invoke-virtual and invoke-interface calls to invoke-direct for cases
where the type of "this" pointer in the invoke- params is precisely known.
Instructions that have an invoke opcode are marked as interesting, for each invoke-virtual/interface
we come across with a precise type for "this" we mark the location as a candidate for sharpening,
resolve the concrete method and save its method reference <DexFile, DexMethodIndex> to be sharpened
in CompilerDriver::ComputeInvokeInfo().
Added a new entry to AOT statistics showing the percentage of sharpened calls that were based on
type analysis.
Fix a minor bug in type creation for GetSuperClass(). Previously super class of a precise reference
had precise types created which is not necessarily the case.
Fixed DCHECK in Class::FindVirtualMethodForVirtual to handle cases for Miranda methods.
Sharpening only takes place for cases where no soft failures happen at verification time.
Change-Id: Ic027d0226d6f95260c1918014cb6313f2e0ca455
Diffstat (limited to 'src/compiler/llvm/gbc_expander.cc')
| -rw-r--r-- | src/compiler/llvm/gbc_expander.cc | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/compiler/llvm/gbc_expander.cc b/src/compiler/llvm/gbc_expander.cc index 94eb741039..c1e35a69a7 100644 --- a/src/compiler/llvm/gbc_expander.cc +++ b/src/compiler/llvm/gbc_expander.cc @@ -785,8 +785,10 @@ llvm::Value* GBCExpanderPass::EmitInvoke(llvm::CallInst& call_inst) { int vtable_idx = -1; uintptr_t direct_code = 0; uintptr_t direct_method = 0; + // TODO: pass actual value of dex PC (instead of kDexPCNotready) needed by verifier based + // sharpening after LLVM re-factoring is finished. bool is_fast_path = driver_-> - ComputeInvokeInfo(callee_method_idx, dex_compilation_unit_, + ComputeInvokeInfo(callee_method_idx, art::kDexPCNotReady, dex_compilation_unit_, invoke_type, vtable_idx, direct_code, direct_method); // Load the method object |