зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1567388
part 4 - Move inlinedCompilations Vector to CachedIonData. r=tcampbell
This saves a little memory for JitScripts that are never Ion-compiled. Differential Revision: https://phabricator.services.mozilla.com/D39169 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
a76503da23
Коммит
6bd4215c14
|
@ -100,12 +100,6 @@ class alignas(uintptr_t) JitScript final {
|
|||
// Allocated space for fallback IC stubs.
|
||||
FallbackICStubSpace fallbackStubSpace_ = {};
|
||||
|
||||
// The freeze constraints added to stack type sets will only directly
|
||||
// invalidate the script containing those stack type sets. This Vector
|
||||
// contains compilations that inlined this script, so we can invalidate
|
||||
// them as well.
|
||||
RecompileInfoVector inlinedCompilations_;
|
||||
|
||||
// Like JSScript::jitCodeRaw_ but when the script has an IonScript this can
|
||||
// point to a separate entry point that skips the argument type checks.
|
||||
uint8_t* jitCodeSkipArgCheck_ = nullptr;
|
||||
|
@ -121,6 +115,12 @@ class alignas(uintptr_t) JitScript final {
|
|||
// analyzed by IonBuilder. This is done lazily to improve performance and
|
||||
// memory usage as most scripts are never Ion-compiled.
|
||||
struct CachedIonData {
|
||||
// The freeze constraints added to stack type sets will only directly
|
||||
// invalidate the script containing those stack type sets. This Vector
|
||||
// contains compilations that inlined this script, so we can invalidate
|
||||
// them as well.
|
||||
RecompileInfoVector inlinedCompilations_;
|
||||
|
||||
// For functions with a call object, template objects to use for the call
|
||||
// object and decl env object (linked via the call object's enclosing
|
||||
// scope).
|
||||
|
@ -247,18 +247,22 @@ class alignas(uintptr_t) JitScript final {
|
|||
void clearIonCompiledOrInlined() { flags_.ionCompiledOrInlined = false; }
|
||||
bool ionCompiledOrInlined() const { return flags_.ionCompiledOrInlined; }
|
||||
|
||||
RecompileInfoVector& inlinedCompilations(
|
||||
RecompileInfoVector* maybeInlinedCompilations(
|
||||
const js::AutoSweepJitScript& sweep) {
|
||||
MOZ_ASSERT(sweep.jitScript() == this);
|
||||
return inlinedCompilations_;
|
||||
if (!hasCachedIonData()) {
|
||||
return nullptr;
|
||||
}
|
||||
return &cachedIonData().inlinedCompilations_;
|
||||
}
|
||||
MOZ_MUST_USE bool addInlinedCompilation(const js::AutoSweepJitScript& sweep,
|
||||
RecompileInfo info) {
|
||||
MOZ_ASSERT(sweep.jitScript() == this);
|
||||
if (!inlinedCompilations_.empty() && inlinedCompilations_.back() == info) {
|
||||
auto& inlinedCompilations = cachedIonData().inlinedCompilations_;
|
||||
if (!inlinedCompilations.empty() && inlinedCompilations.back() == info) {
|
||||
return true;
|
||||
}
|
||||
return inlinedCompilations_.append(info);
|
||||
return inlinedCompilations.append(info);
|
||||
}
|
||||
|
||||
uint32_t numICEntries() const {
|
||||
|
|
|
@ -2699,10 +2699,14 @@ void TypeZone::addPendingRecompile(JSContext* cx, JSScript* script) {
|
|||
// Trigger recompilation of any callers inlining this script.
|
||||
if (JitScript* jitScript = script->jitScript()) {
|
||||
AutoSweepJitScript sweep(script);
|
||||
for (const RecompileInfo& info : jitScript->inlinedCompilations(sweep)) {
|
||||
addPendingRecompile(cx, info);
|
||||
RecompileInfoVector* inlinedCompilations =
|
||||
jitScript->maybeInlinedCompilations(sweep);
|
||||
if (inlinedCompilations) {
|
||||
for (const RecompileInfo& info : *inlinedCompilations) {
|
||||
addPendingRecompile(cx, info);
|
||||
}
|
||||
inlinedCompilations->clearAndFree();
|
||||
}
|
||||
jitScript->inlinedCompilations(sweep).clearAndFree();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4410,8 +4414,8 @@ void JitScript::sweepTypes(const js::AutoSweepJitScript& sweep, Zone* zone) {
|
|||
TypeZone& types = zone->types;
|
||||
|
||||
// Sweep the inlinedCompilations Vector.
|
||||
{
|
||||
RecompileInfoVector& inlinedCompilations = this->inlinedCompilations(sweep);
|
||||
if (maybeInlinedCompilations(sweep)) {
|
||||
RecompileInfoVector& inlinedCompilations = *maybeInlinedCompilations(sweep);
|
||||
size_t dest = 0;
|
||||
for (size_t i = 0; i < inlinedCompilations.length(); i++) {
|
||||
if (inlinedCompilations[i].shouldSweep(types)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче