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:
Jan de Mooij 2019-07-26 10:11:41 +00:00
Родитель a76503da23
Коммит 6bd4215c14
2 изменённых файлов: 23 добавлений и 15 удалений

Просмотреть файл

@ -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)) {