WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
197940
[JSC] Shrink Metadata
https://bugs.webkit.org/show_bug.cgi?id=197940
Summary
[JSC] Shrink Metadata
Yusuke Suzuki
Reported
2019-05-15 20:32:29 PDT
It turns out that MetadataTable including UnlinkedMetadataTable takes much memory in Gmail (from 7MB to 50MB). While we should shrink UnlinkedMetadataTable's offset table, we also should shrink Metadata itself. The histogram taken in Gmail shows that the following metadata is significant. 1. op_call 3. op_resolve_scope 4. op_get_from_scope 5. op_get_by_id
Attachments
Patch
(66.29 KB, patch)
2019-05-17 00:55 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(75.00 KB, patch)
2019-05-17 02:46 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(75.40 KB, patch)
2019-05-17 12:36 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(75.83 KB, patch)
2019-05-17 12:45 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(76.12 KB, patch)
2019-05-17 13:03 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(77.82 KB, patch)
2019-05-17 13:43 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(77.82 KB, patch)
2019-05-17 13:54 PDT
,
Yusuke Suzuki
no flags
Details
Formatted Diff
Diff
Patch
(77.85 KB, patch)
2019-05-17 14:09 PDT
,
Yusuke Suzuki
msaboff
: review+
Details
Formatted Diff
Diff
Show Obsolete
(7)
View All
Add attachment
proposed patch, testcase, etc.
Yusuke Suzuki
Comment 1
2019-05-16 20:37:57 PDT
# After opening Gmail UNLINKED METADATA TABLES 21979 METADATA TABLES 23454 METADATA TABLES SIZE 45578928 METADATA[op_call] = 137471 METADATA[op_call_eval] = 3 METADATA[op_call_varargs] = 257 METADATA[op_tail_call_varargs] = 15 METADATA[op_tail_call_forward_arguments] = 24 METADATA[op_construct] = 8826 METADATA[op_construct_varargs] = 0 METADATA[op_get_argument] = 43 METADATA[op_jneq_ptr] = 6556 METADATA[op_new_object] = 10523 METADATA[op_resolve_scope] = 272881 METADATA[op_get_from_scope] = 241736 METADATA[op_put_to_scope] = 70145 METADATA[op_get_from_arguments] = 338 METADATA[op_in_by_val] = 215 METADATA[op_new_array] = 10737 METADATA[op_get_by_id] = 148572 METADATA[op_get_by_id_with_this] = 0 METADATA[op_get_by_val_with_this] = 0 METADATA[op_catch] = 3278 METADATA[op_get_by_id_direct] = 88 METADATA[op_try_get_by_id] = 114 METADATA[op_put_by_id] = 106282 METADATA[op_tail_call] = 499 METADATA[op_profile_type] = 0 METADATA[op_profile_control_flow] = 0 METADATA[op_mul] = 336 METADATA[op_has_indexed_property] = 270 METADATA[op_get_by_val] = 7201 METADATA[op_put_by_val] = 5567 METADATA[op_get_direct_pname] = 356 METADATA[op_div] = 145 METADATA[op_put_by_val_direct] = 15182 METADATA[op_sub] = 1037 METADATA[op_bitand] = 433 METADATA[op_bitor] = 357 METADATA[op_bitxor] = 186 METADATA[op_to_object] = 57 METADATA[op_to_number] = 523 METADATA[op_negate] = 57 METADATA[op_bitnot] = 32 METADATA[op_new_array_with_size] = 94 METADATA[op_new_array_buffer] = 6908 METADATA[op_create_this] = 3523 METADATA[op_to_this] = 6609 METADATA[op_add] = 3933 # Wait for a bit. UNLINKED METADATA TABLES 24681 METADATA TABLES 7444 METADATA TABLES SIZE 12956524 METADATA[op_call] = 40296 METADATA[op_call_eval] = 2 METADATA[op_call_varargs] = 60 METADATA[op_tail_call_varargs] = 14 METADATA[op_tail_call_forward_arguments] = 6 METADATA[op_construct] = 2476 METADATA[op_construct_varargs] = 0 METADATA[op_get_argument] = 23 METADATA[op_jneq_ptr] = 946 METADATA[op_new_object] = 5908 METADATA[op_resolve_scope] = 77591 METADATA[op_get_from_scope] = 65798 METADATA[op_put_to_scope] = 15597 METADATA[op_get_from_arguments] = 82 METADATA[op_in_by_val] = 56 METADATA[op_new_array] = 5860 METADATA[op_get_by_id] = 38279 METADATA[op_get_by_id_with_this] = 0 METADATA[op_get_by_val_with_this] = 0 METADATA[op_catch] = 431 METADATA[op_get_by_id_direct] = 33 METADATA[op_try_get_by_id] = 59 METADATA[op_put_by_id] = 31170 METADATA[op_tail_call] = 168 METADATA[op_profile_type] = 0 METADATA[op_profile_control_flow] = 0 METADATA[op_mul] = 93 METADATA[op_has_indexed_property] = 70 METADATA[op_get_by_val] = 2366 METADATA[op_put_by_val] = 2764 METADATA[op_get_direct_pname] = 141 METADATA[op_div] = 40 METADATA[op_put_by_val_direct] = 13566 METADATA[op_sub] = 298 METADATA[op_bitand] = 328 METADATA[op_bitor] = 201 METADATA[op_bitxor] = 171 METADATA[op_to_object] = 32 METADATA[op_to_number] = 238 METADATA[op_negate] = 23 METADATA[op_bitnot] = 23 METADATA[op_new_array_with_size] = 74 METADATA[op_new_array_buffer] = 4909 METADATA[op_create_this] = 545 METADATA[op_to_this] = 2275 METADATA[op_add] = 1186 # After Full GC UNLINKED METADATA TABLES 24727 UNLINKED METADATA TABLES 0 UNLINKED METADATA TABLES 0 METADATA TABLES 2472 METADATA TABLES 0 METADATA TABLES 0 METADATA TABLES SIZE 0 METADATA TABLES SIZE 0 METADATA TABLES SIZE 1508872 METADATA[op_call] = 5892 METADATA[op_call_eval] = 0 METADATA[op_call_varargs] = 25 METADATA[op_tail_call_varargs] = 8 METADATA[op_tail_call_forward_arguments] = 3 METADATA[op_construct] = 375 METADATA[op_construct_varargs] = 0 METADATA[op_get_argument] = 14 METADATA[op_jneq_ptr] = 327 METADATA[op_new_object] = 118 METADATA[op_resolve_scope] = 5212 METADATA[op_get_from_scope] = 5376 METADATA[op_put_to_scope] = 245 METADATA[op_get_from_arguments] = 22 METADATA[op_in_by_val] = 30 METADATA[op_new_array] = 180 METADATA[op_get_by_id] = 6966 METADATA[op_get_by_id_with_this] = 0 METADATA[op_get_by_val_with_this] = 0 METADATA[op_catch] = 66 METADATA[op_get_by_id_direct] = 9 METADATA[op_try_get_by_id] = 26 METADATA[op_put_by_id] = 1774 METADATA[op_tail_call] = 56 METADATA[op_profile_type] = 0 METADATA[op_profile_control_flow] = 0 METADATA[op_mul] = 24 METADATA[op_has_indexed_property] = 18 METADATA[op_get_by_val] = 677 METADATA[op_put_by_val] = 171 METADATA[op_get_direct_pname] = 61 METADATA[op_div] = 10 METADATA[op_put_by_val_direct] = 26 METADATA[op_sub] = 118 METADATA[op_bitand] = 60 METADATA[op_bitor] = 44 METADATA[op_bitxor] = 10 METADATA[op_to_object] = 16 METADATA[op_to_number] = 89 METADATA[op_negate] = 16 METADATA[op_bitnot] = 4 METADATA[op_new_array_with_size] = 23 METADATA[op_new_array_buffer] = 9 METADATA[op_create_this] = 174 METADATA[op_to_this] = 961 METADATA[op_add] = 405
Yusuke Suzuki
Comment 2
2019-05-16 20:41:57 PDT
1. CodeBlock is eventually destroyed, and MetadataTable is also destroyed. But anyway, we still have 7000 - 8000 live MetadataTable. 2. But UnlinkedCodeBlock lives so long), and UnlinkedMetadata too (21979 - 24727. 3. So many CodeBlock holds MetadataTable. Many meaningful bytecode requires metadata and it means that all the UnlinkedCodeBlock with UnlinkedMetadata holds offset table, which takes basically about 200B at least. 4. Even after full GC happens, 7000 - 8000 MetadataTable exists, and about 24000 UnlinkedMetadataTable exists. At this point, it takes 14MB. WebKit MetadataTable_0x10f511000 227.0M 51.7M 33.3M 0K 25392 14.0M 19.2M 58% 45
Yusuke Suzuki
Comment 3
2019-05-16 20:46:19 PDT
WebKit InstructionStream_0x10f557000 180.0M 43.1M 23.6M 0K 25451 24.1M 0K 0% 33 InstructionStream takes 24MB. It is also very large.
Yusuke Suzuki
Comment 4
2019-05-16 21:10:09 PDT
(In reply to Yusuke Suzuki from
comment #2
)
> 1. CodeBlock is eventually destroyed, and MetadataTable is also destroyed. > But anyway, we still have 7000 - 8000 live MetadataTable. > 2. But UnlinkedCodeBlock lives so long), and UnlinkedMetadata too (21979 - > 24727. > 3. So many CodeBlock holds MetadataTable. Many meaningful bytecode requires > metadata and it means that all the UnlinkedCodeBlock with UnlinkedMetadata > holds offset table, which takes basically about 200B at least. > 4. Even after full GC happens, 7000 - 8000 MetadataTable exists, and about > 24000 UnlinkedMetadataTable exists. At this point, it takes 14MB. > > > WebKit MetadataTable_0x10f511000 227.0M > 51.7M 33.3M 0K 25392 14.0M 19.2M 58% 45
In Gmail, shrinking Metadata means, 1. Peak footprint can be significantly decrease. At peak, MetadataTable eats sooooo much bytes (30MB - 50MB, sometimes 70MB). 2. After full GC happens, still we get memory improvement by shrinking Metadata, but it could be 200KB ~ 1MB. But "just after full GC" is almost the time where the effect of this improvement becomes minimum. 3. Shrinking UnlinkedMetadataTable's offset table could offer significant improvement in Gmail's stable memory given that massive # of UnlinkedMetadataTable (24727). 4. We could significant improvement in RAMification.
Yusuke Suzuki
Comment 5
2019-05-16 23:15:45 PDT
And Instruction Opcode histogram is coming now :)
Tadeu Zagallo
Comment 6
2019-05-16 23:53:17 PDT
Nice, this data is great! A few ideas that I’ve had before: - Merge op_resolve_scope and op_get_from_scope - Add a 16-bit intermediate instruction size (I might try this soon, shouldn’t be too hard) - Making the offsets 16-bit and make all metadata entries pointer-aligned. I believe the only metadata entry that would increase in size would be op_jneq_ptr, which should be fine since in your example it would mean adding 45k in total due to the MetadataTables and reducing 84 bytes for each UnlinkedMetadataTable, which should be a net 1.75mb improvement.
Yusuke Suzuki
Comment 7
2019-05-17 00:20:15 PDT
(In reply to Tadeu Zagallo from
comment #6
)
> Nice, this data is great! A few ideas that I’ve had before:
Thanks!
> > - Merge op_resolve_scope and op_get_from_scope
Agreed. It can save much memory actually!
> - Add a 16-bit intermediate instruction size (I might try this soon, > shouldn’t be too hard)
Right! I think this is promising if wide opcodes are enough. I discussed with Saam about adding something like op_wide2 (the name is super bad, maybe, op_wide16 and op_wide32 would be clear) and I believe almost all the opcodes can fit in this. I'm now measuring the distribution of opcodes in Gmail to get the information about op_wide version v.s. narrow version to see whether we should introduce uint16_t version op. If Gmail has enough wide op and seems profitable, I think we could cut some memory.
> - Making the offsets 16-bit and make all metadata entries pointer-aligned. I > believe the only metadata entry that would increase in size would be > op_jneq_ptr, which should be fine since in your example it would mean adding > 45k in total due to the MetadataTables and reducing 84 bytes for each > UnlinkedMetadataTable, which should be a net 1.75mb improvement.
Yeah! Currently, I have two ideas about this. 1. Using uint16_t offset table, and using UINT16_MAX as a marker. When LLInt see UINT16_MAX in the offset table, it gets the real offset from uint32_t version offset table. I believe almost all the offset table should be within uint16_t version. Then, our change for the hot path is just adding branch with UINT16_MAX. And if we gets uint32_t version offset table, it means that metadata table is larger than 64KB... Then, adding another ~200B would not matter much. offset = uint16OffsetTable[opcode] if (offset == UINT16_MAX) { // slow path! offset = uint32OffsetTable[opcode] } metadata = (SomeOp::Metadata*)table[offset] + id 2. Adding another index to metadata id in bytecode, compact metadata table to the opcodes which actually exists. I'm currently doing (1) thing. And I'm also shrinking bunch of metadata. For metadata shrinking, one idea we discussed is that dropping OSRExit recording Value from the ValueProfile. Most of CodeBlock won't become DFG / FTL. This OSRExit recording is just wasting memory in Baseline and LLInt. If CodeBlock gets DFG / FTL, (1) we should allocate side data for this OSRExit recording Value or (2) updating prediction very eagerly in OSR exit not to record the value. I'll also upload the current metadata shrinking patch here. I think this gets RAMification improvement at least.
Yusuke Suzuki
Comment 8
2019-05-17 00:37:56 PDT
Then, it's show time! The highlights. 1. Incredible amount of op_get_from_scope / op_put_to_scope / op_resolve_scope become wide 2. op_new_func_exp 3. op_get_by_id 4. op_put_by_id and op_put_by_val_direct (direct one is, maybe, derived from object literal) 5. op_mov gets wide considerably # Just after loading all the content UNLINKED METADATA TABLES 22571 METADATA TABLES 23984 METADATA TABLES SIZE 46067176 METADATA[op_call] = 139485 METADATA[op_call_eval] = 3 METADATA[op_call_varargs] = 262 METADATA[op_tail_call_varargs] = 15 METADATA[op_tail_call_forward_arguments] = 24 METADATA[op_construct] = 8918 METADATA[op_construct_varargs] = 0 METADATA[op_get_argument] = 43 METADATA[op_jneq_ptr] = 6611 METADATA[op_new_object] = 10613 METADATA[op_resolve_scope] = 274514 METADATA[op_get_from_scope] = 243538 METADATA[op_put_to_scope] = 70053 METADATA[op_get_from_arguments] = 343 METADATA[op_in_by_val] = 217 METADATA[op_new_array] = 10991 METADATA[op_get_by_id] = 150808 METADATA[op_get_by_id_with_this] = 0 METADATA[op_get_by_val_with_this] = 0 METADATA[op_catch] = 3304 METADATA[op_get_by_id_direct] = 84 METADATA[op_try_get_by_id] = 116 METADATA[op_put_by_id] = 106847 METADATA[op_tail_call] = 503 METADATA[op_profile_type] = 0 METADATA[op_profile_control_flow] = 0 METADATA[op_mul] = 352 METADATA[op_has_indexed_property] = 277 METADATA[op_get_by_val] = 7354 METADATA[op_put_by_val] = 5600 METADATA[op_get_direct_pname] = 363 METADATA[op_div] = 147 METADATA[op_put_by_val_direct] = 15230 METADATA[op_sub] = 1066 METADATA[op_bitand] = 435 METADATA[op_bitor] = 358 METADATA[op_bitxor] = 187 METADATA[op_to_object] = 57 METADATA[op_to_number] = 545 METADATA[op_negate] = 59 METADATA[op_bitnot] = 32 METADATA[op_new_array_with_size] = 96 METADATA[op_new_array_buffer] = 7159 METADATA[op_create_this] = 3572 METADATA[op_to_this] = 6822 METADATA[op_add] = 3969 UnlinkedCodeBlocks 0, InstructionStream bytes 20029724 OPCODE[op_call] = narrow: 101846, wide: 32539 OPCODE[op_call_eval] = narrow: 3, wide: 0 OPCODE[op_call_varargs] = narrow: 240, wide: 0 OPCODE[op_tail_call_varargs] = narrow: 9, wide: 0 OPCODE[op_tail_call_forward_arguments] = narrow: 1, wide: 0 OPCODE[op_construct] = narrow: 7702, wide: 717 OPCODE[op_construct_varargs] = narrow: 0, wide: 0 OPCODE[op_get_argument] = narrow: 15, wide: 0 OPCODE[op_jneq_ptr] = narrow: 2744, wide: 0 OPCODE[op_new_object] = narrow: 5031, wide: 4766 OPCODE[op_resolve_scope] = narrow: 105981, wide: 154335 OPCODE[op_get_from_scope] = narrow: 110472, wide: 119406 OPCODE[op_put_to_scope] = narrow: 14594, wide: 49504 OPCODE[op_get_from_arguments] = narrow: 290, wide: 0 OPCODE[op_in_by_val] = narrow: 163, wide: 0 OPCODE[op_new_array] = narrow: 4709, wide: 6019 OPCODE[op_get_by_id] = narrow: 106657, wide: 36062 OPCODE[op_get_by_id_with_this] = narrow: 0, wide: 0 OPCODE[op_get_by_val_with_this] = narrow: 0, wide: 0 OPCODE[op_catch] = narrow: 2714, wide: 504 OPCODE[op_get_by_id_direct] = narrow: 14, wide: 0 OPCODE[op_try_get_by_id] = narrow: 16, wide: 0 OPCODE[op_put_by_id] = narrow: 38532, wide: 61572 OPCODE[op_tail_call] = narrow: 288, wide: 0 OPCODE[op_profile_type] = narrow: 0, wide: 0 OPCODE[op_profile_control_flow] = narrow: 0, wide: 0 OPCODE[op_mul] = narrow: 298, wide: 14 OPCODE[op_has_indexed_property] = narrow: 251, wide: 0 OPCODE[op_get_by_val] = narrow: 6392, wide: 395 OPCODE[op_put_by_val] = narrow: 2288, wide: 2416 OPCODE[op_get_direct_pname] = narrow: 0, wide: 317 OPCODE[op_div] = narrow: 143, wide: 2 OPCODE[op_put_by_val_direct] = narrow: 294, wide: 14787 OPCODE[op_sub] = narrow: 926, wide: 6 OPCODE[op_bitand] = narrow: 431, wide: 0 OPCODE[op_bitor] = narrow: 321, wide: 3 OPCODE[op_bitxor] = narrow: 185, wide: 1 OPCODE[op_to_object] = narrow: 13, wide: 0 OPCODE[op_to_number] = narrow: 459, wide: 0 OPCODE[op_negate] = narrow: 52, wide: 0 OPCODE[op_bitnot] = narrow: 32, wide: 0 OPCODE[op_new_array_with_size] = narrow: 66, wide: 0 OPCODE[op_new_array_buffer] = narrow: 638, wide: 6209 OPCODE[op_create_this] = narrow: 3315, wide: 0 OPCODE[op_to_this] = narrow: 6481, wide: 0 OPCODE[op_add] = narrow: 3770, wide: 24 OPCODE[op_typeof] = narrow: 141, wide: 0 OPCODE[op_is_cell_with_type] = narrow: 45, wide: 0 OPCODE[op_in_by_id] = narrow: 52, wide: 11 OPCODE[op_put_by_id_with_this] = narrow: 0, wide: 0 OPCODE[op_del_by_id] = narrow: 77, wide: 0 OPCODE[op_put_by_val_with_this] = narrow: 0, wide: 0 OPCODE[op_del_by_val] = narrow: 123, wide: 0 OPCODE[op_put_getter_by_id] = narrow: 0, wide: 0 OPCODE[op_put_setter_by_id] = narrow: 0, wide: 0 OPCODE[op_put_getter_setter_by_id] = narrow: 6, wide: 2 OPCODE[op_put_getter_by_val] = narrow: 0, wide: 0 OPCODE[op_put_setter_by_val] = narrow: 0, wide: 0 OPCODE[op_define_data_property] = narrow: 0, wide: 0 OPCODE[op_define_accessor_property] = narrow: 0, wide: 0 OPCODE[op_jmp] = narrow: 17540, wide: 3051 OPCODE[op_jtrue] = narrow: 10933, wide: 259 OPCODE[op_jfalse] = narrow: 21853, wide: 162 OPCODE[op_jeq_null] = narrow: 458, wide: 123 OPCODE[op_jneq_null] = narrow: 223, wide: 1 OPCODE[op_jeq] = narrow: 756, wide: 12 OPCODE[op_jstricteq] = narrow: 483, wide: 0 OPCODE[op_jneq] = narrow: 1770, wide: 7 OPCODE[op_jnstricteq] = narrow: 673, wide: 8 OPCODE[op_jless] = narrow: 1058, wide: 363 OPCODE[op_jlesseq] = narrow: 104, wide: 28 OPCODE[op_jgreater] = narrow: 119, wide: 16 OPCODE[op_jgreatereq] = narrow: 21, wide: 2 OPCODE[op_jnless] = narrow: 1929, wide: 0 OPCODE[op_jnlesseq] = narrow: 270, wide: 5 OPCODE[op_jngreater] = narrow: 375, wide: 4 OPCODE[op_wide] = narrow: 0, wide: 0 OPCODE[op_jbelow] = narrow: 0, wide: 0 OPCODE[op_jbeloweq] = narrow: 1, wide: 0 OPCODE[op_loop_hint] = narrow: 3123, wide: 0 OPCODE[op_switch_imm] = narrow: 184, wide: 0 OPCODE[op_switch_char] = narrow: 10, wide: 0 OPCODE[op_switch_string] = narrow: 31, wide: 0 OPCODE[op_new_func] = narrow: 937, wide: 0 OPCODE[op_new_func_exp] = narrow: 16103, wide: 66965 OPCODE[op_new_generator_func] = narrow: 0, wide: 0 OPCODE[op_new_generator_func_exp] = narrow: 0, wide: 0 OPCODE[op_new_async_func] = narrow: 0, wide: 0 OPCODE[op_new_async_func_exp] = narrow: 0, wide: 0 OPCODE[op_new_async_generator_func] = narrow: 0, wide: 0 OPCODE[op_new_async_generator_func_exp] = narrow: 0, wide: 0 OPCODE[op_set_function_name] = narrow: 0, wide: 0 OPCODE[op_ret] = narrow: 26362, wide: 4 OPCODE[op_strcat] = narrow: 702, wide: 0 OPCODE[op_to_primitive] = narrow: 2007, wide: 0 OPCODE[op_put_to_arguments] = narrow: 8, wide: 0 OPCODE[op_push_with_scope] = narrow: 0, wide: 0 OPCODE[op_create_lexical_environment] = narrow: 2063, wide: 0 OPCODE[op_create_generator_frame_environment] = narrow: 0, wide: 0 OPCODE[op_get_parent_scope] = narrow: 5, wide: 0 OPCODE[op_throw] = narrow: 1075, wide: 1 OPCODE[op_throw_static_error] = narrow: 639, wide: 0 OPCODE[op_debug] = narrow: 0, wide: 0 OPCODE[op_end] = narrow: 233, wide: 0 OPCODE[op_get_enumerable_length] = narrow: 251, wide: 0 OPCODE[op_has_structure_property] = narrow: 251, wide: 0 OPCODE[op_has_generic_property] = narrow: 251, wide: 0 OPCODE[op_get_property_enumerator] = narrow: 251, wide: 0 OPCODE[op_enumerator_structure_pname] = narrow: 502, wide: 0 OPCODE[op_enumerator_generic_pname] = narrow: 502, wide: 0 OPCODE[op_to_index_string] = narrow: 251, wide: 0 OPCODE[op_unreachable] = narrow: 0, wide: 0 OPCODE[op_create_rest] = narrow: 0, wide: 0 OPCODE[op_get_rest_length] = narrow: 0, wide: 0 OPCODE[op_yield] = narrow: 0, wide: 0 OPCODE[op_check_traps] = narrow: 26056, wide: 0 OPCODE[op_log_shadow_chicken_prologue] = narrow: 0, wide: 0 OPCODE[op_log_shadow_chicken_tail] = narrow: 0, wide: 0 OPCODE[op_resolve_scope_for_hoisting_func_decl_in_eval] = narrow: 0, wide: 0 OPCODE[op_nop] = narrow: 48, wide: 0 OPCODE[op_super_sampler_begin] = narrow: 0, wide: 0 OPCODE[op_super_sampler_end] = narrow: 0, wide: 0 OPCODE[op_jngreatereq] = narrow: 138, wide: 0 OPCODE[op_enter] = narrow: 22933, wide: 0 OPCODE[op_get_scope] = narrow: 22933, wide: 0 OPCODE[op_create_direct_arguments] = narrow: 212, wide: 0 OPCODE[op_create_scoped_arguments] = narrow: 13, wide: 0 OPCODE[op_create_cloned_arguments] = narrow: 24, wide: 0 OPCODE[op_argument_count] = narrow: 2, wide: 0 OPCODE[op_check_tdz] = narrow: 26, wide: 0 OPCODE[op_new_array_with_spread] = narrow: 0, wide: 0 OPCODE[op_spread] = narrow: 0, wide: 0 OPCODE[op_new_regexp] = narrow: 962, wide: 628 OPCODE[op_mov] = narrow: 286218, wide: 16372 OPCODE[op_eq] = narrow: 1330, wide: 0 OPCODE[op_neq] = narrow: 689, wide: 0 OPCODE[op_stricteq] = narrow: 1104, wide: 1 OPCODE[op_nstricteq] = narrow: 349, wide: 4 OPCODE[op_less] = narrow: 665, wide: 1 OPCODE[op_lesseq] = narrow: 170, wide: 4 OPCODE[op_greater] = narrow: 181, wide: 1 OPCODE[op_greatereq] = narrow: 65, wide: 0 OPCODE[op_below] = narrow: 0, wide: 0 OPCODE[op_beloweq] = narrow: 0, wide: 0 OPCODE[op_mod] = narrow: 70, wide: 0 OPCODE[op_pow] = narrow: 0, wide: 0 OPCODE[op_lshift] = narrow: 153, wide: 0 OPCODE[op_rshift] = narrow: 82, wide: 0 OPCODE[op_urshift] = narrow: 149, wide: 2 OPCODE[op_eq_null] = narrow: 614, wide: 0 OPCODE[op_neq_null] = narrow: 632, wide: 0 OPCODE[op_to_string] = narrow: 14, wide: 0 OPCODE[op_unsigned] = narrow: 149, wide: 0 OPCODE[op_is_empty] = narrow: 6, wide: 0 OPCODE[op_is_undefined] = narrow: 274, wide: 0 OPCODE[op_is_undefined_or_null] = narrow: 10, wide: 0 OPCODE[op_is_boolean] = narrow: 5, wide: 0 OPCODE[op_is_number] = narrow: 48, wide: 0 OPCODE[op_is_object] = narrow: 603, wide: 0 OPCODE[op_is_object_or_null] = narrow: 166, wide: 0 OPCODE[op_is_function] = narrow: 221, wide: 0 OPCODE[op_inc] = narrow: 2788, wide: 0 OPCODE[op_dec] = narrow: 267, wide: 0 OPCODE[op_not] = narrow: 2950, wide: 3 OPCODE[op_identity_with_profile] = narrow: 0, wide: 0 OPCODE[op_overrides_has_instance] = narrow: 573, wide: 0 OPCODE[op_instanceof] = narrow: 573, wide: 0 OPCODE[op_instanceof_custom] = narrow: 573, wide: 0 OPCODE[handleUncaughtException] = narrow: 0, wide: 0 OPCODE[llint_eval_prologue] = narrow: 0, wide: 0 OPCODE[llint_module_program_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_call_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_construct_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_call_arity_check] = narrow: 0, wide: 0 OPCODE[llint_function_for_construct_arity_check] = narrow: 0, wide: 0 OPCODE[llint_generic_return_point] = narrow: 0, wide: 0 OPCODE[llint_throw_from_slow_path_trampoline] = narrow: 0, wide: 0 OPCODE[llint_throw_during_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_native_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_native_construct_trampoline] = narrow: 0, wide: 0 OPCODE[llint_internal_function_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_internal_function_construct_trampoline] = narrow: 0, wide: 0 OPCODE[llint_program_prologue] = narrow: 0, wide: 0 # Wait for several seconds after loading all the content. UNLINKED METADATA TABLES 23664 METADATA TABLES 7490 METADATA TABLES SIZE 12497564 METADATA[op_call] = 37536 METADATA[op_call_eval] = 2 METADATA[op_call_varargs] = 75 METADATA[op_tail_call_varargs] = 14 METADATA[op_tail_call_forward_arguments] = 4 METADATA[op_construct] = 2433 METADATA[op_construct_varargs] = 0 METADATA[op_get_argument] = 22 METADATA[op_jneq_ptr] = 1097 METADATA[op_new_object] = 6015 METADATA[op_resolve_scope] = 74163 METADATA[op_get_from_scope] = 61704 METADATA[op_put_to_scope] = 15647 METADATA[op_get_from_arguments] = 93 METADATA[op_in_by_val] = 68 METADATA[op_new_array] = 5908 METADATA[op_get_by_id] = 38998 METADATA[op_get_by_id_with_this] = 0 METADATA[op_get_by_val_with_this] = 0 METADATA[op_catch] = 449 METADATA[op_get_by_id_direct] = 34 METADATA[op_try_get_by_id] = 47 METADATA[op_put_by_id] = 31268 METADATA[op_tail_call] = 167 METADATA[op_profile_type] = 0 METADATA[op_profile_control_flow] = 0 METADATA[op_mul] = 99 METADATA[op_has_indexed_property] = 83 METADATA[op_get_by_val] = 2572 METADATA[op_put_by_val] = 2879 METADATA[op_get_direct_pname] = 158 METADATA[op_div] = 59 METADATA[op_put_by_val_direct] = 13605 METADATA[op_sub] = 395 METADATA[op_bitand] = 318 METADATA[op_bitor] = 225 METADATA[op_bitxor] = 167 METADATA[op_to_object] = 31 METADATA[op_to_number] = 243 METADATA[op_negate] = 32 METADATA[op_bitnot] = 28 METADATA[op_new_array_with_size] = 70 METADATA[op_new_array_buffer] = 4903 METADATA[op_create_this] = 568 METADATA[op_to_this] = 2489 METADATA[op_add] = 1438 UnlinkedCodeBlocks 0, InstructionStream bytes 20280076 OPCODE[op_call] = narrow: 108233, wide: 32539 OPCODE[op_call_eval] = narrow: 3, wide: 0 OPCODE[op_call_varargs] = narrow: 249, wide: 0 OPCODE[op_tail_call_varargs] = narrow: 9, wide: 0 OPCODE[op_tail_call_forward_arguments] = narrow: 1, wide: 0 OPCODE[op_construct] = narrow: 7965, wide: 717 OPCODE[op_construct_varargs] = narrow: 0, wide: 0 OPCODE[op_get_argument] = narrow: 15, wide: 0 OPCODE[op_jneq_ptr] = narrow: 2826, wide: 0 OPCODE[op_new_object] = narrow: 5261, wide: 4766 OPCODE[op_resolve_scope] = narrow: 113766, wide: 154335 OPCODE[op_get_from_scope] = narrow: 118040, wide: 119406 OPCODE[op_put_to_scope] = narrow: 15365, wide: 49504 OPCODE[op_get_from_arguments] = narrow: 295, wide: 0 OPCODE[op_in_by_val] = narrow: 165, wide: 0 OPCODE[op_new_array] = narrow: 4958, wide: 6019 OPCODE[op_get_by_id] = narrow: 110983, wide: 36062 OPCODE[op_get_by_id_with_this] = narrow: 0, wide: 0 OPCODE[op_get_by_val_with_this] = narrow: 0, wide: 0 OPCODE[op_catch] = narrow: 2743, wide: 504 OPCODE[op_get_by_id_direct] = narrow: 16, wide: 0 OPCODE[op_try_get_by_id] = narrow: 16, wide: 0 OPCODE[op_put_by_id] = narrow: 40272, wide: 61573 OPCODE[op_tail_call] = narrow: 289, wide: 0 OPCODE[op_profile_type] = narrow: 0, wide: 0 OPCODE[op_profile_control_flow] = narrow: 0, wide: 0 OPCODE[op_mul] = narrow: 308, wide: 14 OPCODE[op_has_indexed_property] = narrow: 257, wide: 0 OPCODE[op_get_by_val] = narrow: 6622, wide: 400 OPCODE[op_put_by_val] = narrow: 2337, wide: 2416 OPCODE[op_get_direct_pname] = narrow: 0, wide: 322 OPCODE[op_div] = narrow: 155, wide: 2 OPCODE[op_put_by_val_direct] = narrow: 442, wide: 14787 OPCODE[op_sub] = narrow: 956, wide: 6 OPCODE[op_bitand] = narrow: 449, wide: 0 OPCODE[op_bitor] = narrow: 338, wide: 3 OPCODE[op_bitxor] = narrow: 194, wide: 1 OPCODE[op_to_object] = narrow: 13, wide: 0 OPCODE[op_to_number] = narrow: 476, wide: 0 OPCODE[op_negate] = narrow: 52, wide: 0 OPCODE[op_bitnot] = narrow: 32, wide: 0 OPCODE[op_new_array_with_size] = narrow: 69, wide: 0 OPCODE[op_new_array_buffer] = narrow: 649, wide: 6209 OPCODE[op_create_this] = narrow: 3438, wide: 0 OPCODE[op_to_this] = narrow: 6795, wide: 0 OPCODE[op_add] = narrow: 3846, wide: 24 OPCODE[op_typeof] = narrow: 144, wide: 0 OPCODE[op_is_cell_with_type] = narrow: 45, wide: 0 OPCODE[op_in_by_id] = narrow: 54, wide: 11 OPCODE[op_put_by_id_with_this] = narrow: 0, wide: 0 OPCODE[op_del_by_id] = narrow: 77, wide: 0 OPCODE[op_put_by_val_with_this] = narrow: 0, wide: 0 OPCODE[op_del_by_val] = narrow: 130, wide: 0 OPCODE[op_put_getter_by_id] = narrow: 0, wide: 0 OPCODE[op_put_setter_by_id] = narrow: 0, wide: 0 OPCODE[op_put_getter_setter_by_id] = narrow: 6, wide: 2 OPCODE[op_put_getter_by_val] = narrow: 0, wide: 0 OPCODE[op_put_setter_by_val] = narrow: 0, wide: 0 OPCODE[op_define_data_property] = narrow: 0, wide: 0 OPCODE[op_define_accessor_property] = narrow: 0, wide: 0 OPCODE[op_jmp] = narrow: 18041, wide: 3064 OPCODE[op_jtrue] = narrow: 11203, wide: 274 OPCODE[op_jfalse] = narrow: 22670, wide: 162 OPCODE[op_jeq_null] = narrow: 520, wide: 123 OPCODE[op_jneq_null] = narrow: 234, wide: 1 OPCODE[op_jeq] = narrow: 782, wide: 12 OPCODE[op_jstricteq] = narrow: 489, wide: 0 OPCODE[op_jneq] = narrow: 1827, wide: 7 OPCODE[op_jnstricteq] = narrow: 678, wide: 8 OPCODE[op_jless] = narrow: 1104, wide: 375 OPCODE[op_jlesseq] = narrow: 107, wide: 29 OPCODE[op_jgreater] = narrow: 126, wide: 18 OPCODE[op_jgreatereq] = narrow: 23, wide: 2 OPCODE[op_jnless] = narrow: 2012, wide: 0 OPCODE[op_jnlesseq] = narrow: 275, wide: 5 OPCODE[op_jngreater] = narrow: 395, wide: 4 OPCODE[op_wide] = narrow: 0, wide: 0 OPCODE[op_jbelow] = narrow: 0, wide: 0 OPCODE[op_jbeloweq] = narrow: 2, wide: 0 OPCODE[op_loop_hint] = narrow: 3261, wide: 0 OPCODE[op_switch_imm] = narrow: 197, wide: 0 OPCODE[op_switch_char] = narrow: 10, wide: 0 OPCODE[op_switch_string] = narrow: 32, wide: 0 OPCODE[op_new_func] = narrow: 937, wide: 0 OPCODE[op_new_func_exp] = narrow: 16595, wide: 66965 OPCODE[op_new_generator_func] = narrow: 0, wide: 0 OPCODE[op_new_generator_func_exp] = narrow: 0, wide: 0 OPCODE[op_new_async_func] = narrow: 0, wide: 0 OPCODE[op_new_async_func_exp] = narrow: 0, wide: 0 OPCODE[op_new_async_generator_func] = narrow: 0, wide: 0 OPCODE[op_new_async_generator_func_exp] = narrow: 0, wide: 0 OPCODE[op_set_function_name] = narrow: 0, wide: 0 OPCODE[op_ret] = narrow: 27628, wide: 5 OPCODE[op_strcat] = narrow: 711, wide: 0 OPCODE[op_to_primitive] = narrow: 2027, wide: 0 OPCODE[op_put_to_arguments] = narrow: 8, wide: 0 OPCODE[op_push_with_scope] = narrow: 0, wide: 0 OPCODE[op_create_lexical_environment] = narrow: 2179, wide: 0 OPCODE[op_create_generator_frame_environment] = narrow: 0, wide: 0 OPCODE[op_get_parent_scope] = narrow: 5, wide: 0 OPCODE[op_throw] = narrow: 1123, wide: 1 OPCODE[op_throw_static_error] = narrow: 649, wide: 0 OPCODE[op_debug] = narrow: 0, wide: 0 OPCODE[op_end] = narrow: 234, wide: 0 OPCODE[op_get_enumerable_length] = narrow: 257, wide: 0 OPCODE[op_has_structure_property] = narrow: 257, wide: 0 OPCODE[op_has_generic_property] = narrow: 257, wide: 0 OPCODE[op_get_property_enumerator] = narrow: 257, wide: 0 OPCODE[op_enumerator_structure_pname] = narrow: 514, wide: 0 OPCODE[op_enumerator_generic_pname] = narrow: 514, wide: 0 OPCODE[op_to_index_string] = narrow: 257, wide: 0 OPCODE[op_unreachable] = narrow: 0, wide: 0 OPCODE[op_create_rest] = narrow: 0, wide: 0 OPCODE[op_get_rest_length] = narrow: 0, wide: 0 OPCODE[op_yield] = narrow: 0, wide: 0 OPCODE[op_check_traps] = narrow: 27295, wide: 0 OPCODE[op_log_shadow_chicken_prologue] = narrow: 0, wide: 0 OPCODE[op_log_shadow_chicken_tail] = narrow: 0, wide: 0 OPCODE[op_resolve_scope_for_hoisting_func_decl_in_eval] = narrow: 0, wide: 0 OPCODE[op_nop] = narrow: 48, wide: 0 OPCODE[op_super_sampler_begin] = narrow: 0, wide: 0 OPCODE[op_super_sampler_end] = narrow: 0, wide: 0 OPCODE[op_jngreatereq] = narrow: 142, wide: 0 OPCODE[op_enter] = narrow: 24034, wide: 0 OPCODE[op_get_scope] = narrow: 24034, wide: 0 OPCODE[op_create_direct_arguments] = narrow: 220, wide: 0 OPCODE[op_create_scoped_arguments] = narrow: 13, wide: 0 OPCODE[op_create_cloned_arguments] = narrow: 24, wide: 0 OPCODE[op_argument_count] = narrow: 2, wide: 0 OPCODE[op_check_tdz] = narrow: 26, wide: 0 OPCODE[op_new_array_with_spread] = narrow: 0, wide: 0 OPCODE[op_spread] = narrow: 0, wide: 0 OPCODE[op_new_regexp] = narrow: 970, wide: 628 OPCODE[op_mov] = narrow: 296231, wide: 16456 OPCODE[op_eq] = narrow: 1357, wide: 0 OPCODE[op_neq] = narrow: 705, wide: 0 OPCODE[op_stricteq] = narrow: 1133, wide: 1 OPCODE[op_nstricteq] = narrow: 352, wide: 4 OPCODE[op_less] = narrow: 683, wide: 1 OPCODE[op_lesseq] = narrow: 178, wide: 4 OPCODE[op_greater] = narrow: 190, wide: 1 OPCODE[op_greatereq] = narrow: 73, wide: 0 OPCODE[op_below] = narrow: 0, wide: 0 OPCODE[op_beloweq] = narrow: 0, wide: 0 OPCODE[op_mod] = narrow: 71, wide: 0 OPCODE[op_pow] = narrow: 0, wide: 0 OPCODE[op_lshift] = narrow: 164, wide: 0 OPCODE[op_rshift] = narrow: 87, wide: 0 OPCODE[op_urshift] = narrow: 154, wide: 2 OPCODE[op_eq_null] = narrow: 632, wide: 0 OPCODE[op_neq_null] = narrow: 695, wide: 0 OPCODE[op_to_string] = narrow: 14, wide: 0 OPCODE[op_unsigned] = narrow: 152, wide: 0 OPCODE[op_is_empty] = narrow: 6, wide: 0 OPCODE[op_is_undefined] = narrow: 277, wide: 0 OPCODE[op_is_undefined_or_null] = narrow: 10, wide: 0 OPCODE[op_is_boolean] = narrow: 5, wide: 0 OPCODE[op_is_number] = narrow: 48, wide: 0 OPCODE[op_is_object] = narrow: 613, wide: 0 OPCODE[op_is_object_or_null] = narrow: 167, wide: 0 OPCODE[op_is_function] = narrow: 228, wide: 0 OPCODE[op_inc] = narrow: 2897, wide: 0 OPCODE[op_dec] = narrow: 276, wide: 0 OPCODE[op_not] = narrow: 3012, wide: 3 OPCODE[op_identity_with_profile] = narrow: 0, wide: 0 OPCODE[op_overrides_has_instance] = narrow: 582, wide: 0 OPCODE[op_instanceof] = narrow: 582, wide: 0 OPCODE[op_instanceof_custom] = narrow: 582, wide: 0 OPCODE[handleUncaughtException] = narrow: 0, wide: 0 OPCODE[llint_eval_prologue] = narrow: 0, wide: 0 OPCODE[llint_module_program_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_call_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_construct_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_call_arity_check] = narrow: 0, wide: 0 OPCODE[llint_function_for_construct_arity_check] = narrow: 0, wide: 0 OPCODE[llint_generic_return_point] = narrow: 0, wide: 0 OPCODE[llint_throw_from_slow_path_trampoline] = narrow: 0, wide: 0 OPCODE[llint_throw_during_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_native_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_native_construct_trampoline] = narrow: 0, wide: 0 OPCODE[llint_internal_function_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_internal_function_construct_trampoline] = narrow: 0, wide: 0 OPCODE[llint_program_prologue] = narrow: 0, wide: 0 # After Full GC UNLINKED METADATA TABLES 23804 METADATA TABLES 2430 METADATA TABLES SIZE 1513076 METADATA[op_call] = 5810 METADATA[op_call_eval] = 0 METADATA[op_call_varargs] = 33 METADATA[op_tail_call_varargs] = 12 METADATA[op_tail_call_forward_arguments] = 3 METADATA[op_construct] = 370 METADATA[op_construct_varargs] = 0 METADATA[op_get_argument] = 13 METADATA[op_jneq_ptr] = 349 METADATA[op_new_object] = 114 METADATA[op_resolve_scope] = 4920 METADATA[op_get_from_scope] = 5125 METADATA[op_put_to_scope] = 262 METADATA[op_get_from_arguments] = 33 METADATA[op_in_by_val] = 25 METADATA[op_new_array] = 182 METADATA[op_get_by_id] = 7375 METADATA[op_get_by_id_with_this] = 0 METADATA[op_get_by_val_with_this] = 0 METADATA[op_catch] = 93 METADATA[op_get_by_id_direct] = 14 METADATA[op_try_get_by_id] = 24 METADATA[op_put_by_id] = 1935 METADATA[op_tail_call] = 66 METADATA[op_profile_type] = 0 METADATA[op_profile_control_flow] = 0 METADATA[op_mul] = 32 METADATA[op_has_indexed_property] = 23 METADATA[op_get_by_val] = 678 METADATA[op_put_by_val] = 171 METADATA[op_get_direct_pname] = 65 METADATA[op_div] = 11 METADATA[op_put_by_val_direct] = 33 METADATA[op_sub] = 138 METADATA[op_bitand] = 72 METADATA[op_bitor] = 59 METADATA[op_bitxor] = 11 METADATA[op_to_object] = 14 METADATA[op_to_number] = 92 METADATA[op_negate] = 16 METADATA[op_bitnot] = 4 METADATA[op_new_array_with_size] = 18 METADATA[op_new_array_buffer] = 9 METADATA[op_create_this] = 177 METADATA[op_to_this] = 971 METADATA[op_add] = 279 UnlinkedCodeBlocks 0, InstructionStream bytes 20310026 OPCODE[op_call] = narrow: 109200, wide: 32539 OPCODE[op_call_eval] = narrow: 3, wide: 0 OPCODE[op_call_varargs] = narrow: 249, wide: 0 OPCODE[op_tail_call_varargs] = narrow: 9, wide: 0 OPCODE[op_tail_call_forward_arguments] = narrow: 1, wide: 0 OPCODE[op_construct] = narrow: 7984, wide: 717 OPCODE[op_construct_varargs] = narrow: 0, wide: 0 OPCODE[op_get_argument] = narrow: 15, wide: 0 OPCODE[op_jneq_ptr] = narrow: 2834, wide: 0 OPCODE[op_new_object] = narrow: 5267, wide: 4766 OPCODE[op_resolve_scope] = narrow: 114611, wide: 154335 OPCODE[op_get_from_scope] = narrow: 118944, wide: 119406 OPCODE[op_put_to_scope] = narrow: 15410, wide: 49504 OPCODE[op_get_from_arguments] = narrow: 295, wide: 0 OPCODE[op_in_by_val] = narrow: 165, wide: 0 OPCODE[op_new_array] = narrow: 4990, wide: 6019 OPCODE[op_get_by_id] = narrow: 111780, wide: 36062 OPCODE[op_get_by_id_with_this] = narrow: 0, wide: 0 OPCODE[op_get_by_val_with_this] = narrow: 0, wide: 0 OPCODE[op_catch] = narrow: 2746, wide: 504 OPCODE[op_get_by_id_direct] = narrow: 16, wide: 0 OPCODE[op_try_get_by_id] = narrow: 16, wide: 0 OPCODE[op_put_by_id] = narrow: 40320, wide: 61573 OPCODE[op_tail_call] = narrow: 289, wide: 0 OPCODE[op_profile_type] = narrow: 0, wide: 0 OPCODE[op_profile_control_flow] = narrow: 0, wide: 0 OPCODE[op_mul] = narrow: 308, wide: 14 OPCODE[op_has_indexed_property] = narrow: 257, wide: 0 OPCODE[op_get_by_val] = narrow: 6629, wide: 400 OPCODE[op_put_by_val] = narrow: 2338, wide: 2416 OPCODE[op_get_direct_pname] = narrow: 0, wide: 322 OPCODE[op_div] = narrow: 155, wide: 2 OPCODE[op_put_by_val_direct] = narrow: 442, wide: 14787 OPCODE[op_sub] = narrow: 963, wide: 6 OPCODE[op_bitand] = narrow: 456, wide: 0 OPCODE[op_bitor] = narrow: 338, wide: 3 OPCODE[op_bitxor] = narrow: 196, wide: 1 OPCODE[op_to_object] = narrow: 13, wide: 0 OPCODE[op_to_number] = narrow: 475, wide: 0 OPCODE[op_negate] = narrow: 53, wide: 0 OPCODE[op_bitnot] = narrow: 32, wide: 0 OPCODE[op_new_array_with_size] = narrow: 69, wide: 0 OPCODE[op_new_array_buffer] = narrow: 652, wide: 6209 OPCODE[op_create_this] = narrow: 3442, wide: 0 OPCODE[op_to_this] = narrow: 6848, wide: 0 OPCODE[op_add] = narrow: 3857, wide: 24 OPCODE[op_typeof] = narrow: 144, wide: 0 OPCODE[op_is_cell_with_type] = narrow: 45, wide: 0 OPCODE[op_in_by_id] = narrow: 54, wide: 11 OPCODE[op_put_by_id_with_this] = narrow: 0, wide: 0 OPCODE[op_del_by_id] = narrow: 77, wide: 0 OPCODE[op_put_by_val_with_this] = narrow: 0, wide: 0 OPCODE[op_del_by_val] = narrow: 130, wide: 0 OPCODE[op_put_getter_by_id] = narrow: 0, wide: 0 OPCODE[op_put_setter_by_id] = narrow: 0, wide: 0 OPCODE[op_put_getter_setter_by_id] = narrow: 6, wide: 2 OPCODE[op_put_getter_by_val] = narrow: 0, wide: 0 OPCODE[op_put_setter_by_val] = narrow: 0, wide: 0 OPCODE[op_define_data_property] = narrow: 0, wide: 0 OPCODE[op_define_accessor_property] = narrow: 0, wide: 0 OPCODE[op_jmp] = narrow: 18110, wide: 3066 OPCODE[op_jtrue] = narrow: 11271, wide: 280 OPCODE[op_jfalse] = narrow: 22804, wide: 162 OPCODE[op_jeq_null] = narrow: 527, wide: 123 OPCODE[op_jneq_null] = narrow: 235, wide: 1 OPCODE[op_jeq] = narrow: 782, wide: 12 OPCODE[op_jstricteq] = narrow: 490, wide: 0 OPCODE[op_jneq] = narrow: 1828, wide: 7 OPCODE[op_jnstricteq] = narrow: 679, wide: 8 OPCODE[op_jless] = narrow: 1111, wide: 377 OPCODE[op_jlesseq] = narrow: 107, wide: 29 OPCODE[op_jgreater] = narrow: 126, wide: 18 OPCODE[op_jgreatereq] = narrow: 23, wide: 2 OPCODE[op_jnless] = narrow: 2028, wide: 0 OPCODE[op_jnlesseq] = narrow: 277, wide: 5 OPCODE[op_jngreater] = narrow: 397, wide: 4 OPCODE[op_wide] = narrow: 0, wide: 0 OPCODE[op_jbelow] = narrow: 0, wide: 0 OPCODE[op_jbeloweq] = narrow: 2, wide: 0 OPCODE[op_loop_hint] = narrow: 3291, wide: 0 OPCODE[op_switch_imm] = narrow: 198, wide: 0 OPCODE[op_switch_char] = narrow: 10, wide: 0 OPCODE[op_switch_string] = narrow: 32, wide: 0 OPCODE[op_new_func] = narrow: 937, wide: 0 OPCODE[op_new_func_exp] = narrow: 16633, wide: 66965 OPCODE[op_new_generator_func] = narrow: 0, wide: 0 OPCODE[op_new_generator_func_exp] = narrow: 0, wide: 0 OPCODE[op_new_async_func] = narrow: 0, wide: 0 OPCODE[op_new_async_func_exp] = narrow: 0, wide: 0 OPCODE[op_new_async_generator_func] = narrow: 0, wide: 0 OPCODE[op_new_async_generator_func_exp] = narrow: 0, wide: 0 OPCODE[op_set_function_name] = narrow: 0, wide: 0 OPCODE[op_ret] = narrow: 27795, wide: 5 OPCODE[op_strcat] = narrow: 711, wide: 0 OPCODE[op_to_primitive] = narrow: 2027, wide: 0 OPCODE[op_put_to_arguments] = narrow: 8, wide: 0 OPCODE[op_push_with_scope] = narrow: 0, wide: 0 OPCODE[op_create_lexical_environment] = narrow: 2205, wide: 0 OPCODE[op_create_generator_frame_environment] = narrow: 0, wide: 0 OPCODE[op_get_parent_scope] = narrow: 5, wide: 0 OPCODE[op_throw] = narrow: 1128, wide: 1 OPCODE[op_throw_static_error] = narrow: 658, wide: 0 OPCODE[op_debug] = narrow: 0, wide: 0 OPCODE[op_end] = narrow: 207, wide: 0 OPCODE[op_get_enumerable_length] = narrow: 257, wide: 0 OPCODE[op_has_structure_property] = narrow: 257, wide: 0 OPCODE[op_has_generic_property] = narrow: 257, wide: 0 OPCODE[op_get_property_enumerator] = narrow: 257, wide: 0 OPCODE[op_enumerator_structure_pname] = narrow: 514, wide: 0 OPCODE[op_enumerator_generic_pname] = narrow: 514, wide: 0 OPCODE[op_to_index_string] = narrow: 257, wide: 0 OPCODE[op_unreachable] = narrow: 0, wide: 0 OPCODE[op_create_rest] = narrow: 0, wide: 0 OPCODE[op_get_rest_length] = narrow: 0, wide: 0 OPCODE[op_yield] = narrow: 0, wide: 0 OPCODE[op_check_traps] = narrow: 27457, wide: 0 OPCODE[op_log_shadow_chicken_prologue] = narrow: 0, wide: 0 OPCODE[op_log_shadow_chicken_tail] = narrow: 0, wide: 0 OPCODE[op_resolve_scope_for_hoisting_func_decl_in_eval] = narrow: 0, wide: 0 OPCODE[op_nop] = narrow: 48, wide: 0 OPCODE[op_super_sampler_begin] = narrow: 0, wide: 0 OPCODE[op_super_sampler_end] = narrow: 0, wide: 0 OPCODE[op_jngreatereq] = narrow: 146, wide: 0 OPCODE[op_enter] = narrow: 24166, wide: 0 OPCODE[op_get_scope] = narrow: 24166, wide: 0 OPCODE[op_create_direct_arguments] = narrow: 220, wide: 0 OPCODE[op_create_scoped_arguments] = narrow: 13, wide: 0 OPCODE[op_create_cloned_arguments] = narrow: 24, wide: 0 OPCODE[op_argument_count] = narrow: 2, wide: 0 OPCODE[op_check_tdz] = narrow: 26, wide: 0 OPCODE[op_new_array_with_spread] = narrow: 0, wide: 0 OPCODE[op_spread] = narrow: 0, wide: 0 OPCODE[op_new_regexp] = narrow: 969, wide: 628 OPCODE[op_mov] = narrow: 297265, wide: 16456 OPCODE[op_eq] = narrow: 1358, wide: 0 OPCODE[op_neq] = narrow: 707, wide: 0 OPCODE[op_stricteq] = narrow: 1138, wide: 1 OPCODE[op_nstricteq] = narrow: 353, wide: 4 OPCODE[op_less] = narrow: 685, wide: 1 OPCODE[op_lesseq] = narrow: 179, wide: 4 OPCODE[op_greater] = narrow: 191, wide: 1 OPCODE[op_greatereq] = narrow: 76, wide: 0 OPCODE[op_below] = narrow: 0, wide: 0 OPCODE[op_beloweq] = narrow: 0, wide: 0 OPCODE[op_mod] = narrow: 71, wide: 0 OPCODE[op_pow] = narrow: 0, wide: 0 OPCODE[op_lshift] = narrow: 164, wide: 0 OPCODE[op_rshift] = narrow: 87, wide: 0 OPCODE[op_urshift] = narrow: 154, wide: 2 OPCODE[op_eq_null] = narrow: 633, wide: 0 OPCODE[op_neq_null] = narrow: 698, wide: 0 OPCODE[op_to_string] = narrow: 14, wide: 0 OPCODE[op_unsigned] = narrow: 152, wide: 0 OPCODE[op_is_empty] = narrow: 6, wide: 0 OPCODE[op_is_undefined] = narrow: 277, wide: 0 OPCODE[op_is_undefined_or_null] = narrow: 10, wide: 0 OPCODE[op_is_boolean] = narrow: 5, wide: 0 OPCODE[op_is_number] = narrow: 48, wide: 0 OPCODE[op_is_object] = narrow: 622, wide: 0 OPCODE[op_is_object_or_null] = narrow: 167, wide: 0 OPCODE[op_is_function] = narrow: 229, wide: 0 OPCODE[op_inc] = narrow: 2909, wide: 0 OPCODE[op_dec] = narrow: 276, wide: 0 OPCODE[op_not] = narrow: 3021, wide: 3 OPCODE[op_identity_with_profile] = narrow: 0, wide: 0 OPCODE[op_overrides_has_instance] = narrow: 591, wide: 0 OPCODE[op_instanceof] = narrow: 591, wide: 0 OPCODE[op_instanceof_custom] = narrow: 591, wide: 0 OPCODE[handleUncaughtException] = narrow: 0, wide: 0 OPCODE[llint_eval_prologue] = narrow: 0, wide: 0 OPCODE[llint_module_program_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_call_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_construct_prologue] = narrow: 0, wide: 0 OPCODE[llint_function_for_call_arity_check] = narrow: 0, wide: 0 OPCODE[llint_function_for_construct_arity_check] = narrow: 0, wide: 0 OPCODE[llint_generic_return_point] = narrow: 0, wide: 0 OPCODE[llint_throw_from_slow_path_trampoline] = narrow: 0, wide: 0 OPCODE[llint_throw_during_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_native_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_native_construct_trampoline] = narrow: 0, wide: 0 OPCODE[llint_internal_function_call_trampoline] = narrow: 0, wide: 0 OPCODE[llint_internal_function_construct_trampoline] = narrow: 0, wide: 0 OPCODE[llint_program_prologue] = narrow: 0, wide: 0
Yusuke Suzuki
Comment 9
2019-05-17 00:55:24 PDT
Created
attachment 370108
[details]
Patch WIP, shrinking Metadata. I'll shrink OpCall one more 8 byte by embedding ArrayProfile into LLIntCallLinkInfo
Yusuke Suzuki
Comment 10
2019-05-17 00:58:44 PDT
Current metadata status. I'll put ArrayProfile in LLIntCallLinkInfo's padding space (this padding space is created by using Packed<> linked list, yay). OpCall +0 < 72> Metadata +0 < 32> JSC::LLIntCallLinkInfo m_callLinkInfo +0 < 12> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> +0 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_next +0 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +0 < 6> std::__1::array<unsigned char, 6> m_storage +0 < 6> unsigned char [6] __elems_ +6 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_prev +6 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +6 < 6> std::__1::array<unsigned char, 6> m_storage +6 < 6> unsigned char [6] __elems_ +12 < 4> <PADDING: 4 bytes> +16 < 8> uintptr_t m_calleeOrLastSeenCalleeWithLinkBit +24 < 8> JSC::MacroAssemblerCodePtr<357> m_machineCodeTarget +24 < 1> JSC::MacroAssemblerCodePtrBase JSC::MacroAssemblerCodePtrBase +24 < 8> const void * m_value +32 < 12> JSC::ArrayProfile m_arrayProfile +32 < 4> JSC::StructureID m_lastSeenStructureID +36 < 1> bool m_mayStoreToHole +37 < 1> bool m_outOfBounds +38 < :1> bool m_mayInterceptIndexedAccesses : 1 +38 < :1> bool m_usesOriginalArrayStructures : 1 +38 < :1> bool m_didPerformFirstRunPruning : 1 +38 < :5> <UNUSED BITS: 5 bits> +39 < 1> <PADDING: 1 byte> +40 < 4> JSC::ArrayModes m_observedArrayModes +44 < 4> <PADDING: 4 bytes> +48 < 24> JSC::ValueProfile m_profile +48 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +48 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +48 < 16> JSC::EncodedJSValue [2] m_buckets +64 < 8> JSC::SpeculatedType m_prediction Total byte size: 72 Total pad bytes: 9 Padding percentage: 12.50 % OpCallEval +0 < 72> Metadata +0 < 32> JSC::LLIntCallLinkInfo m_callLinkInfo +0 < 12> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> +0 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_next +0 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +0 < 6> std::__1::array<unsigned char, 6> m_storage +0 < 6> unsigned char [6] __elems_ +6 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_prev +6 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +6 < 6> std::__1::array<unsigned char, 6> m_storage +6 < 6> unsigned char [6] __elems_ +12 < 4> <PADDING: 4 bytes> +16 < 8> uintptr_t m_calleeOrLastSeenCalleeWithLinkBit +24 < 8> JSC::MacroAssemblerCodePtr<357> m_machineCodeTarget +24 < 1> JSC::MacroAssemblerCodePtrBase JSC::MacroAssemblerCodePtrBase +24 < 8> const void * m_value +32 < 12> JSC::ArrayProfile m_arrayProfile +32 < 4> JSC::StructureID m_lastSeenStructureID +36 < 1> bool m_mayStoreToHole +37 < 1> bool m_outOfBounds +38 < :1> bool m_mayInterceptIndexedAccesses : 1 +38 < :1> bool m_usesOriginalArrayStructures : 1 +38 < :1> bool m_didPerformFirstRunPruning : 1 +38 < :5> <UNUSED BITS: 5 bits> +39 < 1> <PADDING: 1 byte> +40 < 4> JSC::ArrayModes m_observedArrayModes +44 < 4> <PADDING: 4 bytes> +48 < 24> JSC::ValueProfile m_profile +48 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +48 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +48 < 16> JSC::EncodedJSValue [2] m_buckets +64 < 8> JSC::SpeculatedType m_prediction Total byte size: 72 Total pad bytes: 9 Padding percentage: 12.50 % OpCallVarargs +0 < 40> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes +12 < 4> <PADDING: 4 bytes> +16 < 24> JSC::ValueProfile m_profile +16 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +16 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +16 < 16> JSC::EncodedJSValue [2] m_buckets +32 < 8> JSC::SpeculatedType m_prediction Total byte size: 40 Total pad bytes: 5 Padding percentage: 12.50 % OpTailCallVarargs +0 < 40> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes +12 < 4> <PADDING: 4 bytes> +16 < 24> JSC::ValueProfile m_profile +16 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +16 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +16 < 16> JSC::EncodedJSValue [2] m_buckets +32 < 8> JSC::SpeculatedType m_prediction Total byte size: 40 Total pad bytes: 5 Padding percentage: 12.50 % OpTailCallForwardArguments +0 < 40> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes +12 < 4> <PADDING: 4 bytes> +16 < 24> JSC::ValueProfile m_profile +16 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +16 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +16 < 16> JSC::EncodedJSValue [2] m_buckets +32 < 8> JSC::SpeculatedType m_prediction Total byte size: 40 Total pad bytes: 5 Padding percentage: 12.50 % OpConstruct +0 < 72> Metadata +0 < 32> JSC::LLIntCallLinkInfo m_callLinkInfo +0 < 12> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> +0 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_next +0 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +0 < 6> std::__1::array<unsigned char, 6> m_storage +0 < 6> unsigned char [6] __elems_ +6 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_prev +6 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +6 < 6> std::__1::array<unsigned char, 6> m_storage +6 < 6> unsigned char [6] __elems_ +12 < 4> <PADDING: 4 bytes> +16 < 8> uintptr_t m_calleeOrLastSeenCalleeWithLinkBit +24 < 8> JSC::MacroAssemblerCodePtr<357> m_machineCodeTarget +24 < 1> JSC::MacroAssemblerCodePtrBase JSC::MacroAssemblerCodePtrBase +24 < 8> const void * m_value +32 < 12> JSC::ArrayProfile m_arrayProfile +32 < 4> JSC::StructureID m_lastSeenStructureID +36 < 1> bool m_mayStoreToHole +37 < 1> bool m_outOfBounds +38 < :1> bool m_mayInterceptIndexedAccesses : 1 +38 < :1> bool m_usesOriginalArrayStructures : 1 +38 < :1> bool m_didPerformFirstRunPruning : 1 +38 < :5> <UNUSED BITS: 5 bits> +39 < 1> <PADDING: 1 byte> +40 < 4> JSC::ArrayModes m_observedArrayModes +44 < 4> <PADDING: 4 bytes> +48 < 24> JSC::ValueProfile m_profile +48 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +48 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +48 < 16> JSC::EncodedJSValue [2] m_buckets +64 < 8> JSC::SpeculatedType m_prediction Total byte size: 72 Total pad bytes: 9 Padding percentage: 12.50 % OpConstructVarargs +0 < 40> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes +12 < 4> <PADDING: 4 bytes> +16 < 24> JSC::ValueProfile m_profile +16 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +16 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +16 < 16> JSC::EncodedJSValue [2] m_buckets +32 < 8> JSC::SpeculatedType m_prediction Total byte size: 40 Total pad bytes: 5 Padding percentage: 12.50 % OpGetArgument +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpJneqPtr +0 < 1> Metadata +0 < 1> bool m_hasJumped Total byte size: 1 Total pad bytes: 0 OpNewObject +0 < 16> Metadata +0 < 16> JSC::ObjectAllocationProfile m_objectAllocationProfile +0 < 16> JSC::ObjectAllocationProfileBase<JSC::ObjectAllocationProfile> JSC::ObjectAllocationProfileBase<JSC::ObjectAllocationProfile> +0 < 8> JSC::Allocator m_allocator +0 < 8> JSC::LocalAllocator * m_localAllocator +8 < 8> JSC::WriteBarrier<JSC::Structure, WTF::DumbPtrTraits<JSC::Structure> > m_structure +8 < 8> JSC::WriteBarrierBase<JSC::Structure, WTF::DumbPtrTraits<JSC::Structure> > JSC::WriteBarrierBase<JSC::Structure, WTF::DumbPtrTraits<JSC::Structure> > +8 < 8> JSC::WriteBarrierBase<JSC::Structure, WTF::DumbPtrTraits<JSC::Structure> >::StorageType m_cell Total byte size: 16 Total pad bytes: 0 OpResolveScope +0 < 16> Metadata +0 < 4> JSC::ResolveType m_resolveType +4 < 4> JSC::OpResolveScope::Metadata::(anonymous union) None +8 < 8> JSC::OpResolveScope::Metadata::(anonymous union) None Total byte size: 16 Total pad bytes: 0 OpGetFromScope +0 < 48> Metadata +0 < 4> JSC::GetPutInfo m_getPutInfo +0 < 4> JSC::GetPutInfo::Operand m_operand +4 < 4> <PADDING: 4 bytes> +8 < 8> JSC::OpGetFromScope::Metadata::(anonymous union) None +16 < 8> uintptr_t m_operand +24 < 24> JSC::ValueProfile m_profile +24 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +24 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +24 < 16> JSC::EncodedJSValue [2] m_buckets +40 < 8> JSC::SpeculatedType m_prediction Total byte size: 48 Total pad bytes: 4 Padding percentage: 8.33 % OpPutToScope +0 < 24> Metadata +0 < 4> JSC::GetPutInfo m_getPutInfo +0 < 4> JSC::GetPutInfo::Operand m_operand +4 < 4> <PADDING: 4 bytes> +8 < 8> JSC::OpPutToScope::Metadata::(anonymous union) None +16 < 8> uintptr_t m_operand Total byte size: 24 Total pad bytes: 4 Padding percentage: 16.67 % OpGetFromArguments +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpInByVal +0 < 12> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes Total byte size: 12 Total pad bytes: 1 Padding percentage: 8.33 % OpNewArray +0 < 16> Metadata +0 < 16> JSC::ArrayAllocationProfile m_arrayAllocationProfile +0 < 1> JSC::IndexingType m_currentIndexingType +1 < 3> <PADDING: 3 bytes> +4 < 4> unsigned int m_largestSeenVectorLength +8 < 8> JSC::JSArray * m_lastArray Total byte size: 16 Total pad bytes: 3 Padding percentage: 18.75 % OpGetById +0 < 40> Metadata +0 < 16> JSC::GetByIdModeMetadata m_modeMetadata +16 < 24> JSC::ValueProfile m_profile +16 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +16 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +16 < 16> JSC::EncodedJSValue [2] m_buckets +32 < 8> JSC::SpeculatedType m_prediction Total byte size: 40 Total pad bytes: 0 OpGetByIdWithThis +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpGetByValWithThis +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpCatch +0 < 8> Metadata +0 < 8> JSC::ValueProfileAndOperandBuffer * m_buffer Total byte size: 8 Total pad bytes: 0 OpGetByIdDirect +0 < 32> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction +24 < 4> JSC::StructureID m_structureID +28 < 4> unsigned int m_offset Total byte size: 32 Total pad bytes: 0 OpTryGetById +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpPutById +0 < 24> Metadata +0 < 4> JSC::StructureID m_oldStructureID +4 < 4> unsigned int m_offset +8 < 4> JSC::StructureID m_newStructureID +12 < 4> <PADDING: 4 bytes> +16 < 8> JSC::WriteBarrierBase<JSC::StructureChain, WTF::DumbPtrTraits<JSC::StructureChain> > m_structureChain +16 < 8> JSC::WriteBarrierBase<JSC::StructureChain, WTF::DumbPtrTraits<JSC::StructureChain> >::StorageType m_cell Total byte size: 24 Total pad bytes: 4 Padding percentage: 16.67 % OpTailCall +0 < 72> Metadata +0 < 32> JSC::LLIntCallLinkInfo m_callLinkInfo +0 < 12> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> WTF::PackedRawSentinelNode<JSC::LLIntCallLinkInfo> +0 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_next +0 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +0 < 6> std::__1::array<unsigned char, 6> m_storage +0 < 6> unsigned char [6] __elems_ +6 < 6> WTF::PackedPtrTraits<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> > >::StorageType m_prev +6 < 6> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> WTF::PackedAlignedPtr<WTF::BasicRawSentinelNode<JSC::LLIntCallLinkInfo, WTF::PackedPtrTraits<JSC::LLIntCallLinkInfo> >, 1> +6 < 6> std::__1::array<unsigned char, 6> m_storage +6 < 6> unsigned char [6] __elems_ +12 < 4> <PADDING: 4 bytes> +16 < 8> uintptr_t m_calleeOrLastSeenCalleeWithLinkBit +24 < 8> JSC::MacroAssemblerCodePtr<357> m_machineCodeTarget +24 < 1> JSC::MacroAssemblerCodePtrBase JSC::MacroAssemblerCodePtrBase +24 < 8> const void * m_value +32 < 12> JSC::ArrayProfile m_arrayProfile +32 < 4> JSC::StructureID m_lastSeenStructureID +36 < 1> bool m_mayStoreToHole +37 < 1> bool m_outOfBounds +38 < :1> bool m_mayInterceptIndexedAccesses : 1 +38 < :1> bool m_usesOriginalArrayStructures : 1 +38 < :1> bool m_didPerformFirstRunPruning : 1 +38 < :5> <UNUSED BITS: 5 bits> +39 < 1> <PADDING: 1 byte> +40 < 4> JSC::ArrayModes m_observedArrayModes +44 < 4> <PADDING: 4 bytes> +48 < 24> JSC::ValueProfile m_profile +48 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +48 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +48 < 16> JSC::EncodedJSValue [2] m_buckets +64 < 8> JSC::SpeculatedType m_prediction Total byte size: 72 Total pad bytes: 9 Padding percentage: 12.50 % OpProfileType +0 < 8> Metadata +0 < 8> JSC::TypeLocation * m_typeLocation Total byte size: 8 Total pad bytes: 0 OpProfileControlFlow +0 < 8> Metadata +0 < 8> JSC::BasicBlockLocation * m_basicBlockLocation Total byte size: 8 Total pad bytes: 0 OpMul +0 < 4> Metadata +0 < 4> JSC::ArithProfile m_arithProfile +0 < 4> uint32_t m_bits Total byte size: 4 Total pad bytes: 0 OpHasIndexedProperty +0 < 12> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes Total byte size: 12 Total pad bytes: 1 Padding percentage: 8.33 % OpGetByVal +0 < 40> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction +24 < 12> JSC::ArrayProfile m_arrayProfile +24 < 4> JSC::StructureID m_lastSeenStructureID +28 < 1> bool m_mayStoreToHole +29 < 1> bool m_outOfBounds +30 < :1> bool m_mayInterceptIndexedAccesses : 1 +30 < :1> bool m_usesOriginalArrayStructures : 1 +30 < :1> bool m_didPerformFirstRunPruning : 1 +30 < :5> <UNUSED BITS: 5 bits> +31 < 1> <PADDING: 1 byte> +32 < 4> JSC::ArrayModes m_observedArrayModes +36 < 4> <PADDING: 4 bytes> Total byte size: 40 Total pad bytes: 5 Padding percentage: 12.50 % OpPutByVal +0 < 12> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes Total byte size: 12 Total pad bytes: 1 Padding percentage: 8.33 % OpGetDirectPname +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpDiv +0 < 4> Metadata +0 < 4> JSC::ArithProfile m_arithProfile +0 < 4> uint32_t m_bits Total byte size: 4 Total pad bytes: 0 OpPutByValDirect +0 < 12> Metadata +0 < 12> JSC::ArrayProfile m_arrayProfile +0 < 4> JSC::StructureID m_lastSeenStructureID +4 < 1> bool m_mayStoreToHole +5 < 1> bool m_outOfBounds +6 < :1> bool m_mayInterceptIndexedAccesses : 1 +6 < :1> bool m_usesOriginalArrayStructures : 1 +6 < :1> bool m_didPerformFirstRunPruning : 1 +6 < :5> <UNUSED BITS: 5 bits> +7 < 1> <PADDING: 1 byte> +8 < 4> JSC::ArrayModes m_observedArrayModes Total byte size: 12 Total pad bytes: 1 Padding percentage: 8.33 % OpSub +0 < 4> Metadata +0 < 4> JSC::ArithProfile m_arithProfile +0 < 4> uint32_t m_bits Total byte size: 4 Total pad bytes: 0 OpBitand +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpBitor +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpBitxor +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpToObject +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpToNumber +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpNegate +0 < 4> Metadata +0 < 4> JSC::ArithProfile m_arithProfile +0 < 4> uint32_t m_bits Total byte size: 4 Total pad bytes: 0 OpBitnot +0 < 24> Metadata +0 < 24> JSC::ValueProfile m_profile +0 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +0 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +0 < 16> JSC::EncodedJSValue [2] m_buckets +16 < 8> JSC::SpeculatedType m_prediction Total byte size: 24 Total pad bytes: 0 OpNewArrayWithSize +0 < 16> Metadata +0 < 16> JSC::ArrayAllocationProfile m_arrayAllocationProfile +0 < 1> JSC::IndexingType m_currentIndexingType +1 < 3> <PADDING: 3 bytes> +4 < 4> unsigned int m_largestSeenVectorLength +8 < 8> JSC::JSArray * m_lastArray Total byte size: 16 Total pad bytes: 3 Padding percentage: 18.75 % OpNewArrayBuffer +0 < 16> Metadata +0 < 16> JSC::ArrayAllocationProfile m_arrayAllocationProfile +0 < 1> JSC::IndexingType m_currentIndexingType +1 < 3> <PADDING: 3 bytes> +4 < 4> unsigned int m_largestSeenVectorLength +8 < 8> JSC::JSArray * m_lastArray Total byte size: 16 Total pad bytes: 3 Padding percentage: 18.75 % OpCreateThis +0 < 8> Metadata +0 < 8> JSC::WriteBarrier<JSC::JSCell, WTF::DumbPtrTraits<JSC::JSCell> > m_cachedCallee +0 < 8> JSC::WriteBarrierBase<JSC::JSCell, WTF::DumbPtrTraits<JSC::JSCell> > JSC::WriteBarrierBase<JSC::JSCell, WTF::DumbPtrTraits<JSC::JSCell> > +0 < 8> JSC::WriteBarrierBase<JSC::JSCell, WTF::DumbPtrTraits<JSC::JSCell> >::StorageType m_cell Total byte size: 8 Total pad bytes: 0 OpToThis +0 < 32> Metadata +0 < 4> JSC::StructureID m_cachedStructureID +4 < 4> JSC::ToThisStatus m_toThisStatus +8 < 24> JSC::ValueProfile m_profile +8 < 24> JSC::ValueProfileWithLogNumberOfBuckets<0> JSC::ValueProfileWithLogNumberOfBuckets<0> +8 < 24> JSC::ValueProfileBase<1> JSC::ValueProfileBase<1> +8 < 16> JSC::EncodedJSValue [2] m_buckets +24 < 8> JSC::SpeculatedType m_prediction Total byte size: 32 Total pad bytes: 0 OpAdd +0 < 4> Metadata +0 < 4> JSC::ArithProfile m_arithProfile +0 < 4> uint32_t m_bits Total byte size: 4 Total pad bytes: 0
Yusuke Suzuki
Comment 11
2019-05-17 02:46:09 PDT
Created
attachment 370112
[details]
Patch
EWS Watchlist
Comment 12
2019-05-17 02:49:23 PDT
Attachment 370112
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 32 files If any of these errors are false positives, please file a bug against check-webkit-style.
Simon Fraser (smfr)
Comment 13
2019-05-17 11:26:32 PDT
This is good stuff!
Radar WebKit Bug Importer
Comment 14
2019-05-17 11:26:58 PDT
<
rdar://problem/50899664
>
Yusuke Suzuki
Comment 15
2019-05-17 12:36:17 PDT
Created
attachment 370134
[details]
Patch
EWS Watchlist
Comment 16
2019-05-17 12:38:46 PDT
Attachment 370134
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 32 files If any of these errors are false positives, please file a bug against check-webkit-style.
Yusuke Suzuki
Comment 17
2019-05-17 12:45:36 PDT
Created
attachment 370135
[details]
Patch
EWS Watchlist
Comment 18
2019-05-17 12:46:52 PDT
Attachment 370135
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 32 files If any of these errors are false positives, please file a bug against check-webkit-style.
Yusuke Suzuki
Comment 19
2019-05-17 13:03:21 PDT
Created
attachment 370136
[details]
Patch
EWS Watchlist
Comment 20
2019-05-17 13:05:14 PDT
Attachment 370136
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 32 files If any of these errors are false positives, please file a bug against check-webkit-style.
Tadeu Zagallo
Comment 21
2019-05-17 13:27:14 PDT
Comment on
attachment 370136
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=370136&action=review
> Source/JavaScriptCore/bytecode/CodeBlock.cpp:1249 > + Structure* structure = !metadata.m_cachedStructureID ? nullptr : vm.heap.structureIDTable().get(metadata.m_cachedStructureID);
nit: It seems that the `!metadata.m_cachedStructureID` check is unnecessary here due to the break above.
> Source/JavaScriptCore/bytecode/GetByIdMetadata.h:37 > +// In 64bit Little endian architecture, this union shares ProtoLoad's JSObject* cachedSlot with "higCountForLLIntCaching" and "mode".
typo: s/higCountForLLIntCaching/hitCountForLLIntCaching/
> Source/JavaScriptCore/bytecode/GetByIdMetadata.h:43 > +#if CPU(LITTLE_ENDIAN) && CPU(ADDRESS64) > union GetByIdModeMetadata { > +#else > +struct GetByIdModeMetadata { > +#endif
I find these ifdef's a bit confusing. I wonder if it'd be better to move the mode structs out and have disjoint definitions of `GetByIdModeMetadata` in the ifdef branches.
> Source/JavaScriptCore/bytecode/GetByIdMetadata.h:76 > + };
Should you also have `static_assert(sizeof(ProtoLoad) == 16);` ?
> Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:-752 > - metadata.m_modeMetadata.protoLoadMode.cachedSlot = slot.slotBase();
oops
Yusuke Suzuki
Comment 22
2019-05-17 13:41:36 PDT
Comment on
attachment 370136
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=370136&action=review
Thanks!
>> Source/JavaScriptCore/bytecode/CodeBlock.cpp:1249 >> + Structure* structure = !metadata.m_cachedStructureID ? nullptr : vm.heap.structureIDTable().get(metadata.m_cachedStructureID); > > nit: It seems that the `!metadata.m_cachedStructureID` check is unnecessary here due to the break above.
Right! Fixed.
>> Source/JavaScriptCore/bytecode/GetByIdMetadata.h:37 >> +// In 64bit Little endian architecture, this union shares ProtoLoad's JSObject* cachedSlot with "higCountForLLIntCaching" and "mode". > > typo: s/higCountForLLIntCaching/hitCountForLLIntCaching/
Fixed.
>> Source/JavaScriptCore/bytecode/GetByIdMetadata.h:43 >> +#endif > > I find these ifdef's a bit confusing. I wonder if it'd be better to move the mode structs out and have disjoint definitions of `GetByIdModeMetadata` in the ifdef branches.
Sounds nice. Fixed.
>> Source/JavaScriptCore/bytecode/GetByIdMetadata.h:76 >> + }; > > Should you also have `static_assert(sizeof(ProtoLoad) == 16);` ?
Added.
Yusuke Suzuki
Comment 23
2019-05-17 13:43:42 PDT
Created
attachment 370144
[details]
Patch
EWS Watchlist
Comment 24
2019-05-17 13:46:04 PDT
Attachment 370144
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 33 files If any of these errors are false positives, please file a bug against check-webkit-style.
Yusuke Suzuki
Comment 25
2019-05-17 13:54:40 PDT
Created
attachment 370147
[details]
Patch
EWS Watchlist
Comment 26
2019-05-17 13:57:34 PDT
Attachment 370147
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 33 files If any of these errors are false positives, please file a bug against check-webkit-style.
Yusuke Suzuki
Comment 27
2019-05-17 14:09:12 PDT
Created
attachment 370149
[details]
Patch
EWS Watchlist
Comment 28
2019-05-17 14:11:46 PDT
Attachment 370149
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:521: Non-label code inside switch statements should be indented. [whitespace/indent] [4] ERROR: Source/JavaScriptCore/bytecode/CodeBlock.cpp:2579: Non-label code inside switch statements should be indented. [whitespace/indent] [4] Total errors found: 2 in 33 files If any of these errors are false positives, please file a bug against check-webkit-style.
Yusuke Suzuki
Comment 29
2019-05-17 17:27:17 PDT
(In reply to Simon Fraser (smfr) from
comment #13
)
> This is good stuff!
Thanks! Your malloc zone patch was super helpful to find what we should look into closely :D
Michael Saboff
Comment 30
2019-05-21 07:43:02 PDT
Comment on
attachment 370149
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=370149&action=review
r=me
> Source/JavaScriptCore/ChangeLog:13 > + If we shrink Metadata, we can get peak memory footprint in Gmail.
Is this better wording: "If we shrink Metadata, we can *reduce the* peak memory footprint in Gmail."?
> Source/JavaScriptCore/ChangeLog:15 > + This patch attempts to shrink Metadata. This patch first focus on low hanging fruits: it does not include the change removing OSR exit JSValue in ValueProfile.
I think you want to say "This patch shrinks Metatdata."
> Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:749 > + metadata.m_modeMetadata.mode = GetByIdMode::ProtoLoad; // This must be first set. In 64bit architecture, this field is shared with protoLoadMode.cachedSlot.
Instead of relying on convention here, it may make sense to have a setting function in GetByIdMetadata.h that sets all values in the proper order.
Saam Barati
Comment 31
2019-05-22 13:29:48 PDT
Comment on
attachment 370149
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=370149&action=review
> Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:836 > + ConcurrentJSLocker locker(codeBlock->m_lock);
nice! I spotted this bug when I was doing LLInt OSR exit:
https://bugs.webkit.org/show_bug.cgi?id=198012
Saam Barati
Comment 32
2019-05-22 13:30:10 PDT
***
Bug 198012
has been marked as a duplicate of this bug. ***
Tadeu Zagallo
Comment 33
2019-05-22 13:32:05 PDT
Comment on
attachment 370149
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=370149&action=review
>> Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:836 >> + ConcurrentJSLocker locker(codeBlock->m_lock); > > nice! I spotted this bug when I was doing LLInt OSR exit: >
https://bugs.webkit.org/show_bug.cgi?id=198012
lol, one more haha:
https://bugs.webkit.org/show_bug.cgi?id=198120
Yusuke Suzuki
Comment 34
2019-05-22 16:09:17 PDT
Comment on
attachment 370149
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=370149&action=review
>> Source/JavaScriptCore/ChangeLog:13 >> + If we shrink Metadata, we can get peak memory footprint in Gmail. > > Is this better wording: "If we shrink Metadata, we can *reduce the* peak memory footprint in Gmail."?
Right. Fixed.
>> Source/JavaScriptCore/ChangeLog:15 >> + This patch attempts to shrink Metadata. This patch first focus on low hanging fruits: it does not include the change removing OSR exit JSValue in ValueProfile. > > I think you want to say "This patch shrinks Metatdata."
Yeah, changed.
>> Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:749 >> + metadata.m_modeMetadata.mode = GetByIdMode::ProtoLoad; // This must be first set. In 64bit architecture, this field is shared with protoLoadMode.cachedSlot. > > Instead of relying on convention here, it may make sense to have a setting function in GetByIdMetadata.h that sets all values in the proper order.
Sounds good! Fixed.
>>> Source/JavaScriptCore/llint/LLIntSlowPaths.cpp:836 >>> + ConcurrentJSLocker locker(codeBlock->m_lock); >> >> nice! I spotted this bug when I was doing LLInt OSR exit: >>
https://bugs.webkit.org/show_bug.cgi?id=198012
> > lol, one more haha:
https://bugs.webkit.org/show_bug.cgi?id=198120
We independently found the same issue three times, lol.
Yusuke Suzuki
Comment 35
2019-05-22 16:42:42 PDT
Committed
r245658
: <
https://trac.webkit.org/changeset/245658
>
Yusuke Suzuki
Comment 36
2019-05-25 20:42:00 PDT
This is getting 7% JetStream2/json-parse-inspector improvement in iPad Pro 2 too.
Yusuke Suzuki
Comment 37
2019-05-29 20:41:11 PDT
Size of MetadataTable is largely reduced right now due to this patch and UnlinkedMetadataTable shrinking patch. MetadataTable_0x116c69000 242.0M 44.7M 32.2M 0K 25616 4380K 28.0M 87% 46 4MB just after full GC.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug