Closed
Bug 1041688
Opened 10 years ago
Closed 10 years ago
Dynamic definite properties analysis
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
FIXED
mozilla35
People
(Reporter: bhackett1024, Assigned: bhackett1024)
References
Details
Attachments
(11 files, 5 obsolete files)
158.70 KB,
patch
|
Details | Diff | Splinter Review | |
5.21 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
14.61 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
5.77 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
55.59 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
27.59 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
24.60 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
8.00 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
14.39 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
6.11 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
7.90 KB,
patch
|
jandem
:
review+
|
Details | Diff | Splinter Review |
This came out of bug 1038917 and some IRC discussion. Many of the problems with the current system pointed out in bug 1038917 are inadequacies with the static definite properties analysis. Mainly: a) The analysis runs eagerly; when a constructor is first invoked we baseline compile it and possibly other functions it calls, and do a complicated analysis of the scripts. b) The analysis does a poor job with many real world constructs. Most things other than straightline code and inlinable functions that add properties to the |this| object will break the analysis. We could help address both of these by redesigning how the definite properties analysis works, to incorporate both static and dynamic techniques. The static part could potentially be removed later. The dynamic technique should be able to mark as definite all properties which all instances of the type are given, regardless of the complexity of that initialization, whether it occurs in the constructor or whether the object escapes into the heap before initialization completes. Some gotchas listed below, though. The main additional cost vs. the current approach is that when code deals with partially initialized objects we don't have definite property information for them and the compiled code will be slower. Memory usage shouldn't change significantly. The strategy would be as follows: - When a constructor is first invoked for TypeObject T, don't run the definite properties analysis. Instead, keep track of all the JSObjects with type T in a structure attached to T. - After N objects have been created with type T (maybe N == 10 to line up with baselineUsesBeforeCompile), run the combined definite properties analysis via the below steps. -- Compute a greatest common prefix shape P of the N objects. So if one has properties {a,b,c} and another has {a,b,d} the prefix is {a,b}. -- Run the existing static definite properties analysis as is currently done, computing a static shape S. -- If S == P, the static analysis did as well as it could be expected to do, so make the properties in S/P definite and don't do anything else. -- If S is not a prefix of P (i.e. S has more properties or different properties than P) then types which were never monitored by baseline have invalidated the definite property information. This case is strange and hard to trigger but possible if we don't baseline-compile eagerly, so we should just abort the analysis in this case. For similar reasons we should abort if the constructor is reentrant and has frames on the stack when the N+1th object is created. -- If S is a prefix of P (i.e. P has more properties than S) then the static analysis missed some properties which all instances of the object have, and we should run the dynamic analysis as follows: --- Mark all properties in P as definite in T. --- Create a new type object IT for partially initialized objects of type T. Any properties in S can be marked as definite in IT, but other properties in P are *not* marked definite. --- All new objects created by the constructor must now have type IT rather than type T. --- When an object of type IT is given shape P, its type can be changed to T. Allowing type changes in this way requires that whenever IT is added to a type set, T also be added. And that's it. We keep track of which code deals with partially initialized objects using the current architecture, just by following where values of type IT show up. If IT escapes into the heap before being initialized, and is read later when it has been fully initialized, we use one of our existing type barriers at that read and are able to use the definite properties in P. This analysis can still fall over if P is picked badly, though: - If P has too few properties, then some of the N objects have not been fully initialized. The normal way this would come up is if the objects are initialized in batches, rather than one at a time. For this approach to do its best job, all properties should be added to one created object before the next one is created. In this case the properties in P will all be definite but any additional ones will need shape guards when they are accessed. - If P has too many properties, then the initialization pattern changed after the initial objects were created. Since P is never given to later objects, they retain their IT type and we aren't able to optimize accesses to any properties S doesn't have, even if the object has additional properties included in P. So, this approach isn't perfect but it should be a lot more robust than what we are doing now, and from what I understand from Kannan I don't think the games he's looked at would fall prey to the above issues. Mainly, with this analysis in place we could just recommend to people that for the best performance they just fully initialize objects one at a time with consistent properties, rather than asking them to write code that conforms to the narrow precepts of the static definite properties analysis.
Comment 1•10 years ago
|
||
This all sounds workable, and should improve the robustness of definite properties considerably. As you noted in the IRC discussion, getprop optimization specialized on incomplete types will likely need to do some kind of hole check for uninitialized properties, but we might even be able to avoid that if we pre-initialize expected future fixed slot positions to Undefined. The other concern is tracking these deferred-type objects in heap typesets. The best option for that I can see is to do the lazy-singleton tracking discussed in bug 103897.
Assignee | ||
Comment 2•10 years ago
|
||
(In reply to Kannan Vijayan [:djvj] from comment #1) > As you noted in the IRC discussion, getprop optimization specialized on > incomplete types will likely need to do some kind of hole check for > uninitialized properties, but we might even be able to avoid that if we > pre-initialize expected future fixed slot positions to Undefined. If the GETPROP is on an object whose type is known to be fully initialized, it will have the definite property and we won't need any new checks. If the object might have the partially initialized type, then from TI we won't know anything about properties it has other than those the static analysis determined, and optimized code will need to either emit a cache/shape-guard or figure out the shape to use in some other way (e.g. if we start emitting addprops in inline code then we would know the object's shape after doing a bit of analysis). But, regardless, we shouldn't need to change how GETPROPs or SETPROPs (except ADDPROPs) are optimized in order to preserve correctness. > The other concern is tracking these deferred-type objects in heap typesets. > The best option for that I can see is to do the lazy-singleton tracking > discussed in bug 103897. So far as I can tell these are different issues. We don't need to make any changes to be able to track objects with the partially initialized type as they flow around on the stack and heap; we're just picking a different type for the object when it is created and from there things will just work as normal using the existing machinery. The only real new wrinkle is being able to change an object from an initial type to a final type. To do this, we need to make sure that any type set containing the initial type also has the final type, as outlined above (this is simple to do). One additional thing I forgot is that we also need to make sure the information in the final type captures the contents of the object. We could do this by applying property type changes on the initial type to the final type as well, so that the property types in the initial type are a subset of the property types in the final type (this is also simple to do).
Assignee | ||
Comment 3•10 years ago
|
||
WIP. This makes a lot of changes to how the new script properties analysis works, following along very closely with comment 0. This patch works but currently regresses several octane tests so needs some more tuning.
Assignee: nobody → bhackett1024
Assignee | ||
Comment 4•10 years ago
|
||
Another WIP. This fixes some perf issues but on octane this still regresses raytrace, box2d and typescript by 5-10%, while improving gameboy by 5-10%. Other tests don't seem to move. These regressions have been kind of frustrating to investigate as the metrics I use to look at perf --- quality of the executed Ion code, Ion compilation count, major/minor GC count --- are as good or better with this patch (in the case of box2d codegen, considerably better) yet the score is still worse. Will try using cachegrind next to see if it offers any insight.
Attachment #8473087 -
Attachment is obsolete: true
Assignee | ||
Comment 5•10 years ago
|
||
This patch seems to fix the regressions mentioned above. We were repeatedly bailing out without recompiling the Ion code, due to an ordering issue when updating type information for objects becoming fully initialized (type information for the partially initialized type was not updated and the type guards we add for Ion SETPROP caches were triggering inappropriately). I'll break this patch up for review, it's the trickiest one I've written for a long time but makes some pretty nice structural changes. Besides several simplifications, keeping track of the preliminary objects before doing the new script properties analysis makes it more feasible to store unboxed data in objects: code will be able to run and fill in the preliminary objects so we know what their property types should be, and when we do the new script properties analysis we know all objects in existence with the type and can go fix them up to have a uniform unboxed representation for use in Ion compilation.
Attachment #8474627 -
Attachment is obsolete: true
Assignee | ||
Comment 6•10 years ago
|
||
Attachment #8476723 -
Attachment is obsolete: true
Assignee | ||
Comment 7•10 years ago
|
||
Some debugging cleanup: 1) Include a description with -D output for blocks from inlined frames, to make the output easier to use. 2) Fix a crash when calling TypeCompartment::print from gdb. This can land before the other patches.
Attachment #8477133 -
Flags: review?(jdemooij)
Assignee | ||
Comment 8•10 years ago
|
||
A later patch will need to overwrite TypeObject pointers from jitcode. This patch allows pre barrier jitcode calls to be performed on such pointers, and cleans up the JIT pre barrier calls mechanism in the process. This can land before the other patches.
Attachment #8477142 -
Flags: review?(jdemooij)
Assignee | ||
Comment 9•10 years ago
|
||
Currently, on some paths through the interpreter's invoke mechanism we end up creating |this| values for a |new| call multiple times. This breaks the acquired properties analysis, which needs to know that all objects of a type have a particular shape, and when an object is discarded like this it will never have properties added to it. This patch fixes the interpreter so redundant |this| values are not created, and cleans up some related duplicate code. This patch can land before the other patches.
Attachment #8477147 -
Flags: review?(jdemooij)
Assignee | ||
Comment 10•10 years ago
|
||
The main patch in this series, implements the acquired properties analysis and the new script properties analysis (umbrella analysis controlling the other two). This patch excludes the changes made to ADDPROP operations required by the former, which will be in an uncoming patch.
Attachment #8477152 -
Flags: review?(jdemooij)
Assignee | ||
Comment 11•10 years ago
|
||
This patch has the changes needed to the VM and JITs for ADDPROP operations, as well as JIT changes to make sure incorrect 'new' objects are not baked in when compiling before the new script analysis has been performed.
Attachment #8477157 -
Flags: review?(jdemooij)
Assignee | ||
Comment 12•10 years ago
|
||
With the previous two patches, if Ion compiles accesses to objects before the new script properties analysis has been performed, it will not get any definite property information. This situation happens pretty often when only a few objects of a type are created, so this patch changes things so that objects accessed during Ion compilation have the new script properties analysis immediately performed on them.
Attachment #8477159 -
Flags: review?(jdemooij)
Assignee | ||
Comment 13•10 years ago
|
||
Before the new script properties analysis has been performed, objects of a type have the maximum number of fixed slots. After, they might have fewer, and if baseline code sees both the old and new objects we will end up with a polymorphic cache even if the behavior is subsequently monomorphic. This ends up hurting Ion perf on some octane tests, so this patch has the baseline inspector ignore cache entries that were generated for preliminary objects. This isn't perfect, as if after the analysis is performed the objects still have the max number of fixed slots, the old cache entries will still hit, but this patch fixes the regression I observed.
Attachment #8477165 -
Flags: review?(jdemooij)
Assignee | ||
Comment 14•10 years ago
|
||
Since we don't perform the new script properties analysis until after 20 or so objects have been created, scripts which are called by the constructor should have already been baseline compiled and had their type sets populated, removing the need to do this stuff eagerly during the definite properties analysis. This patch removes the JSContext used by IonBuiler in such cases, and is a nice cleanup. While this can affect behavior --- if we analyze before baseline compilation due to being eagerly triggered by IonBuilder, we won't end up getting any definite properties --- this doesn't seem to affect octane perf. The main benefit of doing the definite properties analysis right now is that we can optimize addprop for those definite properties, rather than using an IC, so this only helps in constructors that are called a lot. This patch can land after the other patches.
Attachment #8477167 -
Flags: review?(jdemooij)
Assignee | ||
Comment 15•10 years ago
|
||
Currently, we support dynamically resizing template objects for 'new' script types, since we compute the template before the constructor has even executed. With these patches, we don't compute the template until after some preliminary objects have been created, so the template can be sized to reflect properties not found by the definite properties analysis. With this change, the dynamic resizing mechanism is unnecessary and can be removed. This patch can land after the other patches.
Attachment #8477169 -
Flags: review?(jdemooij)
Updated•10 years ago
|
Attachment #8477133 -
Flags: review?(jdemooij) → review+
Assignee | ||
Comment 16•10 years ago
|
||
Part 1: https://hg.mozilla.org/integration/mozilla-inbound/rev/ec4622e6e1fa
Keywords: leave-open
Comment 17•10 years ago
|
||
Comment on attachment 8477142 [details] [diff] [review] allow TypeObject pre barriers Review of attachment 8477142 [details] [diff] [review]: ----------------------------------------------------------------- ::: js/src/jit/CodeGenerator.cpp @@ +1650,5 @@ > int32_t offset = lir->mir()->slot() * sizeof(js::Value); > Address dest(base, offset); > > if (lir->mir()->needsBarrier()) > + emitPreBarrier(dest, MIRType_Value); AFAICS CodeGeneratorShared::emitPreBarrier is always called with second argument = MIRType_Value. If that's the case maybe just remove it. ::: js/src/jit/VMFunctions.h @@ +717,5 @@ > JSObject *TypedObjectProto(JSObject *obj); > > +void MarkValueFromIon(JSRuntime *rt, Value *vp); > +void MarkShapeFromIon(JSRuntime *rt, Shape **shapep); > +void MarkTypeObjectFromIon(JSRuntime *rt, types::TypeObject **typep); Please move the definitions from Ion.cpp to VMFunctions.cpp as well.
Attachment #8477142 -
Flags: review?(jdemooij) → review+
Comment 18•10 years ago
|
||
Comment on attachment 8477147 [details] [diff] [review] Don't create 'this' objects multiple times Review of attachment 8477147 [details] [diff] [review]: ----------------------------------------------------------------- Nice to have this factored out. ::: js/src/jit/Ion.cpp @@ -2261,5 @@ > - RootedObject obj(cx, CreateThisForFunction(cx, callee, > - invoke.useNewType() > - ? SingletonObject > - : GenericObject)); > - if (!obj || !jit::IsIonEnabled(cx)) // Note: OOM under CreateThis can disable TI. Yay bug 972817. ::: js/src/vm/Interpreter.cpp @@ +359,5 @@ > + if (isInvoke()) { > + InvokeState &invoke = *asInvoke(); > + if (invoke.constructing() && invoke.args().thisv().isPrimitive()) { > + // Keep the GC from wiping out jitcode that is about to execute. > + AutoSuppressGC suppress(cx); This is not strictly necessary for correctness as we call this before checking if there's a Baseline/Ion script right?
Attachment #8477147 -
Flags: review?(jdemooij) → review+
Comment 19•10 years ago
|
||
Comment on attachment 8477152 [details] [diff] [review] main patch Review of attachment 8477152 [details] [diff] [review]: ----------------------------------------------------------------- Looks great. The comments and many asserts are really useful. ::: js/src/jsinfer.cpp @@ +2785,5 @@ > { > if (unknownProperties()) > return true; > > /* Mark all properties of obj as definite properties of this type. */ Nit: s/obj/shape @@ +3536,5 @@ > + } > + } > + > + // There should be room for registering the new object. > + MOZ_CRASH(); Nit: you can use MOZ_CRASH("There should..."), that's also useful for the fuzzers. @@ +3721,5 @@ > + > + RootedTypeObject typeRoot(cx, type); > + templateObject_ = NewObjectWithType(cx, typeRoot, cx->global(), kind, MaybeSingletonObject); > + if (!templateObject_) > + return false; This function returns |false| both on OOM or other exceptions and when analysis failed. Shouldn't we propagate the former? @@ +3801,5 @@ > + if (!initialType) > + return false; > + > + if (!initialType->addDefiniteProperties(cx, templateObject()->lastProperty())) > + return false; Nit: trailing whitespace ::: js/src/jsinfer.h @@ +830,5 @@ > +// the properties which that object will eventually have. This is done via two > +// analyses. One of these, the definite properties analysis, is static, and the > +// other, the acquired properties analysis, is dynamic. As objects are > +// constructed using 'new' on some script to create objects of type T, our > +// analysis strategy is as follows: Nice and clear comment. One thing that wasn't clear after reading it is what we discussed on IRC: if < PRELIMINARY_OBJECT_COUNT objects are allocated, Ion can still use the acquired properties analysis and still has definite property information. Please explain this somewhere.
Attachment #8477152 -
Flags: review?(jdemooij) → review+
Assignee | ||
Comment 20•10 years ago
|
||
Part 2 (TypeObject pre barriers): https://hg.mozilla.org/integration/mozilla-inbound/rev/bf2bf138571c
Assignee | ||
Comment 21•10 years ago
|
||
Part 3 (new object creation): https://hg.mozilla.org/integration/mozilla-inbound/rev/870d25b5d7b3 The AutoSuppressGC is unnecessary, yeah, and I removed it. It was a holdover from when I was trying to create the 'this' object in a different place.
Comment 22•10 years ago
|
||
Comment on attachment 8477157 [details] [diff] [review] ADDPROP changes Review of attachment 8477157 [details] [diff] [review]: ----------------------------------------------------------------- r=me with comment below addressed. ::: js/src/jit/IonCaches.cpp @@ +2880,5 @@ > > + if (inlinable) { > + // The property did not exist before, now we can try to inline the property add. > + bool checkTypeset; > + if (!addedSetterStub && canCache == MaybeCanAttachAddSlot && The |if (inlinable)| is unnecessary as canCache will always be CanAttachNone if inlinable == false. Can you kill "bool inlinable" completely and use "cache.canAttachStub() && !obj->watched()" as condition of the if at the start of the function?
Attachment #8477157 -
Flags: review?(jdemooij) → review+
Comment 23•10 years ago
|
||
Comment on attachment 8477159 [details] [diff] [review] Eagerly analyze scripts during Ion compilation Review of attachment 8477159 [details] [diff] [review]: ----------------------------------------------------------------- ::: js/src/jit/IonBuilder.cpp @@ +740,5 @@ > return false; > > + if (abortedNewScriptPropertiesType()) { > + abortReason_ = AbortReason_NewScriptProperties; > + return false; Can this happen during the DPA or arguments analysis? If not we should probably assert it. @@ +8269,5 @@ > +{ > + if (!types || types->unknownObject()) > + return UINT32_MAX; > + > + uint32_t slot = UINT32_MAX; Nit: move this after the first loop, as it's only used in the second loop. @@ +8289,5 @@ > + continue; > + > + if (types::TypeObject *typeObject = type->maybeType()) { > + if (typeObject->newScript() && !typeObject->newScript()->analyzed()) { > + abortedNewScriptPropertiesType_ = typeObject; What if there are multiple Typeobjects that still need to be analyzed, do we risk running IonBuilder N times? I also wanted to suggest aborting compilation immediately instead of continuing, but it might be better to continue and maintain a Vector of TypeObjects that have to be analyzed? I'm also wondering if just running the analysis here and adding the JSContext back to IonBuilder might be simpler and faster...
Attachment #8477159 -
Flags: review?(jdemooij)
Assignee | ||
Comment 24•10 years ago
|
||
(In reply to Jan de Mooij [:jandem] from comment #23) > What if there are multiple Typeobjects that still need to be analyzed, do we > risk running IonBuilder N times? I also wanted to suggest aborting > compilation immediately instead of continuing, but it might be better to > continue and maintain a Vector of TypeObjects that have to be analyzed? Yeah, I thought about doing this but got lazy. I'll add a vector of type objects to analyze at the end. > I'm also wondering if just running the analysis here and adding the > JSContext back to IonBuilder might be simpler and faster... The problem here is that the new script properties analysis can change type information --- when we run IonBuilder it can optimistically add new observed types, and when finishing the analysis we can add properties to type objects, which can cause the type to be marked unknown. Allowing this in the middle of IonBuilder could lead to weird and potentially incorrect behavior.
Assignee | ||
Comment 25•10 years ago
|
||
Also, I added an assert that we don't abort during analysis, this isn't possible since we don't try to optimize property accesses when building for the definite properties or arguments usage analyses.
Attachment #8477159 -
Attachment is obsolete: true
Attachment #8478335 -
Flags: review?(jdemooij)
Comment 26•10 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/ec4622e6e1fa https://hg.mozilla.org/mozilla-central/rev/bf2bf138571c https://hg.mozilla.org/mozilla-central/rev/870d25b5d7b3
Comment 27•10 years ago
|
||
(In reply to Brian Hackett (:bhackett) from comment #24) > The problem here is that the new script properties analysis can change type > information --- when we run IonBuilder it can optimistically add new > observed types, and when finishing the analysis we can add properties to > type objects, which can cause the type to be marked unknown. Allowing this > in the middle of IonBuilder could lead to weird and potentially incorrect > behavior. If this does happen, it should be detectable if the typeinfo changes are incompatible with compilation decisions that have already been made, simply by looking for triggering of constraints already attached during the compile, no? I.e. if IonBuilder runs, and does a bunch of NewScript analyses, but at the end of the compile none of the attached constraints have been invalidated, then the compile is still valid, no? If this is only true in theory and not actually true in practice the vast majority of the time, though.. then it's probably not worth it.
Comment 28•10 years ago
|
||
Comment on attachment 8478335 [details] [diff] [review] Eagerly analyze scripts during Ion compilation (v2) Review of attachment 8478335 [details] [diff] [review]: ----------------------------------------------------------------- Thanks for addressing that.
Attachment #8478335 -
Flags: review?(jdemooij) → review+
Comment 29•10 years ago
|
||
Comment on attachment 8477169 [details] [diff] [review] remove dynamic template object resizing Review of attachment 8477169 [details] [diff] [review]: ----------------------------------------------------------------- That's removing some complicated code.
Attachment #8477169 -
Flags: review?(jdemooij) → review+
Assignee | ||
Comment 30•10 years ago
|
||
(In reply to Kannan Vijayan [:djvj] from comment #27) > If this does happen, it should be detectable if the typeinfo changes are > incompatible with compilation decisions that have already been made, simply > by looking for triggering of constraints already attached during the > compile, no? > > I.e. if IonBuilder runs, and does a bunch of NewScript analyses, but at the > end of the compile none of the attached constraints have been invalidated, > then the compile is still valid, no? If this is only true in theory and not > actually true in practice the vast majority of the time, though.. then it's > probably not worth it. Well, yeah, the IonBuilder design is pretty robust against this sort of change, mainly because the changes made for off thread IonBuilder required that we be able to tolerate type changes on the main thread while IonBuilder proceeds off thread. But at certain points within the compilation of a single op though we could get type changes if we ran the new script properties analysis, which isn't possible even with off thread IonBuilder. It's just hard to say if this would cause a problem or not; it's just a cleaner design and easier to reason about when IonBuilder can't change any type information itself.
Updated•10 years ago
|
Attachment #8477167 -
Flags: review?(jdemooij) → review+
Comment 31•10 years ago
|
||
(In reply to Brian Hackett (:bhackett) from comment #13) > This ends up hurting Ion perf on some octane tests, so this patch has the > baseline inspector ignore cache entries that were generated for preliminary > objects. This isn't perfect, as if after the analysis is performed the > objects still have the max number of fixed slots, the old cache entries will > still hit, but this patch fixes the regression I observed. I'm a bit worried that ignoring certain Baseline caches/shapes can cause us to keep bailing out due to shape guard failures. We've had a number of these "repeated bailouts" bugs and they are really annoying and can destroy performance :(
Assignee | ||
Comment 32•10 years ago
|
||
(In reply to Jan de Mooij [:jandem] from comment #31) > I'm a bit worried that ignoring certain Baseline caches/shapes can cause us > to keep bailing out due to shape guard failures. We've had a number of these > "repeated bailouts" bugs and they are really annoying and can destroy > performance :( Well, an alternate design I thought of would be to remove the baseline caches from within baseline itself, rather than by ignoring them in the baseline inspector. We still keep the bit on the caches indicating whether they are for preliminary objects, and whenever we attach a getprop/setprop stub which isn't on a preliminary object to a baseline cache, we clear out any cache entries which are on preliminary objects.
Comment 33•10 years ago
|
||
(In reply to Brian Hackett (:bhackett) from comment #32) > Well, an alternate design I thought of would be to remove the baseline > caches from within baseline itself, rather than by ignoring them in the > baseline inspector. We still keep the bit on the caches indicating whether > they are for preliminary objects, and whenever we attach a getprop/setprop > stub which isn't on a preliminary object to a baseline cache, we clear out > any cache entries which are on preliminary objects. Yeah, that sounds reasonable and safer. That way when we see a preliminary object later on, we will bailout and attach a new stub. If you can post a new patch I'll review today or tomorrow (since it's the last blocker as far as I can see).
Assignee | ||
Comment 34•10 years ago
|
||
Attachment #8477165 -
Attachment is obsolete: true
Attachment #8477165 -
Flags: review?(jdemooij)
Attachment #8479207 -
Flags: review?(jdemooij)
Updated•10 years ago
|
Attachment #8479207 -
Flags: review?(jdemooij) → review+
Assignee | ||
Comment 35•10 years ago
|
||
Main patch, everything that hasn't landed yet except the IonBuilder JSContext removal: https://hg.mozilla.org/integration/mozilla-inbound/rev/a1b25f21fe08
Comment 36•10 years ago
|
||
There seems to be a richards regression (7.4%) on AWFY MacOS x86-64 that's a bit sticky. Otherwise, there are some nice wins in several octane benches.
Comment 37•10 years ago
|
||
I'm seeing the following abort on x64, which bisected to a1b25f21fe08: $ cd js/src/octane $ js run-box2d.js Assertion failure: MIR instruction returned value with unexpected type, at js/src/jit/IonMacroAssembler.cpp:1339 Trace/breakpoint trap
Assignee | ||
Comment 38•10 years ago
|
||
This fixes the problem in comment 37 for me. When making singleton type sets during compilation we weren't ensuring that type sets containing an initial type also had the fully initialized type.
Attachment #8483140 -
Flags: review?(jdemooij)
Assignee | ||
Comment 39•10 years ago
|
||
Oh, and I'll look and see if I can reproduce that richards regression tomorrow (landed this at the beginning of the cycle so there would be more time to sort out regressions).
Updated•10 years ago
|
Attachment #8483140 -
Flags: review?(jdemooij) → review+
Assignee | ||
Comment 40•10 years ago
|
||
Singleton type set fix: https://hg.mozilla.org/integration/mozilla-inbound/rev/7b20a4e9ce15
Assignee | ||
Comment 41•10 years ago
|
||
I think the richards regression is a problem with our inlining heuristics. Since we baseline compile constructors at different times now, use counts and compilation orders have been perturbed a bit. Before the main patch landed, I get a score of 24800 on richards (all numbers are on a 10.9 x64 build, averaged over several runs). After the main patch landed, I get a score bimodally of either 20000 or 23000. If I then disable the vetoing mechanism for insufficiently hot callees ("Callee must have been called a few times to have somewhat stable type information"), my score improves to 25500. If I disable the above vetoing mechanism in a tree from before the main patch landed, my score stays around 24800. I'm not sure how much sense this veto mechanism makes. When a script's Ion code is discarded its use count is reset, though its type information is retained.
Comment 42•10 years ago
|
||
https://hg.mozilla.org/mozilla-central/rev/a1b25f21fe08 https://hg.mozilla.org/mozilla-central/rev/7b20a4e9ce15
Assignee | ||
Comment 43•10 years ago
|
||
IonBuilder JSContext removal: https://hg.mozilla.org/integration/mozilla-inbound/rev/ce0afdc6ea1f
Keywords: leave-open
Assignee | ||
Comment 44•10 years ago
|
||
Backout of ce0afdc6ea1f: https://hg.mozilla.org/integration/mozilla-inbound/rev/4322addcf997 This caused several regressions on AWFY. This is a simplification patch which seems to have oversimplified things (it does make the definite properties analysis less powerful) and I don't think it's really worth pursuing right now.
Assignee | ||
Updated•10 years ago
|
Status: NEW → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Updated•10 years ago
|
Target Milestone: --- → mozilla35
Updated•9 years ago
|
Depends on: CVE-2015-0820
You need to log in
before you can comment on or make changes to this bug.
Description
•