diff options
author | Aart Bik <ajcbik@google.com> | 2016-06-07 13:49:12 -0700 |
---|---|---|
committer | Aart Bik <ajcbik@google.com> | 2016-06-08 09:41:33 -0700 |
commit | 296fbb4c3a629ec99149e512ddb66d7b4d7854fe (patch) | |
tree | efdf1998a9bd2aa55a0962d01300412c366c0042 /compiler/optimizing/instruction_builder.cc | |
parent | 88b970c24162c0b223f724e664a6da08ae6bfc5c (diff) |
Do not place null check on unresolved method calls.
Rationale:
These invokes drop through the runtime anyway where various
checks are done, including null check. A few of these
checks need to occur before the null check.
With fail-before/pass-after smali test.
BUG=29068831
Change-Id: I260715e742365433a323598d97f7fdab321e8512
Diffstat (limited to 'compiler/optimizing/instruction_builder.cc')
-rw-r--r-- | compiler/optimizing/instruction_builder.cc | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc index 135038b753..f2286e46e6 100644 --- a/compiler/optimizing/instruction_builder.cc +++ b/compiler/optimizing/instruction_builder.cc @@ -833,7 +833,8 @@ bool HInstructionBuilder::BuildInvoke(const Instruction& instruction, register_index, is_range, descriptor, - nullptr /* clinit_check */); + nullptr, /* clinit_check */ + true /* is_unresolved */); } // Potential class initialization check, in the case of a static method call. @@ -898,7 +899,8 @@ bool HInstructionBuilder::BuildInvoke(const Instruction& instruction, register_index, is_range, descriptor, - clinit_check); + clinit_check, + false /* is_unresolved */); } bool HInstructionBuilder::BuildNewInstance(uint16_t type_index, uint32_t dex_pc) { @@ -1091,14 +1093,17 @@ bool HInstructionBuilder::HandleInvoke(HInvoke* invoke, uint32_t register_index, bool is_range, const char* descriptor, - HClinitCheck* clinit_check) { + HClinitCheck* clinit_check, + bool is_unresolved) { DCHECK(!invoke->IsInvokeStaticOrDirect() || !invoke->AsInvokeStaticOrDirect()->IsStringInit()); size_t start_index = 0; size_t argument_index = 0; if (invoke->GetOriginalInvokeType() != InvokeType::kStatic) { // Instance call. - HInstruction* arg = LoadNullCheckedLocal(is_range ? register_index : args[0], - invoke->GetDexPc()); + uint32_t obj_reg = is_range ? register_index : args[0]; + HInstruction* arg = is_unresolved + ? LoadLocal(obj_reg, Primitive::kPrimNot) + : LoadNullCheckedLocal(obj_reg, invoke->GetDexPc()); invoke->SetArgumentAt(0, arg); start_index = 1; argument_index = 1; |