summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/dex/compiler_enums.h3
-rw-r--r--compiler/dex/mir_graph.h1
-rw-r--r--compiler/dex/mir_optimization.cc27
3 files changed, 26 insertions, 5 deletions
diff --git a/compiler/dex/compiler_enums.h b/compiler/dex/compiler_enums.h
index e4003bf088..78da420339 100644
--- a/compiler/dex/compiler_enums.h
+++ b/compiler/dex/compiler_enums.h
@@ -311,7 +311,8 @@ enum MIROptimizationFlagPositions {
kMIRCallee, // Instruction is inlined from callee.
kMIRIgnoreSuspendCheck,
kMIRDup,
- kMIRMark, // Temporary node mark.
+ kMIRMark, // Temporary node mark can be used by
+ // opt passes for their private needs.
kMIRStoreNonTemporal,
kMIRLastMIRFlag,
};
diff --git a/compiler/dex/mir_graph.h b/compiler/dex/mir_graph.h
index cc215bde06..90cddedc7a 100644
--- a/compiler/dex/mir_graph.h
+++ b/compiler/dex/mir_graph.h
@@ -160,6 +160,7 @@ enum OatMethodAttributes {
#define MIR_CALLEE (1 << kMIRCallee)
#define MIR_IGNORE_SUSPEND_CHECK (1 << kMIRIgnoreSuspendCheck)
#define MIR_DUP (1 << kMIRDup)
+#define MIR_MARK (1 << kMIRMark)
#define MIR_STORE_NON_TEMPORAL (1 << kMIRStoreNonTemporal)
#define BLOCK_NAME_LEN 80
diff --git a/compiler/dex/mir_optimization.cc b/compiler/dex/mir_optimization.cc
index 84c056daf3..01f55b9249 100644
--- a/compiler/dex/mir_optimization.cc
+++ b/compiler/dex/mir_optimization.cc
@@ -833,6 +833,15 @@ bool MIRGraph::EliminateNullChecksGate() {
temp_bit_matrix_ = static_cast<ArenaBitVector**>(
temp_scoped_alloc_->Alloc(sizeof(ArenaBitVector*) * GetNumBlocks(), kArenaAllocMisc));
std::fill_n(temp_bit_matrix_, GetNumBlocks(), nullptr);
+
+ // reset MIR_MARK
+ AllNodesIterator iter(this);
+ for (BasicBlock* bb = iter.Next(); bb != nullptr; bb = iter.Next()) {
+ for (MIR* mir = bb->first_mir_insn; mir != NULL; mir = mir->next) {
+ mir->optimization_flags &= ~MIR_MARK;
+ }
+ }
+
return true;
}
@@ -926,12 +935,10 @@ bool MIRGraph::EliminateNullChecks(BasicBlock* bb) {
int src_sreg = mir->ssa_rep->uses[src_idx];
if (!ssa_regs_to_check->IsBitSet(src_sreg)) {
// Eliminate the null check.
- mir->optimization_flags |= MIR_IGNORE_NULL_CHECK;
+ mir->optimization_flags |= MIR_MARK;
} else {
// Do the null check.
- // TODO: Rewrite the pass to converge first before doing any modifications so that
- // we don't lose the MIR_IGNORE_NULL_CHECK here if previously set by some other pass.
- mir->optimization_flags &= ~MIR_IGNORE_NULL_CHECK;
+ mir->optimization_flags &= ~MIR_MARK;
// Mark s_reg as null-checked
ssa_regs_to_check->ClearBit(src_sreg);
}
@@ -1036,6 +1043,18 @@ void MIRGraph::EliminateNullChecksEnd() {
temp_bit_matrix_ = nullptr;
DCHECK(temp_scoped_alloc_.get() != nullptr);
temp_scoped_alloc_.reset();
+
+ // converge MIR_MARK with MIR_IGNORE_NULL_CHECK
+ const int MARK_TO_IGNORE_NULL_CHECK_SHIFT = kMIRMark - kMIRIgnoreNullCheck;
+ DCHECK(MARK_TO_IGNORE_NULL_CHECK_SHIFT > 0);
+ AllNodesIterator iter(this);
+ for (BasicBlock* bb = iter.Next(); bb != nullptr; bb = iter.Next()) {
+ for (MIR* mir = bb->first_mir_insn; mir != NULL; mir = mir->next) {
+ uint16_t mirMarkAdjustedToIgnoreNullCheck =
+ (mir->optimization_flags & MIR_MARK) >> MARK_TO_IGNORE_NULL_CHECK_SHIFT;
+ mir->optimization_flags |= mirMarkAdjustedToIgnoreNullCheck;
+ }
+ }
}
/*