Closed Bug 1322091 Opened 8 years ago Closed 8 years ago

Port remaining Baseline GETELEM stubs to CacheIR

Categories

(Core :: JavaScript Engine: JIT, defect, P1)

defect

Tracking

()

RESOLVED FIXED
mozilla53
Tracking Status
firefox53 --- fixed

People

(Reporter: jandem, Assigned: jandem)

References

(Blocks 1 open bug)

Details

Attachments

(6 files)

After bug 1320670, the only non-CacheIR Baseline GETELEM stubs are for value[int32] with |value| one of {string, dense element, typed array, unboxed array, arguments}. It shouldn't be too hard to convert these.
Attached patch Part 1 - StringsSplinter Review
This converts the string[int32] stub.
Attachment #8817092 - Flags: review?(evilpies)
I also folded the addPtr into the loadValue(BaseValueIndex.. following it.

I'll file a follow-up bug to avoid attaching duplicate stubs.
Attachment #8817106 - Flags: review?(evilpies)
(In reply to Jan de Mooij [:jandem] from comment #2)
> I'll file a follow-up bug to avoid attaching duplicate stubs.

Bug 1322320.
7 files changed, 79 insertions(+), 179 deletions(-)
Attachment #8817217 - Flags: review?(evilpies)
8 files changed, 54 insertions(+), 125 deletions(-)
Attachment #8817233 - Flags: review?(evilpies)
Priority: -- → P1
8 files changed, 64 insertions(+), 132 deletions(-)
Attachment #8817240 - Flags: review?(evilpies)
Comment on attachment 8817092 [details] [diff] [review]
Part 1 - Strings

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

::: js/src/jit/CacheIR.cpp
@@ +792,5 @@
> +    JSString* str = val_.toString();
> +    int32_t index = idVal_.toInt32();
> +    if (size_t(index) >= str->length() ||
> +        !str->isLinear() ||
> +        str->asLinear().latin1OrTwoByteChar(index) >= StaticStrings::UNIT_STATIC_LIMIT)

Good idea.
Attachment #8817092 - Flags: review?(evilpies) → review+
Comment on attachment 8817106 [details] [diff] [review]
Part 2 - Magic arguments

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

::: js/src/jit/BaselineCacheIR.cpp
@@ +1616,5 @@
> +        return false;
> +
> +    // Bounds check.
> +    Address numActualArgs(BaselineFrameReg, BaselineFrame::offsetOfNumActualArgs());
> +    masm.loadPtr(Address(BaselineFrameReg, BaselineFrame::offsetOfNumActualArgs()), scratch);

Use numActualArgs

::: js/src/jit/CacheIR.cpp
@@ +839,5 @@
> +    MOZ_ASSERT(idVal_.isInt32());
> +
> +    if (!val_.isMagic(JS_OPTIMIZED_ARGUMENTS))
> +        return false;
> +

Can or should we check for the no FrameHasNoArgumentsObject before attaching?
Attachment #8817106 - Flags: review?(evilpies) → review+
Comment on attachment 8817217 [details] [diff] [review]
Part 3 - ArgumentsObject

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

So much nicer!

::: js/src/jit/BaselineIC.cpp
@@ -1387,5 @@
> -    Label failureReconstructInputs;
> -    regs = availableGeneralRegs(0);
> -    regs.takeUnchecked(objReg);
> -    regs.takeUnchecked(idxReg);
> -    regs.take(scratchReg);

I am glad we don't need this anymore.
Attachment #8817217 - Flags: review?(evilpies) → review+
The last one.

For typed arrays/objects Baseline also supports object[double]. I added a check for int-valued doubles to GuardIsInt32, to convert the double to int32. The old code also converted -0 => 0 but I didn't do that as GuardIsInt32 is also used for other objects.

The nice thing is that this now works in all cases (like string[double] or array[double]).
Attachment #8817281 - Flags: review?(evilpies)
Comment on attachment 8817233 [details] [diff] [review]
Part 4 - Dense element

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

::: js/src/jit/CacheIR.cpp
@@ +886,5 @@
> +                                          ValOperandId indexId)
> +{
> +    MOZ_ASSERT(idVal_.isInt32());
> +
> +    if (!obj->isNative())

IsNativeDenseElementAccess checked for !is<TypedArrayObject>.
Attachment #8817233 - Flags: review?(evilpies) → review+
Comment on attachment 8817281 [details] [diff] [review]
Part 6 - Typed arrays/objects

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

::: js/src/jit/BaselineCacheIR.cpp
@@ +955,5 @@
>          return false;
> +
> +    Label done;
> +    masm.branchTestInt32(Assembler::Equal, input, &done);
> +    {

I think we need a jitSupportsFloatingPoint check here.

::: js/src/jit/BaselineIC.cpp
@@ -936,5 @@
>  }
>  
>  static bool
> -TryAttachGetElemStub(JSContext* cx, JSScript* script, jsbytecode* pc, ICGetElem_Fallback* stub,
> -                     HandleValue lhs, HandleValue rhs, HandleValue res, bool* attached)

\o/

::: js/src/jit/CacheIR.cpp
@@ +956,5 @@
> +        return false;
> +
> +    TypedThingLayout layout = GetTypedThingLayout(obj->getClass());
> +    if (layout != Layout_TypedArray)
> +        writer.guardNoDetachedTypedObjects();

Where is this defined?
Attachment #8817281 - Flags: review?(evilpies) → review+
Attachment #8817240 - Flags: review?(evilpies) → review+
Thanks for the quick reviews!

(In reply to Tom Schuster [:evilpie] from comment #8)
> Can or should we check for the no FrameHasNoArgumentsObject before attaching?

It's a bit annoying because we don't have the BaselineFrame* there. We could pass it but I don't think it's worth it. It seems fine to attach a stub for this edge case even if it will fail.

(In reply to Tom Schuster [:evilpie] from comment #11)
> IsNativeDenseElementAccess checked for !is<TypedArrayObject>.

Oh right, this is no longer necessary because we check index < initializedLength. Typed arrays don't have dense elements so the initialized length is always 0 and we will never attach a dense stub.

(In reply to Tom Schuster [:evilpie] from comment #12)
> I think we need a jitSupportsFloatingPoint check here.

Good catch!

> > +        writer.guardNoDetachedTypedObjects();
> 
> Where is this defined?

It's in the code already, I had to add it for something else (for typedObject.foo I think).
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/16720e74a36f
part 1 - Port Baseline string GETELEM stub to CacheIR. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/b3249dd222ca
part 2 - Port Baseline lazy arguments GETELEM stub to CacheIR. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/ff00ebb73274
part 3 - Port Baseline ArgumentsObject GETELEM stub to CacheIR. r=evilpie
Keywords: leave-open
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/90dc3d44b941
part 4 - Port Baseline dense element GETELEM stub to CacheIR. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/516f8f487e6b
part 5 - Port Baseline unboxed array GETELEM stub to CacheIR. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/1fe5d0073816
part 6 - Port Baseline TypedArray/TypedObject GETELEM stub to CacheIR. r=evilpie
Keywords: leave-open
We should have a follow up about allowing to attach other stubs that use GuardIsInt32, if the index fits into int32.
https://hg.mozilla.org/mozilla-central/rev/90dc3d44b941
https://hg.mozilla.org/mozilla-central/rev/516f8f487e6b
https://hg.mozilla.org/mozilla-central/rev/1fe5d0073816
Status: ASSIGNED → RESOLVED
Closed: 8 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla53
(In reply to Tom Schuster [:evilpie] from comment #17)
> We should have a follow up about allowing to attach other stubs that use
> GuardIsInt32, if the index fits into int32.

Ah yes, definitely. Filed bug 1323096.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: