diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-05-18 14:22:09 +0100 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2015-05-18 19:15:52 +0100 |
commit | 07276db28d654594e0e86e9e467cad393f752e6e (patch) | |
tree | 6450e07d64045f0c0949b3423501316b672641c7 /compiler/optimizing/code_generator_arm.cc | |
parent | 17f1bc531ea2f8c1a6fac3def13dee1b901949dd (diff) |
Don't do a null test in MarkGCCard if the value cannot be null.
Change-Id: I45687f6d3505178e2fc3689eac9cb6ab1b2c1e29
Diffstat (limited to 'compiler/optimizing/code_generator_arm.cc')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 672e55ea0b..7b37f74847 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -3037,7 +3037,8 @@ void LocationsBuilderARM::HandleFieldSet(HInstruction* instruction, const FieldI } void InstructionCodeGeneratorARM::HandleFieldSet(HInstruction* instruction, - const FieldInfo& field_info) { + const FieldInfo& field_info, + bool value_can_be_null) { DCHECK(instruction->IsInstanceFieldSet() || instruction->IsStaticFieldSet()); LocationSummary* locations = instruction->GetLocations(); @@ -3126,7 +3127,8 @@ void InstructionCodeGeneratorARM::HandleFieldSet(HInstruction* instruction, if (CodeGenerator::StoreNeedsWriteBarrier(field_type, instruction->InputAt(1))) { Register temp = locations->GetTemp(0).AsRegister<Register>(); Register card = locations->GetTemp(1).AsRegister<Register>(); - codegen_->MarkGCCard(temp, card, base, value.AsRegister<Register>()); + codegen_->MarkGCCard( + temp, card, base, value.AsRegister<Register>(), value_can_be_null); } if (is_volatile) { @@ -3253,7 +3255,7 @@ void LocationsBuilderARM::VisitInstanceFieldSet(HInstanceFieldSet* instruction) } void InstructionCodeGeneratorARM::VisitInstanceFieldSet(HInstanceFieldSet* instruction) { - HandleFieldSet(instruction, instruction->GetFieldInfo()); + HandleFieldSet(instruction, instruction->GetFieldInfo(), instruction->GetValueCanBeNull()); } void LocationsBuilderARM::VisitInstanceFieldGet(HInstanceFieldGet* instruction) { @@ -3277,7 +3279,7 @@ void LocationsBuilderARM::VisitStaticFieldSet(HStaticFieldSet* instruction) { } void InstructionCodeGeneratorARM::VisitStaticFieldSet(HStaticFieldSet* instruction) { - HandleFieldSet(instruction, instruction->GetFieldInfo()); + HandleFieldSet(instruction, instruction->GetFieldInfo(), instruction->GetValueCanBeNull()); } void LocationsBuilderARM::VisitNullCheck(HNullCheck* instruction) { @@ -3547,7 +3549,7 @@ void InstructionCodeGeneratorARM::VisitArraySet(HArraySet* instruction) { DCHECK_EQ(value_type, Primitive::kPrimNot); Register temp = locations->GetTemp(0).AsRegister<Register>(); Register card = locations->GetTemp(1).AsRegister<Register>(); - codegen_->MarkGCCard(temp, card, obj, value); + codegen_->MarkGCCard(temp, card, obj, value, instruction->GetValueCanBeNull()); } } else { DCHECK_EQ(value_type, Primitive::kPrimNot); @@ -3652,13 +3654,21 @@ void InstructionCodeGeneratorARM::VisitBoundsCheck(HBoundsCheck* instruction) { __ b(slow_path->GetEntryLabel(), CS); } -void CodeGeneratorARM::MarkGCCard(Register temp, Register card, Register object, Register value) { +void CodeGeneratorARM::MarkGCCard(Register temp, + Register card, + Register object, + Register value, + bool can_be_null) { Label is_null; - __ CompareAndBranchIfZero(value, &is_null); + if (can_be_null) { + __ CompareAndBranchIfZero(value, &is_null); + } __ LoadFromOffset(kLoadWord, card, TR, Thread::CardTableOffset<kArmWordSize>().Int32Value()); __ Lsr(temp, object, gc::accounting::CardTable::kCardShift); __ strb(card, Address(card, temp)); - __ Bind(&is_null); + if (can_be_null) { + __ Bind(&is_null); + } } void LocationsBuilderARM::VisitTemporary(HTemporary* temp) { |