diff options
Diffstat (limited to 'compiler/optimizing/instruction_builder.cc')
-rw-r--r-- | compiler/optimizing/instruction_builder.cc | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc index 453068b560..32dcc2814b 100644 --- a/compiler/optimizing/instruction_builder.cc +++ b/compiler/optimizing/instruction_builder.cc @@ -1545,8 +1545,6 @@ void HInstructionBuilder::BuildFillArrayData(HInstruction* object, void HInstructionBuilder::BuildFillArrayData(const Instruction& instruction, uint32_t dex_pc) { HInstruction* array = LoadNullCheckedLocal(instruction.VRegA_31t(), dex_pc); - HInstruction* length = new (arena_) HArrayLength(array, dex_pc); - AppendInstruction(length); int32_t payload_offset = instruction.VRegB_31t() + dex_pc; const Instruction::ArrayDataPayload* payload = @@ -1554,6 +1552,14 @@ void HInstructionBuilder::BuildFillArrayData(const Instruction& instruction, uin const uint8_t* data = payload->data; uint32_t element_count = payload->element_count; + if (element_count == 0u) { + // For empty payload we emit only the null check above. + return; + } + + HInstruction* length = new (arena_) HArrayLength(array, dex_pc); + AppendInstruction(length); + // Implementation of this DEX instruction seems to be that the bounds check is // done before doing any stores. HInstruction* last_index = graph_->GetIntConstant(payload->element_count - 1, dex_pc); |