ART: Handle Extended MIRs in a uniform manner
The special handling is needed since some extended MIRs can hold values in
args array, and we might want to handle the dataflow for those in a
specialized manner. Current dataflow attributes may not be able to describe
it for the extended MIRs.
Change-Id: I8b64f3142a4304282bb31f1d4686eba72284d97d
Signed-off-by: Jean Christophe Beyler <jean.christophe.beyler@intel.com>
Signed-off-by: Udayan Banerji <udayan.banerji@intel.com>
diff --git a/compiler/dex/mir_dataflow.cc b/compiler/dex/mir_dataflow.cc
index bc99a27..b5fdcf0 100644
--- a/compiler/dex/mir_dataflow.cc
+++ b/compiler/dex/mir_dataflow.cc
@@ -909,6 +909,16 @@
def_v->SetBit(dalvik_reg_id);
}
+void MIRGraph::HandleExtended(ArenaBitVector* use_v, ArenaBitVector* def_v,
+ ArenaBitVector* live_in_v,
+ const MIR::DecodedInstruction& d_insn) {
+ switch (static_cast<int>(d_insn.opcode)) {
+ default:
+ LOG(ERROR) << "Unexpected Extended Opcode " << d_insn.opcode;
+ break;
+ }
+}
+
/*
* Find out live-in variables for natural loops. Variables that are live-in in
* the main loop body are considered to be defined in the entry block.
@@ -966,6 +976,9 @@
HandleDef(def_v, d_insn->vA+1);
}
}
+ if (df_attributes & DF_FORMAT_EXTENDED) {
+ HandleExtended(use_v, def_v, live_in_v, mir->dalvikInsn);
+ }
}
return true;
}
@@ -1048,6 +1061,14 @@
}
}
+void MIRGraph::DataFlowSSAFormatExtended(MIR* mir) {
+ switch (static_cast<int>(mir->dalvikInsn.opcode)) {
+ default:
+ LOG(ERROR) << "Missing case for extended MIR: " << mir->dalvikInsn.opcode;
+ break;
+ }
+}
+
/* Entry function to convert a block into SSA representation */
bool MIRGraph::DoSSAConversion(BasicBlock* bb) {
MIR* mir;
@@ -1083,6 +1104,11 @@
continue;
}
+ if (df_attributes & DF_FORMAT_EXTENDED) {
+ DataFlowSSAFormatExtended(mir);
+ continue;
+ }
+
if (df_attributes & DF_HAS_USES) {
if (df_attributes & DF_UA) {
num_uses++;