From 743b98cd3d7db1cfd6b3d7f7795e8abd9d07a42d Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Mon, 24 Nov 2014 19:45:41 +0000 Subject: Skip null check in MarkGCCard() for known non-null values. Use GVN's knowledge of non-null values to set a new MIR flag for IPUT/SPUT/APUT to skip the value null check. Change-Id: I97a8d1447acb530c9bbbf7b362add366d1486ee1 --- compiler/dex/quick/codegen_util.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'compiler/dex/quick/codegen_util.cc') 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 */ -- cgit v1.2.3-59-g8ed1b