Index: working_vm/vm/jitrino/src/optimizer/dabce.cpp =================================================================== --- working_vm/vm/jitrino/src/optimizer/dabce.cpp (版本 682263) +++ working_vm/vm/jitrino/src/optimizer/dabce.cpp (工作副本) @@ -753,6 +753,23 @@ } } +Inst *DynamicABCE::getLdBaseInst(Inst* checkInst) { + + if (checkInst->getOpcode() == Op_LdArrayBaseAddr) { + return checkInst; + } else if (checkInst->getOpcode() == Op_LdVar) { + return getLdBaseInst(checkInst->getSrc(0)->asSsaOpnd()->getInst()); + } else if (checkInst->getOpcode() == Op_StVar) { + return getLdBaseInst(checkInst->getSrc(0)->asSsaOpnd()->getInst()); + } else if (checkInst->getOpcode() == Op_Phi) { + return getLdBaseInst(checkInst->getSrc(0)->asSsaOpnd()->getInst()); + } + + assert(0); + + return NULL; +} + void DynamicABCE::fillTemplate(ArrayAccessTemplate* arrayAccess, Inst* checkInst) { Inst* ldBaseInst = NULL; @@ -779,8 +796,10 @@ } else if (opcode == Op_AddScaledIndex && arrayAccess->index == inst->getSrc(1) && arrayAccess->array == NULL) { assert(ldBaseInst == NULL); - ldBaseInst = inst->getSrc(0)->asSsaOpnd()->getInst(); - assert(ldBaseInst->getOpcode() == Op_LdArrayBaseAddr); + // ldBaseInst = inst->getSrc(0)->asSsaOpnd()->getInst(); + ldBaseInst = getLdBaseInst(inst->getSrc(0)->asSsaOpnd()->getInst()); + +// assert(ldBaseInst->getOpcode() == Op_LdArrayBaseAddr); arrayAccess->array = ldBaseInst->getSrc(0)->asSsaOpnd(); break; }