diff options
author | Vladimir Marko <vmarko@google.com> | 2014-11-24 19:45:41 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2014-11-24 19:49:22 +0000 |
commit | 743b98cd3d7db1cfd6b3d7f7795e8abd9d07a42d (patch) | |
tree | f84a555c7c4597f9569de48ac205e7c31f05ccd6 /compiler/dex/quick/codegen_util.cc | |
parent | a5de1924ddf0e6e89d98484a3b93b63b126bac76 (diff) | |
download | art-743b98cd3d7db1cfd6b3d7f7795e8abd9d07a42d.tar.gz art-743b98cd3d7db1cfd6b3d7f7795e8abd9d07a42d.tar.bz2 art-743b98cd3d7db1cfd6b3d7f7795e8abd9d07a42d.zip |
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
Diffstat (limited to 'compiler/dex/quick/codegen_util.cc')
-rw-r--r-- | compiler/dex/quick/codegen_util.cc | 14 |
1 files changed, 9 insertions, 5 deletions
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 */ |