summaryrefslogtreecommitdiff
path: root/compiler/dex/mir_dataflow.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/dex/mir_dataflow.cc')
-rw-r--r--compiler/dex/mir_dataflow.cc124
1 files changed, 99 insertions, 25 deletions
diff --git a/compiler/dex/mir_dataflow.cc b/compiler/dex/mir_dataflow.cc
index 4c906b01d7..d9531fb293 100644
--- a/compiler/dex/mir_dataflow.cc
+++ b/compiler/dex/mir_dataflow.cc
@@ -829,68 +829,74 @@ const uint64_t MIRGraph::oat_data_flow_attributes_[kMirOpLast] = {
// 109 MIR_RANGE_CHECK
0,
- // 110 MIR_DIV_ZERO_CHECK
+ // 10A MIR_DIV_ZERO_CHECK
0,
- // 111 MIR_CHECK
+ // 10B MIR_CHECK
0,
- // 112 MIR_CHECKPART2
+ // 10C MIR_CHECKPART2
0,
- // 113 MIR_SELECT
+ // 10D MIR_SELECT
DF_DA | DF_UB,
- // 114 MirOpConstVector
- DF_DA,
+ // 10E MirOpConstVector
+ 0,
- // 115 MirOpMoveVector
+ // 10F MirOpMoveVector
0,
- // 116 MirOpPackedMultiply
+ // 110 MirOpPackedMultiply
0,
- // 117 MirOpPackedAddition
+ // 111 MirOpPackedAddition
0,
- // 118 MirOpPackedSubtract
+ // 112 MirOpPackedSubtract
0,
- // 119 MirOpPackedShiftLeft
+ // 113 MirOpPackedShiftLeft
0,
- // 120 MirOpPackedSignedShiftRight
+ // 114 MirOpPackedSignedShiftRight
0,
- // 121 MirOpPackedUnsignedShiftRight
+ // 115 MirOpPackedUnsignedShiftRight
0,
- // 122 MirOpPackedAnd
+ // 116 MirOpPackedAnd
0,
- // 123 MirOpPackedOr
+ // 117 MirOpPackedOr
0,
- // 124 MirOpPackedXor
+ // 118 MirOpPackedXor
0,
- // 125 MirOpPackedAddReduce
- DF_DA | DF_UA,
+ // 119 MirOpPackedAddReduce
+ DF_FORMAT_EXTENDED,
- // 126 MirOpPackedReduce
- DF_DA,
+ // 11A MirOpPackedReduce
+ DF_FORMAT_EXTENDED,
- // 127 MirOpPackedSet
- DF_UB,
+ // 11B MirOpPackedSet
+ DF_FORMAT_EXTENDED,
- // 128 MirOpReserveVectorRegisters
+ // 11C MirOpReserveVectorRegisters
0,
- // 129 MirOpReturnVectorRegisters
+ // 11D MirOpReturnVectorRegisters
0,
- // 130 MirOpMemBarrier
+ // 11E MirOpMemBarrier
0,
+
+ // 11F MirOpPackedArrayGet
+ DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_REF_B | DF_CORE_C | DF_LVN,
+
+ // 120 MirOpPackedArrayPut
+ DF_UB | DF_UC | DF_NULL_CHK_0 | DF_RANGE_CHK_1 | DF_REF_B | DF_CORE_C | DF_LVN,
};
/* Return the base virtual register for a SSA name */
@@ -915,7 +921,36 @@ void MIRGraph::HandleDef(ArenaBitVector* def_v, int dalvik_reg_id) {
void MIRGraph::HandleExtended(ArenaBitVector* use_v, ArenaBitVector* def_v,
ArenaBitVector* live_in_v,
const MIR::DecodedInstruction& d_insn) {
+ // For vector MIRs, vC contains type information
+ bool is_vector_type_wide = false;
+ int type_size = d_insn.vC >> 16;
+ if (type_size == k64 || type_size == kDouble) {
+ is_vector_type_wide = true;
+ }
+
switch (static_cast<int>(d_insn.opcode)) {
+ case kMirOpPackedAddReduce:
+ HandleLiveInUse(use_v, def_v, live_in_v, d_insn.vA);
+ if (is_vector_type_wide == true) {
+ HandleLiveInUse(use_v, def_v, live_in_v, d_insn.vA + 1);
+ }
+ HandleDef(def_v, d_insn.vA);
+ if (is_vector_type_wide == true) {
+ HandleDef(def_v, d_insn.vA + 1);
+ }
+ break;
+ case kMirOpPackedReduce:
+ HandleDef(def_v, d_insn.vA);
+ if (is_vector_type_wide == true) {
+ HandleDef(def_v, d_insn.vA + 1);
+ }
+ break;
+ case kMirOpPackedSet:
+ HandleLiveInUse(use_v, def_v, live_in_v, d_insn.vB);
+ if (is_vector_type_wide == true) {
+ HandleLiveInUse(use_v, def_v, live_in_v, d_insn.vB + 1);
+ }
+ break;
default:
LOG(ERROR) << "Unexpected Extended Opcode " << d_insn.opcode;
break;
@@ -1064,7 +1099,46 @@ void MIRGraph::DataFlowSSAFormat3RC(MIR* mir) {
}
void MIRGraph::DataFlowSSAFormatExtended(MIR* mir) {
+ const MIR::DecodedInstruction& d_insn = mir->dalvikInsn;
+ // For vector MIRs, vC contains type information
+ bool is_vector_type_wide = false;
+ int type_size = d_insn.vC >> 16;
+ if (type_size == k64 || type_size == kDouble) {
+ is_vector_type_wide = true;
+ }
+
switch (static_cast<int>(mir->dalvikInsn.opcode)) {
+ case kMirOpPackedAddReduce:
+ // We have one use, plus one more for wide
+ AllocateSSAUseData(mir, is_vector_type_wide ? 2 : 1);
+ HandleSSAUse(mir->ssa_rep->uses, d_insn.vA, 0);
+ if (is_vector_type_wide == true) {
+ HandleSSAUse(mir->ssa_rep->uses, d_insn.vA + 1, 1);
+ }
+
+ // We have a def, plus one more for wide
+ AllocateSSADefData(mir, is_vector_type_wide ? 2 : 1);
+ HandleSSADef(mir->ssa_rep->defs, d_insn.vA, 0);
+ if (is_vector_type_wide == true) {
+ HandleSSADef(mir->ssa_rep->defs, d_insn.vA + 1, 1);
+ }
+ break;
+ case kMirOpPackedReduce:
+ // We have a def, plus one more for wide
+ AllocateSSADefData(mir, is_vector_type_wide ? 2 : 1);
+ HandleSSADef(mir->ssa_rep->defs, d_insn.vA, 0);
+ if (is_vector_type_wide == true) {
+ HandleSSADef(mir->ssa_rep->defs, d_insn.vA + 1, 1);
+ }
+ break;
+ case kMirOpPackedSet:
+ // We have one use, plus one more for wide
+ AllocateSSAUseData(mir, is_vector_type_wide ? 2 : 1);
+ HandleSSAUse(mir->ssa_rep->uses, d_insn.vB, 0);
+ if (is_vector_type_wide == true) {
+ HandleSSAUse(mir->ssa_rep->uses, d_insn.vB + 1, 1);
+ }
+ break;
default:
LOG(ERROR) << "Missing case for extended MIR: " << mir->dalvikInsn.opcode;
break;