SSATmp* IRInstruction::previousStkPtr() const { assert(modifiesStack()); assert(MInstrEffects::supported(this)); auto base = src(minstrBaseIdx(this)); assert(base->inst()->is(LdStackAddr)); return base->inst()->src(0); }
void MInstrEffects::get(const IRInstruction* inst, const FrameStateMgr& frame, LocalStateHook& hook) { // If the base for this instruction is a local address, the helper call might // have side effects on the local's value auto const base = inst->src(minstrBaseIdx(inst->op())); auto const locInstr = base->inst(); // Right now we require that the address of any affected local is the // immediate source of the base tmp. This isn't actually specified in the ir // spec right now but will intend to make it more general soon. if (locInstr->op() != LdLocAddr) return; auto const locId = locInstr->extra<LdLocAddr>()->locId; auto const baseType = frame.localType(locId); MInstrEffects effects(inst->op(), baseType.ptr(Ptr::Frame)); if (effects.baseTypeChanged || effects.baseValChanged) { auto const ty = effects.baseType.derefIfPtr(); if (ty.isBoxed()) { hook.setLocalType(locId, Type::BoxedInitCell); hook.setBoxedLocalPrediction(locId, ty); } else { hook.setLocalType(locId, ty); } } }