diff options
Diffstat (limited to 'compiler/dex/quick')
-rw-r--r-- | compiler/dex/quick/arm/int_arm.cc | 4 | ||||
-rw-r--r-- | compiler/dex/quick/arm64/int_arm64.cc | 4 | ||||
-rw-r--r-- | compiler/dex/quick/codegen_util.cc | 14 | ||||
-rw-r--r-- | compiler/dex/quick/gen_common.cc | 4 | ||||
-rwxr-xr-x | compiler/dex/quick/gen_invoke.cc | 2 | ||||
-rw-r--r-- | compiler/dex/quick/mips/int_mips.cc | 2 | ||||
-rw-r--r-- | compiler/dex/quick/mir_to_lir.cc | 2 | ||||
-rw-r--r-- | compiler/dex/quick/mir_to_lir.h | 3 | ||||
-rwxr-xr-x | compiler/dex/quick/x86/int_x86.cc | 4 |
9 files changed, 22 insertions, 17 deletions
diff --git a/compiler/dex/quick/arm/int_arm.cc b/compiler/dex/quick/arm/int_arm.cc index cab039bfd4..e38dbf5a8d 100644 --- a/compiler/dex/quick/arm/int_arm.cc +++ b/compiler/dex/quick/arm/int_arm.cc @@ -872,7 +872,7 @@ bool ArmMir2Lir::GenInlinedCas(CallInfo* info, bool is_long, bool is_object) { if (is_object && !mir_graph_->IsConstantNullRef(rl_new_value)) { // Mark card for object assuming new value is stored. - MarkGCCard(rl_new_value.reg, rl_object.reg); + MarkGCCard(0, rl_new_value.reg, rl_object.reg); } RegLocation rl_offset = LoadValue(rl_src_offset, kCoreReg); @@ -1471,7 +1471,7 @@ void ArmMir2Lir::GenArrayPut(int opt_flags, OpSize size, RegLocation rl_array, FreeTemp(reg_ptr); } if (card_mark) { - MarkGCCard(rl_src.reg, rl_array.reg); + MarkGCCard(opt_flags, rl_src.reg, rl_array.reg); } } diff --git a/compiler/dex/quick/arm64/int_arm64.cc b/compiler/dex/quick/arm64/int_arm64.cc index 0e00698388..b12fc0a313 100644 --- a/compiler/dex/quick/arm64/int_arm64.cc +++ b/compiler/dex/quick/arm64/int_arm64.cc @@ -758,7 +758,7 @@ bool Arm64Mir2Lir::GenInlinedCas(CallInfo* info, bool is_long, bool is_object) { if (is_object && !mir_graph_->IsConstantNullRef(rl_new_value)) { // Mark card for object assuming new value is stored. - MarkGCCard(rl_new_value.reg, rl_object.reg); + MarkGCCard(0, rl_new_value.reg, rl_object.reg); } RegStorage r_ptr = AllocTempRef(); @@ -1281,7 +1281,7 @@ void Arm64Mir2Lir::GenArrayPut(int opt_flags, OpSize size, RegLocation rl_array, FreeTemp(reg_ptr); } if (card_mark) { - MarkGCCard(rl_src.reg, rl_array.reg); + MarkGCCard(opt_flags, rl_src.reg, rl_array.reg); } } diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc index 80cb535307..1cde01e244 100644 --- a/compiler/dex/quick/codegen_util.cc +++ b/compiler/dex/quick/codegen_util.cc @@ -314,13 +314,17 @@ void Mir2Lir::UpdateLIROffsets() { } } -void Mir2Lir::MarkGCCard(RegStorage val_reg, RegStorage tgt_addr_reg) { +void Mir2Lir::MarkGCCard(int opt_flags, RegStorage val_reg, RegStorage tgt_addr_reg) { DCHECK(val_reg.Valid()); DCHECK_EQ(val_reg.Is64Bit(), cu_->target64); - LIR* branch_over = OpCmpImmBranch(kCondEq, val_reg, 0, nullptr); - UnconditionallyMarkGCCard(tgt_addr_reg); - LIR* target = NewLIR0(kPseudoTargetLabel); - branch_over->target = target; + if ((opt_flags & MIR_STORE_NON_NULL_VALUE) != 0) { + UnconditionallyMarkGCCard(tgt_addr_reg); + } else { + LIR* branch_over = OpCmpImmBranch(kCondEq, val_reg, 0, nullptr); + UnconditionallyMarkGCCard(tgt_addr_reg); + LIR* target = NewLIR0(kPseudoTargetLabel); + branch_over->target = target; + } } /* Dump instructions and constant pool contents */ diff --git a/compiler/dex/quick/gen_common.cc b/compiler/dex/quick/gen_common.cc index 4dd24cb9f6..d1b8b034de 100644 --- a/compiler/dex/quick/gen_common.cc +++ b/compiler/dex/quick/gen_common.cc @@ -665,7 +665,7 @@ void Mir2Lir::GenSput(MIR* mir, RegLocation rl_src, OpSize size) { field_info.IsVolatile() ? kVolatile : kNotVolatile); } if (IsRef(size) && !mir_graph_->IsConstantNullRef(rl_src)) { - MarkGCCard(rl_src.reg, r_base); + MarkGCCard(mir->optimization_flags, rl_src.reg, r_base); } FreeTemp(r_base); } else { @@ -940,7 +940,7 @@ void Mir2Lir::GenIPut(MIR* mir, int opt_flags, OpSize size, } MarkPossibleNullPointerExceptionAfter(opt_flags, store); if (IsRef(size) && !mir_graph_->IsConstantNullRef(rl_src)) { - MarkGCCard(rl_src.reg, rl_obj.reg); + MarkGCCard(opt_flags, rl_src.reg, rl_obj.reg); } } else { QuickEntrypointEnum target; diff --git a/compiler/dex/quick/gen_invoke.cc b/compiler/dex/quick/gen_invoke.cc index a7900ae7df..31b81bfb92 100755 --- a/compiler/dex/quick/gen_invoke.cc +++ b/compiler/dex/quick/gen_invoke.cc @@ -1668,7 +1668,7 @@ bool Mir2Lir::GenInlinedUnsafePut(CallInfo* info, bool is_long, GenMemBarrier(kAnyAny); } if (is_object) { - MarkGCCard(rl_value.reg, rl_object.reg); + MarkGCCard(0, rl_value.reg, rl_object.reg); } return true; } diff --git a/compiler/dex/quick/mips/int_mips.cc b/compiler/dex/quick/mips/int_mips.cc index fb47238000..0778c3bad7 100644 --- a/compiler/dex/quick/mips/int_mips.cc +++ b/compiler/dex/quick/mips/int_mips.cc @@ -641,7 +641,7 @@ void MipsMir2Lir::GenArrayPut(int opt_flags, OpSize size, RegLocation rl_array, FreeTemp(reg_ptr); } if (card_mark) { - MarkGCCard(rl_src.reg, rl_array.reg); + MarkGCCard(opt_flags, rl_src.reg, rl_array.reg); } } diff --git a/compiler/dex/quick/mir_to_lir.cc b/compiler/dex/quick/mir_to_lir.cc index 70ef991dee..0d30927679 100644 --- a/compiler/dex/quick/mir_to_lir.cc +++ b/compiler/dex/quick/mir_to_lir.cc @@ -332,7 +332,7 @@ bool Mir2Lir::GenSpecialIPut(MIR* mir, const InlineMethod& special) { kNotVolatile); } if (IsRef(size)) { - MarkGCCard(reg_src, reg_obj); + MarkGCCard(0, reg_src, reg_obj); } return true; } diff --git a/compiler/dex/quick/mir_to_lir.h b/compiler/dex/quick/mir_to_lir.h index 886b238ee3..49b8452cb6 100644 --- a/compiler/dex/quick/mir_to_lir.h +++ b/compiler/dex/quick/mir_to_lir.h @@ -1075,8 +1075,9 @@ class Mir2Lir : public Backend { * @brief Mark a garbage collection card. Skip if the stored value is null. * @param val_reg the register holding the stored value to check against null. * @param tgt_addr_reg the address of the object or array where the value was stored. + * @param opt_flags the optimization flags which may indicate that the value is non-null. */ - void MarkGCCard(RegStorage val_reg, RegStorage tgt_addr_reg); + void MarkGCCard(int opt_flags, RegStorage val_reg, RegStorage tgt_addr_reg); /* * @brief Load the address of the dex method into the register. diff --git a/compiler/dex/quick/x86/int_x86.cc b/compiler/dex/quick/x86/int_x86.cc index 3f501b4cd3..74ae8a6a5d 100755 --- a/compiler/dex/quick/x86/int_x86.cc +++ b/compiler/dex/quick/x86/int_x86.cc @@ -1170,7 +1170,7 @@ bool X86Mir2Lir::GenInlinedCas(CallInfo* info, bool is_long, bool is_object) { if (is_object && !mir_graph_->IsConstantNullRef(rl_new_value)) { // Mark card for object assuming new value is stored. FreeTemp(rs_r0); // Temporarily release EAX for MarkGCCard(). - MarkGCCard(rl_new_value.reg, rl_object.reg); + MarkGCCard(0, rl_new_value.reg, rl_object.reg); LockTemp(rs_r0); } @@ -2398,7 +2398,7 @@ void X86Mir2Lir::GenArrayPut(int opt_flags, OpSize size, RegLocation rl_array, if (!constant_index) { FreeTemp(rl_index.reg); } - MarkGCCard(rl_src.reg, rl_array.reg); + MarkGCCard(opt_flags, rl_src.reg, rl_array.reg); } } |