Closed
Bug 1398768
Opened 7 years ago
Closed 7 years ago
Consider removing unboxed arrays
Categories
(Core :: JavaScript Engine, enhancement, P3)
Core
JavaScript Engine
Tracking
()
RESOLVED
FIXED
mozilla58
Tracking | Status | |
---|---|---|
firefox58 | --- | fixed |
People
(Reporter: evilpies, Assigned: jandem)
References
Details
(Whiteboard: [js:tech-debt])
Attachments
(12 files, 1 obsolete file)
272.49 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
58.97 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
33.74 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
6.96 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
8.48 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
25.04 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
8.52 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
6.10 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
18.82 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
21.77 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
10.96 KB,
patch
|
evilpies
:
review+
|
Details | Diff | Splinter Review |
3.08 KB,
patch
|
anba
:
review+
|
Details | Diff | Splinter Review |
The unboxed arrays code has never been enabled. It's relatively complex and touches many parts of the engine. Last I checked it doesn't pass our test suite. Over the recent months we added many optimizations to normal arrays, like shifting, and we would need to make sure unboxed arrays are not slower in those cases. I think we should remove unboxed arrays unless somebody can spend the time (probably quite a bit) to optimize and fix the code.
Updated•7 years ago
|
Priority: -- → P3
Whiteboard: [js:tech-debt]
Assignee | ||
Comment 1•7 years ago
|
||
Brian, WDYT? There's definitely performance overhead and complexity from supporting unboxed arrays (in array natives for instance). As Tom mentioned in comment 0, unboxed arrays also don't support the shifting optimization I added and they come with other potential perf cliffs (when adding named properties for instance).
Flags: needinfo?(bhackett1024)
Comment 2•7 years ago
|
||
Sure, these would be fine to remove. They do improve microbenchmarks but never helped much with larger benchmarks, and there are better things to work on.
Flags: needinfo?(bhackett1024)
Assignee | ||
Updated•7 years ago
|
Assignee: nobody → jdemooij
Status: NEW → ASSIGNED
Assignee | ||
Comment 3•7 years ago
|
||
This removes most (but not all) unboxed array code. There's a lot more code we can remove and cleanup in follow-up patches.
41 files changed, 442 insertions(+), 3026 deletions(-)
evilpie volunteered to review.
Attachment #8911751 -
Flags: review?(evilpies)
Comment on attachment 8911751 [details] [diff] [review]
Part 1 - Remove most code
Review of attachment 8911751 [details] [diff] [review]:
-----------------------------------------------------------------
Looks pretty good, but this is an insane amount of code. I want to do a second pass later.
::: js/src/jit/Lowering.cpp
@@ -3362,5 @@
> const LUse elements = useRegister(ins->elements());
> const LAllocation index = useRegisterOrConstant(ins->index());
>
> // Use a temp register when adding new elements to unboxed arrays.
> LDefinition tempDef = LDefinition::BogusTemp();
I guess we don't need this anymore?
@@ -3397,5 @@
> const LAllocation index = useRegisterOrConstant(ins->index());
>
> // Use a temp register when adding new elements to unboxed arrays.
> LDefinition tempDef = LDefinition::BogusTemp();
> - if (ins->unboxedType() != JSVAL_TYPE_MAGIC)
Same
Assignee | ||
Comment 5•7 years ago
|
||
(In reply to Tom Schuster [:evilpie] from comment #4)
> I guess we don't need this anymore?
Yes I wanted to remove this in a follow-up patch.
Assignee | ||
Comment 6•7 years ago
|
||
This inlines most of the helper functions (like GetAnyBoxedOrUnboxedInitializedLength) in UnboxedObject-inl.h into the callers.
I also changed some functions to take ArrayObject* or NativeObject* instead of JSObject* to avoid a lot of as<NativeObject>() casts.
Again there's still a lot left to clean up here, especially in jsarray.cpp
Attachment #8912130 -
Flags: review?(evilpies)
Comment on attachment 8911751 [details] [diff] [review]
Part 1 - Remove most code
Review of attachment 8911751 [details] [diff] [review]:
-----------------------------------------------------------------
Looks pretty good, but this is an insane amount of code. I want to do a second pass later.
::: js/src/jit/Lowering.cpp
@@ -3362,5 @@
> const LUse elements = useRegister(ins->elements());
> const LAllocation index = useRegisterOrConstant(ins->index());
>
> // Use a temp register when adding new elements to unboxed arrays.
> LDefinition tempDef = LDefinition::BogusTemp();
I guess we don't need this anymore?
@@ -3397,5 @@
> const LAllocation index = useRegisterOrConstant(ins->index());
>
> // Use a temp register when adding new elements to unboxed arrays.
> LDefinition tempDef = LDefinition::BogusTemp();
> - if (ins->unboxedType() != JSVAL_TYPE_MAGIC)
Same
Attachment #8911751 -
Flags: review?(evilpies) → review+
Attachment #8912130 -
Flags: review?(evilpies) → review+
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/442671394512
part 1 - Remove most unboxed array code. r=evilpie
Assignee | ||
Updated•7 years ago
|
Keywords: leave-open
Assignee | ||
Comment 9•7 years ago
|
||
This changes a bunch of functions to take/return ArrayObject* instead of JSObject*.
Attachment #8912735 -
Flags: review?(evilpies)
Assignee | ||
Comment 10•7 years ago
|
||
Attachment #8912743 -
Flags: review?(evilpies)
Assignee | ||
Comment 11•7 years ago
|
||
Attachment #8912766 -
Flags: review?(evilpies)
Assignee | ||
Comment 12•7 years ago
|
||
Attachment #8912768 -
Flags: review?(evilpies)
Reporter | ||
Comment 13•7 years ago
|
||
Comment on attachment 8912735 [details] [diff] [review]
Part 3 - Use ArrayObject* instead of JSObject*
Review of attachment 8912735 [details] [diff] [review]:
-----------------------------------------------------------------
::: js/src/jit/BaselineIC.cpp
@@ +2431,3 @@
> if (!nobj)
> return false;
> + EnsureArrayGroupAnalyzed(cx, nobj); //XXX
todo?
Attachment #8912735 -
Flags: review?(evilpies) → review+
Attachment #8912743 -
Flags: review?(evilpies) → review+
Reporter | ||
Comment 14•7 years ago
|
||
Comment on attachment 8912766 [details] [diff] [review]
Part 5 - Remove flags
Review of attachment 8912766 [details] [diff] [review]:
-----------------------------------------------------------------
::: js/src/vm/ObjectGroup.cpp
@@ -1726,5 @@
> - group->setPreliminaryObjects(preliminaryObjects);
> - else
> - cx->recoverFromOutOfMemory();
> - }
> -
There is similar code in ObjectGroup::newArrayObject, not guarded by unboxedArrays, could we remove that as well?
Attachment #8912766 -
Flags: review?(evilpies) → review+
Reporter | ||
Comment 15•7 years ago
|
||
Comment on attachment 8912768 [details] [diff] [review]
Part 6 - Remove functors for array natives
Review of attachment 8912768 [details] [diff] [review]:
-----------------------------------------------------------------
That functor stuff is definitely complicated. I don't like using DenseElementResult for stuff that can't fail.
::: js/src/jsarray.cpp
@@ +1522,3 @@
> {
> /* An empty array or an array with no elements is already reversed. */
> + if (length == 0 || obj->getDenseInitializedLength() == 0)
Much nicer with HandleNativeObject.
@@ +2449,2 @@
> if (result != DenseElementResult::Incomplete) {
> + MOZ_ASSERT(result == DenseElementResult::Success);
Not quite sure why this holds. MoveBoxedOrUnboxedDenseElements seems fallible. MoveBoxedOrUnboxedDenseElements vs ShiftMoveBoxedOrUnboxedDenseElements ...
Comment 16•7 years ago
|
||
bugherder |
Comment 17•7 years ago
|
||
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/5d9e0402afdb
part 2 - Inline some small helper functions into the callers. r=evilpie
Assignee | ||
Comment 18•7 years ago
|
||
This makes GetDenseElements and ArrayJoinDenseKernel return bool instead of DenseElementResult, and it fixes the ArrayShiftDenseKernel return value check (good catch!).
Attachment #8912768 -
Attachment is obsolete: true
Attachment #8912768 -
Flags: review?(evilpies)
Attachment #8913133 -
Flags: review?(evilpies)
Attachment #8913133 -
Flags: review?(evilpies) → review+
Assignee | ||
Comment 19•7 years ago
|
||
This removes CopyBoxedOrUnboxedDenseElements and replaces it with a NativeObject::initDenseElements overload.
It also cleans up initDenseElements a bit: the dstStart argument is always 0 so we can remove it, and initDenseElements can call setDenseInitializedLength so the callers don't have to do that.
Attachment #8913155 -
Flags: review?(evilpies)
Assignee | ||
Comment 20•7 years ago
|
||
I renamed MoveBoxedOrUnboxedDenseElements to MoveDenseElements and moved it to jsarray.cpp. It also takes a NativeObject* instead of JSObject* now.
Attachment #8913169 -
Flags: review?(evilpies)
Assignee | ||
Comment 21•7 years ago
|
||
This renames SetOrExtendBoxedOrUnboxedDenseElements to NativeObject::setOrExtendDenseElements
Attachment #8913171 -
Flags: review?(evilpies)
Assignee | ||
Comment 22•7 years ago
|
||
Removes remaining code and fixes some comments mentioning unboxed arrays.
Attachment #8913182 -
Flags: review?(evilpies)
Assignee | ||
Comment 23•7 years ago
|
||
We can now use JSOP_NEWARRAY instead of JSOP_SPREADCALLARRAY. See the comment in vm/Opcodes.h
Attachment #8913188 -
Flags: review?(evilpies)
Comment 24•7 years ago
|
||
(In reply to Jan de Mooij [:jandem] from comment #22)
> Created attachment 8913182 [details] [diff] [review]
> Part 10 - Misc changes
>
> Removes remaining code and fixes some comments mentioning unboxed arrays.
I think we can now also change js::CanonicalizeArrayLengthValue [1] to a static function resp. directly inline it in js::ArraySetLength (IIRC I saw CanonicalizeArrayLengthValue in µ-benchmarks because it didn't get inlined by gcc/clang).
[1] http://searchfox.org/mozilla-central/rev/f54c1723befe6bcc7229f005217d5c681128fcad/js/src/jsarray.cpp#705
Assignee | ||
Comment 25•7 years ago
|
||
Thanks for the suggestion :)
Attachment #8913192 -
Flags: review?(andrebargull)
Comment 26•7 years ago
|
||
Comment on attachment 8913192 [details] [diff] [review]
Part 12 - Inline CanonicalizeArrayLengthValue
Review of attachment 8913192 [details] [diff] [review]:
-----------------------------------------------------------------
\o/
Attachment #8913192 -
Flags: review?(andrebargull) → review+
Attachment #8913155 -
Flags: review?(evilpies) → review+
Attachment #8913169 -
Flags: review?(evilpies) → review+
Attachment #8913171 -
Flags: review?(evilpies) → review+
Attachment #8913182 -
Flags: review?(evilpies) → review+
Attachment #8913188 -
Flags: review?(evilpies) → review+
Comment 27•7 years ago
|
||
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/6ec5b0fd9f4d
part 3 - Use ArrayObject* instead of JSObject* in some places. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/d2d0f8a0196f
part 4 - Remove unused temps from some LIR instructions. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/62a67f9e8966
part 5 - Remove unboxed arrays shell flag and context option. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/923ba800cbb8
part 6 - Remove functors for array natives. r=evilpie
Assignee | ||
Comment 28•7 years ago
|
||
(In reply to Tom Schuster [:evilpie] from comment #13)
> todo?
(In reply to Tom Schuster [:evilpie] from comment #14)
> There is similar code in ObjectGroup::newArrayObject, not guarded by
> unboxedArrays, could we remove that as well?
Part 10 addresses these comments.
Comment 29•7 years ago
|
||
bugherder |
Comment 30•7 years ago
|
||
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/8358f3e52fa4
part 7 - Replace CopyBoxedOrUnboxedDenseElements with a NativeObject::initDenseElements overload. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/4403e849f860
part 8 - Clean up and rename MoveBoxedOrUnboxedDenseElements. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/a02ebffc8cce
part 9 - Clean up and rename SetOrExtendBoxedOrUnboxedDenseElements. r=evilpie
Comment 31•7 years ago
|
||
bugherder |
Comment 32•7 years ago
|
||
Pushed by jandemooij@gmail.com:
https://hg.mozilla.org/integration/mozilla-inbound/rev/320e6535b5e7
part 10 - Remove and clean up more code. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/dff7893dce77
part 11 - Remove JSOP_SPREADCALLARRAY and just use JSOP_NEWARRAY again. r=evilpie
https://hg.mozilla.org/integration/mozilla-inbound/rev/a483b64bfc05
part 12 - Remove/inline CanonicalizeArrayLengthValue. r=anba
Assignee | ||
Updated•7 years ago
|
Keywords: leave-open
![]() |
||
Comment 33•7 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/320e6535b5e7
https://hg.mozilla.org/mozilla-central/rev/dff7893dce77
https://hg.mozilla.org/mozilla-central/rev/a483b64bfc05
Status: ASSIGNED → RESOLVED
Closed: 7 years ago
status-firefox58:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla58
Comment 34•7 years ago
|
||
*applause*
You need to log in
before you can comment on or make changes to this bug.
Description
•