author | André Bargull <andre.bargull@gmail.com> |
Fri, 28 Jul 2017 13:01:01 -0700 | |
changeset 371907 | e1ec4e403b9d6326fe38f51be3422790df8deb22 |
parent 371906 | 820435b8583623782455b7f18e84b1a1b568e2ab |
child 371908 | 19f92c04608cec275dab73e8acad5141de8a5c44 |
push id | 47611 |
push user | archaeopteryx@coole-files.de |
push date | Sun, 30 Jul 2017 09:20:48 +0000 |
treeherder | autoland@8b577b152383 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jandem |
bugs | 1383645 |
milestone | 56.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/js/src/jit/MCallOptimize.cpp +++ b/js/src/jit/MCallOptimize.cpp @@ -2760,61 +2760,67 @@ IonBuilder::InliningResult IonBuilder::inlineUnsafeSetReservedSlot(CallInfo& callInfo) { if (callInfo.argc() != 3 || callInfo.constructing()) { trackOptimizationOutcome(TrackedOutcome::CantInlineNativeBadForm); return InliningStatus_NotInlined; } if (getInlineReturnType() != MIRType::Undefined) return InliningStatus_NotInlined; - if (callInfo.getArg(0)->type() != MIRType::Object) - return InliningStatus_NotInlined; - if (callInfo.getArg(1)->type() != MIRType::Int32) + + MDefinition* obj = callInfo.getArg(0); + if (obj->type() != MIRType::Object && obj->type() != MIRType::Value) + return InliningStatus_NotInlined; + + MDefinition* arg = callInfo.getArg(1); + if (arg->type() != MIRType::Int32) return InliningStatus_NotInlined; // Don't inline if we don't have a constant slot. - MDefinition* arg = callInfo.getArg(1); if (!arg->isConstant()) return InliningStatus_NotInlined; uint32_t slot = uint32_t(arg->toConstant()->toInt32()); callInfo.setImplicitlyUsedUnchecked(); MStoreFixedSlot* store = - MStoreFixedSlot::NewBarriered(alloc(), callInfo.getArg(0), slot, callInfo.getArg(2)); + MStoreFixedSlot::NewBarriered(alloc(), obj, slot, callInfo.getArg(2)); current->add(store); current->push(store); if (NeedsPostBarrier(callInfo.getArg(2))) - current->add(MPostWriteBarrier::New(alloc(), callInfo.getArg(0), callInfo.getArg(2))); + current->add(MPostWriteBarrier::New(alloc(), obj, callInfo.getArg(2))); return InliningStatus_Inlined; } IonBuilder::InliningResult IonBuilder::inlineUnsafeGetReservedSlot(CallInfo& callInfo, MIRType knownValueType) { if (callInfo.argc() != 2 || callInfo.constructing()) { trackOptimizationOutcome(TrackedOutcome::CantInlineNativeBadForm); return InliningStatus_NotInlined; } - if (callInfo.getArg(0)->type() != MIRType::Object) - return InliningStatus_NotInlined; - if (callInfo.getArg(1)->type() != MIRType::Int32) + + MDefinition* obj = callInfo.getArg(0); + if (obj->type() != MIRType::Object && obj->type() != MIRType::Value) + return InliningStatus_NotInlined; + + MDefinition* arg = callInfo.getArg(1); + if (arg->type() != MIRType::Int32) return InliningStatus_NotInlined; // Don't inline if we don't have a constant slot. - MDefinition* arg = callInfo.getArg(1); if (!arg->isConstant()) return InliningStatus_NotInlined; uint32_t slot = uint32_t(arg->toConstant()->toInt32()); callInfo.setImplicitlyUsedUnchecked(); - MLoadFixedSlot* load = MLoadFixedSlot::New(alloc(), callInfo.getArg(0), slot); + MLoadFixedSlot* load = MLoadFixedSlot::New(alloc(), obj, slot); current->add(load); current->push(load); if (knownValueType != MIRType::Value) { // We know what type we have in this slot. Assert that this is in fact // what we've seen coming from this slot in the past, then tell the // MLoadFixedSlot about its result type. That will make us do an // infallible unbox as part of the slot load and then we'll barrier on // the unbox result. That way the type barrier code won't end up doing