Closed Bug 772087 Opened 12 years ago Closed 12 years ago

IonMonkey: Immediate Invalidation from idempotent cache v8-raytrace.js:710

Categories

(Core :: JavaScript Engine, defect)

x86_64
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: nbp, Assigned: nbp)

References

Details

Attachments

(1 file)

Investigate what is the missing condition which is supposed to prevent this invalidation.  JM is supposed to have run enough time to prevent any immediate invalidation in Ion.

The type inference does not report any new type.  The same kind of invalidation happens also for  raytrace.js:427 except that there is an invalidation caused by Bug 766805 between the compilation of the Ion cache invalidation.

This bug can be detected with IONFLAGS=caches,logs,mir,aborts,bailouts,osi and TI spew can be enabled to ensure that no Type Inference constraint caused anything else in the mean time.
- Factor the the idempotent proto chain predicate to JSObject such as it
  can be shared between JM and IM.
    
- Filter the resolve function of JSFunction as idempotent.
Attachment #640282 - Flags: review?(jdemooij)
Comment on attachment 640282 [details] [diff] [review]
Avoid IonMonkey recompilation caused by wrong idempotent flags.

Review of attachment 640282 [details] [diff] [review]:
-----------------------------------------------------------------

Looks good, r=me with comments addressed.

::: js/src/jsobj.h
@@ +380,4 @@
>                                      size_t *slotsSize, size_t *elementsSize,
>                                      size_t *miscSize) const;
>  
> +    inline bool isIdempotentProtoChain() const;

Nit: maybe hasIdempotentProtoChain? I added the original name but "has" seems better now...

::: js/src/methodjit/PolyIC.cpp
@@ +698,5 @@
>          if (!aobj->isNative())
>              return ic.disable(f, "non-native");
>  
> +        if (!aobj->isIdempotentProtoChain())
> +            return Lookup_Uncacheable;

This condition is too strict for JM ICs (which are never idempotent). Can you instead add the following to GetPropCompiler::update near the hadGC() check:

if (..not idempotent..)
    MarkNotIdempotent(f.script(), f.pc());
Attachment #640282 - Flags: review?(jdemooij) → review+
https://hg.mozilla.org/projects/ionmonkey/rev/24c81eaaf528
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: