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
diff --git a/compiler/dex/local_value_numbering.cc b/compiler/dex/local_value_numbering.cc
index e0c4e27..114346d 100644
--- a/compiler/dex/local_value_numbering.cc
+++ b/compiler/dex/local_value_numbering.cc
@@ -1110,6 +1110,12 @@
// If we're storing a non-aliasing reference, stop tracking it as non-aliasing now.
uint16_t base = GetOperandValue(mir->ssa_rep->uses[0]);
HandleEscapingRef(base);
+ if (gvn_->CanModify() && null_checked_.count(base) != 0u) {
+ if (gvn_->GetCompilationUnit()->verbose) {
+ LOG(INFO) << "Removing GC card mark value null check for 0x" << std::hex << mir->offset;
+ }
+ mir->optimization_flags |= MIR_STORE_NON_NULL_VALUE;
+ }
}
void LocalValueNumbering::HandleEscapingRef(uint16_t base) {