--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -5766,132 +5766,138 @@ IonBuilder::compareTrySharedStub(bool* e
current->add(unbox);
current->push(unbox);
trackOptimizationSuccess();
*emitted = true;
return Ok();
}
-static bool
-IsCallOpcode(JSOp op)
-{
- // TODO: Support tracking optimizations for inlining a call and regular
- // optimization tracking at the same time.
- return op == JSOP_CALL || op == JSOP_CALL_IGNORES_RV || op == JSOP_CALLITER || op == JSOP_NEW ||
- op == JSOP_SUPERCALL || op == JSOP_EVAL || op == JSOP_STRICTEVAL;
-}
-
AbortReasonOr<Ok>
IonBuilder::newArrayTryTemplateObject(bool* emitted, JSObject* templateObject, uint32_t length)
{
MOZ_ASSERT(*emitted == false);
- if (!IsCallOpcode(JSOp(*pc)))
+ // TODO: Support tracking optimizations for inlining a call and regular
+ // optimization tracking at the same time. Currently just drop optimization
+ // tracking when that happens.
+ bool canTrackOptimization = !IsCallPC(pc);
+
+ if (canTrackOptimization)
trackOptimizationAttempt(TrackedStrategy::NewArray_TemplateObject);
if (!templateObject) {
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationOutcome(TrackedOutcome::NoTemplateObject);
return Ok();
}
if (templateObject->is<UnboxedArrayObject>()) {
MOZ_ASSERT(templateObject->as<UnboxedArrayObject>().capacity() >= length);
if (!templateObject->as<UnboxedArrayObject>().hasInlineElements()) {
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationOutcome(TrackedOutcome::TemplateObjectIsUnboxedWithoutInlineElements);
return Ok();
}
}
MOZ_ASSERT(length <= NativeObject::MAX_DENSE_ELEMENTS_COUNT);
size_t arraySlots =
gc::GetGCKindSlots(templateObject->asTenured().getAllocKind()) - ObjectElements::VALUES_PER_HEADER;
if (length > arraySlots) {
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationOutcome(TrackedOutcome::LengthTooBig);
return Ok();
}
// Emit fastpath.
gc::InitialHeap heap = templateObject->group()->initialHeap(constraints());
MConstant* templateConst = MConstant::NewConstraintlessObject(alloc(), templateObject);
current->add(templateConst);
MNewArray* ins = MNewArray::New(alloc(), constraints(), length, templateConst, heap, pc);
current->add(ins);
current->push(ins);
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationSuccess();
*emitted = true;
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::newArrayTrySharedStub(bool* emitted)
{
MOZ_ASSERT(*emitted == false);
+ // TODO: Support tracking optimizations for inlining a call and regular
+ // optimization tracking at the same time. Currently just drop optimization
+ // tracking when that happens.
+ bool canTrackOptimization = !IsCallPC(pc);
+
// Try to emit a shared stub cache.
if (JitOptions.disableSharedStubs)
return Ok();
if (*pc != JSOP_NEWINIT && *pc != JSOP_NEWARRAY)
return Ok();
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationAttempt(TrackedStrategy::NewArray_SharedCache);
MInstruction* stub = MNullarySharedStub::New(alloc());
current->add(stub);
current->push(stub);
MOZ_TRY(resumeAfter(stub));
MUnbox* unbox = MUnbox::New(alloc(), current->pop(), MIRType::Object, MUnbox::Infallible);
current->add(unbox);
current->push(unbox);
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationSuccess();
*emitted = true;
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::newArrayTryVM(bool* emitted, JSObject* templateObject, uint32_t length)
{
MOZ_ASSERT(*emitted == false);
+ // TODO: Support tracking optimizations for inlining a call and regular
+ // optimization tracking at the same time. Currently just drop optimization
+ // tracking when that happens.
+ bool canTrackOptimization = !IsCallPC(pc);
+
// Emit a VM call.
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationAttempt(TrackedStrategy::NewArray_Call);
gc::InitialHeap heap = gc::DefaultHeap;
MConstant* templateConst = MConstant::New(alloc(), NullValue());
if (templateObject) {
heap = templateObject->group()->initialHeap(constraints());
templateConst = MConstant::NewConstraintlessObject(alloc(), templateObject);
}
current->add(templateConst);
MNewArray* ins = MNewArray::NewVM(alloc(), constraints(), length, templateConst, heap, pc);
current->add(ins);
current->push(ins);
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationSuccess();
*emitted = true;
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::jsop_newarray(uint32_t length)
{
@@ -5906,18 +5912,23 @@ IonBuilder::jsop_newarray(uint32_t lengt
}
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::jsop_newarray(JSObject* templateObject, uint32_t length)
{
+ // TODO: Support tracking optimizations for inlining a call and regular
+ // optimization tracking at the same time. Currently just drop optimization
+ // tracking when that happens.
+ bool canTrackOptimization = !IsCallPC(pc);
+
bool emitted = false;
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
startTrackingOptimizations();
if (!forceInlineCaches()) {
MOZ_TRY(newArrayTryTemplateObject(&emitted, templateObject, length));
if (emitted)
return Ok();
}
@@ -5954,26 +5965,31 @@ IonBuilder::jsop_newarray_copyonwrite()
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::newObjectTryTemplateObject(bool* emitted, JSObject* templateObject)
{
MOZ_ASSERT(*emitted == false);
- if (!IsCallOpcode(JSOp(*pc)))
+ // TODO: Support tracking optimizations for inlining a call and regular
+ // optimization tracking at the same time. Currently just drop optimization
+ // tracking when that happens.
+ bool canTrackOptimization = !IsCallPC(pc);
+
+ if (canTrackOptimization)
trackOptimizationAttempt(TrackedStrategy::NewObject_TemplateObject);
if (!templateObject) {
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationOutcome(TrackedOutcome::NoTemplateObject);
return Ok();
}
if (templateObject->is<PlainObject>() && templateObject->as<PlainObject>().hasDynamicSlots()) {
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationOutcome(TrackedOutcome::TemplateObjectIsPlainObjectWithDynamicSlots);
return Ok();
}
// Emit fastpath.
MNewObject::Mode mode;
if (JSOp(*pc) == JSOP_NEWOBJECT || JSOp(*pc) == JSOP_NEWINIT)
@@ -5986,59 +6002,63 @@ IonBuilder::newObjectTryTemplateObject(b
current->add(templateConst);
MNewObject* ins = MNewObject::New(alloc(), constraints(), templateConst, heap, mode);
current->add(ins);
current->push(ins);
MOZ_TRY(resumeAfter(ins));
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationSuccess();
*emitted = true;
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::newObjectTrySharedStub(bool* emitted)
{
MOZ_ASSERT(*emitted == false);
+ // TODO: Support tracking optimizations for inlining a call and regular
+ // optimization tracking at the same time. Currently just drop optimization
+ // tracking when that happens.
+ bool canTrackOptimization = !IsCallPC(pc);
+
// Try to emit a shared stub cache.
if (JitOptions.disableSharedStubs)
return Ok();
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationAttempt(TrackedStrategy::NewObject_SharedCache);
MInstruction* stub = MNullarySharedStub::New(alloc());
current->add(stub);
current->push(stub);
MOZ_TRY(resumeAfter(stub));
MUnbox* unbox = MUnbox::New(alloc(), current->pop(), MIRType::Object, MUnbox::Infallible);
current->add(unbox);
current->push(unbox);
- if (!IsCallOpcode(JSOp(*pc)))
+ if (canTrackOptimization)
trackOptimizationSuccess();
*emitted = true;
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::newObjectTryVM(bool* emitted, JSObject* templateObject)
{
// Emit a VM call.
MOZ_ASSERT(JSOp(*pc) == JSOP_NEWOBJECT || JSOp(*pc) == JSOP_NEWINIT);
- if (!IsCallOpcode(JSOp(*pc)))
- trackOptimizationAttempt(TrackedStrategy::NewObject_Call);
+ trackOptimizationAttempt(TrackedStrategy::NewObject_Call);
gc::InitialHeap heap = gc::DefaultHeap;
MConstant* templateConst = MConstant::New(alloc(), NullValue());
if (templateObject) {
heap = templateObject->group()->initialHeap(constraints());
templateConst = MConstant::NewConstraintlessObject(alloc(), templateObject);
}
@@ -6047,18 +6067,17 @@ IonBuilder::newObjectTryVM(bool* emitted
MNewObject* ins = MNewObject::NewVM(alloc(), constraints(), templateConst, heap,
MNewObject::ObjectLiteral);
current->add(ins);
current->push(ins);
MOZ_TRY(resumeAfter(ins));
- if (!IsCallOpcode(JSOp(*pc)))
- trackOptimizationSuccess();
+ trackOptimizationSuccess();
*emitted = true;
return Ok();
}
AbortReasonOr<Ok>
IonBuilder::jsop_newobject()
{
bool emitted = false;