mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1111252 - IonMonkey: Use Vector's API more cleverly to eliminate intermediate allocations r=waldo
This commit is contained in:
parent
a26a6e7fdb
commit
b72eb40328
@ -2265,16 +2265,17 @@ jit::SetEnterJitData(JSContext *cx, EnterJitData &data, RunState &state, AutoVal
|
||||
if (data.numActualArgs >= numFormals) {
|
||||
data.maxArgv = args.base() + 1;
|
||||
} else {
|
||||
// Pad missing arguments with |undefined|.
|
||||
for (size_t i = 1; i < args.length() + 2; i++) {
|
||||
if (!vals.append(args.base()[i]))
|
||||
return false;
|
||||
}
|
||||
MOZ_ASSERT(vals.empty());
|
||||
if (!vals.reserve(Max(args.length() + 1, numFormals + 1)))
|
||||
return false;
|
||||
|
||||
while (vals.length() < numFormals + 1) {
|
||||
if (!vals.append(UndefinedValue()))
|
||||
return false;
|
||||
}
|
||||
// Append |this| and any provided arguments.
|
||||
for (size_t i = 1; i < args.length() + 2; ++i)
|
||||
vals.infallibleAppend(args.base()[i]);
|
||||
|
||||
// Pad missing arguments with |undefined|.
|
||||
while (vals.length() < numFormals + 1)
|
||||
vals.infallibleAppend(UndefinedValue());
|
||||
|
||||
MOZ_ASSERT(vals.length() >= numFormals + 1);
|
||||
data.maxArgv = vals.begin();
|
||||
|
@ -315,8 +315,7 @@ IonBuilder::getPolyCallTargets(types::TemporaryTypeSet *calleeTypes, bool constr
|
||||
return true;
|
||||
}
|
||||
|
||||
DebugOnly<bool> appendOk = targets.append(obj);
|
||||
MOZ_ASSERT(appendOk);
|
||||
targets.infallibleAppend(obj);
|
||||
}
|
||||
|
||||
// For now, only inline "singleton" lambda calls
|
||||
@ -4655,7 +4654,7 @@ IonBuilder::makeInliningDecision(JSObject *targetArg, CallInfo &callInfo)
|
||||
}
|
||||
|
||||
bool
|
||||
IonBuilder::selectInliningTargets(ObjectVector &targets, CallInfo &callInfo, BoolVector &choiceSet,
|
||||
IonBuilder::selectInliningTargets(const ObjectVector &targets, CallInfo &callInfo, BoolVector &choiceSet,
|
||||
uint32_t *numInlineable)
|
||||
{
|
||||
*numInlineable = 0;
|
||||
@ -4840,7 +4839,7 @@ IonBuilder::inlineSingleCall(CallInfo &callInfo, JSObject *targetArg)
|
||||
}
|
||||
|
||||
IonBuilder::InliningStatus
|
||||
IonBuilder::inlineCallsite(ObjectVector &targets, ObjectVector &originals,
|
||||
IonBuilder::inlineCallsite(const ObjectVector &targets, ObjectVector &originals,
|
||||
bool lambda, CallInfo &callInfo)
|
||||
{
|
||||
if (targets.empty())
|
||||
@ -5024,7 +5023,7 @@ IonBuilder::inlineTypeObjectFallback(CallInfo &callInfo, MBasicBlock *dispatchBl
|
||||
}
|
||||
|
||||
bool
|
||||
IonBuilder::inlineCalls(CallInfo &callInfo, ObjectVector &targets,
|
||||
IonBuilder::inlineCalls(CallInfo &callInfo, const ObjectVector &targets,
|
||||
ObjectVector &originals, BoolVector &choiceSet,
|
||||
MGetPropertyCache *maybeCache)
|
||||
{
|
||||
@ -5595,12 +5594,10 @@ IonBuilder::jsop_funapplyarguments(uint32_t argc)
|
||||
vp->setImplicitlyUsedUnchecked();
|
||||
|
||||
// Arguments
|
||||
MDefinitionVector args(alloc());
|
||||
if (inliningDepth_) {
|
||||
if (!args.appendAll(inlineCallInfo_->argv()))
|
||||
if (!callInfo.setArgs(inlineCallInfo_->argv()))
|
||||
return false;
|
||||
}
|
||||
callInfo.setArgs(&args);
|
||||
|
||||
// This
|
||||
MDefinition *argThis = current->pop();
|
||||
@ -5663,6 +5660,8 @@ IonBuilder::jsop_call(uint32_t argc, bool constructing)
|
||||
// Keep track of the originals as we need to case on them for poly inline.
|
||||
bool hasClones = false;
|
||||
ObjectVector targets(alloc());
|
||||
if (!targets.reserve(originals.length()))
|
||||
return false;
|
||||
for (uint32_t i = 0; i < originals.length(); i++) {
|
||||
JSObject *obj = originals[i];
|
||||
if (obj->is<JSFunction>()) {
|
||||
@ -5676,8 +5675,7 @@ IonBuilder::jsop_call(uint32_t argc, bool constructing)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!targets.append(obj))
|
||||
return false;
|
||||
targets.infallibleAppend(obj);
|
||||
}
|
||||
|
||||
CallInfo callInfo(alloc(), constructing);
|
||||
|
@ -708,7 +708,7 @@ class IonBuilder
|
||||
// Oracles.
|
||||
InliningDecision canInlineTarget(JSFunction *target, CallInfo &callInfo);
|
||||
InliningDecision makeInliningDecision(JSObject *target, CallInfo &callInfo);
|
||||
bool selectInliningTargets(ObjectVector &targets, CallInfo &callInfo,
|
||||
bool selectInliningTargets(const ObjectVector &targets, CallInfo &callInfo,
|
||||
BoolVector &choiceSet, uint32_t *numInlineable);
|
||||
|
||||
// Native inlining helpers.
|
||||
@ -816,9 +816,9 @@ class IonBuilder
|
||||
InliningStatus inlineSingleCall(CallInfo &callInfo, JSObject *target);
|
||||
|
||||
// Call functions
|
||||
InliningStatus inlineCallsite(ObjectVector &targets, ObjectVector &originals,
|
||||
InliningStatus inlineCallsite(const ObjectVector &targets, ObjectVector &originals,
|
||||
bool lambda, CallInfo &callInfo);
|
||||
bool inlineCalls(CallInfo &callInfo, ObjectVector &targets, ObjectVector &originals,
|
||||
bool inlineCalls(CallInfo &callInfo, const ObjectVector &targets, ObjectVector &originals,
|
||||
BoolVector &choiceSet, MGetPropertyCache *maybeCache);
|
||||
|
||||
// Inlining helpers.
|
||||
@ -1112,9 +1112,9 @@ class CallInfo
|
||||
return argc() + 2;
|
||||
}
|
||||
|
||||
void setArgs(MDefinitionVector *args) {
|
||||
bool setArgs(const MDefinitionVector &args) {
|
||||
MOZ_ASSERT(args_.empty());
|
||||
args_.appendAll(*args);
|
||||
return args_.appendAll(args);
|
||||
}
|
||||
|
||||
MDefinitionVector &argv() {
|
||||
|
@ -2729,10 +2729,10 @@ CloneForDeadBranches(TempAllocator &alloc, MInstruction *candidate)
|
||||
|
||||
MDefinitionVector operands(alloc);
|
||||
size_t end = candidate->numOperands();
|
||||
for (size_t i = 0; i < end; i++) {
|
||||
if (!operands.append(candidate->getOperand(i)))
|
||||
return false;
|
||||
}
|
||||
if (!operands.reserve(end))
|
||||
return false;
|
||||
for (size_t i = 0; i < end; ++i)
|
||||
operands.infallibleAppend(candidate->getOperand(i));
|
||||
|
||||
MInstruction *clone = candidate->clone(alloc, operands);
|
||||
clone->setRange(nullptr);
|
||||
|
Loading…
Reference in New Issue
Block a user