summaryrefslogtreecommitdiff
path: root/compiler/optimizing/instruction_builder.cc
diff options
context:
space:
mode:
authorAart Bik <ajcbik@google.com>2016-06-07 13:49:12 -0700
committerAart Bik <ajcbik@google.com>2016-06-08 09:41:33 -0700
commit296fbb4c3a629ec99149e512ddb66d7b4d7854fe (patch)
treeefdf1998a9bd2aa55a0962d01300412c366c0042 /compiler/optimizing/instruction_builder.cc
parent88b970c24162c0b223f724e664a6da08ae6bfc5c (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.cc15
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;