Use exit label over return (reduces generated code size by ~10%)

This commit is contained in:
Fabian 2020-12-31 19:14:33 -06:00
parent 8ba65bffe3
commit 948fcc1c55
2 changed files with 12 additions and 10 deletions

View file

@ -91,8 +91,7 @@ pub fn gen_page_switch_check(
ctx.builder.if_void();
gen_profiler_stat_increment(ctx.builder, profiler::stat::FAILED_PAGE_CHANGE);
gen_debug_track_jit_exit(ctx.builder, last_instruction_addr);
gen_move_registers_from_locals_to_memory(ctx);
ctx.builder.return_();
ctx.builder.br(ctx.exit_label);
ctx.builder.block_end();
}

View file

@ -200,6 +200,7 @@ pub struct JitContext<'a> {
pub start_of_current_instruction: u32,
pub main_loop_label: Label,
pub exit_with_pagefault_label: Label,
pub exit_label: Label,
pub our_wasm_table_index: WasmTableIndex,
pub basic_block_index_local: &'a WasmLocal,
pub state_flags: CachedStateFlags,
@ -874,6 +875,8 @@ fn jit_generate_module(
})
.collect();
let exit_label = builder.block_void();
// main state machine loop
let main_loop_label = builder.loop_void();
@ -887,6 +890,7 @@ fn jit_generate_module(
start_of_current_instruction: 0,
main_loop_label,
exit_with_pagefault_label,
exit_label,
our_wasm_table_index: wasm_table_index,
basic_block_index_local: &gen_local_state,
state_flags,
@ -906,8 +910,7 @@ fn jit_generate_module(
ctx.builder.eqz_i32();
ctx.builder.if_void();
codegen::gen_debug_track_jit_exit(ctx.builder, 0);
codegen::gen_move_registers_from_locals_to_memory(ctx);
ctx.builder.return_();
ctx.builder.br(exit_label);
ctx.builder.block_end();
}
@ -964,8 +967,7 @@ fn jit_generate_module(
BasicBlockType::Exit => {
// Exit this function
codegen::gen_debug_track_jit_exit(ctx.builder, block.last_instruction_addr);
codegen::gen_move_registers_from_locals_to_memory(ctx);
ctx.builder.return_();
ctx.builder.br(exit_label);
},
BasicBlockType::Normal { next_block_addr } => {
// Unconditional jump to next basic block
@ -1060,8 +1062,7 @@ fn jit_generate_module(
else {
// Jump to different page
codegen::gen_debug_track_jit_exit(ctx.builder, block.last_instruction_addr);
codegen::gen_move_registers_from_locals_to_memory(ctx);
ctx.builder.return_();
ctx.builder.br(exit_label);
}
if let Some(next_block_addr) = next_block_addr {
@ -1092,8 +1093,7 @@ fn jit_generate_module(
// End of this page
codegen::gen_debug_track_jit_exit(ctx.builder, block.last_instruction_addr);
codegen::gen_move_registers_from_locals_to_memory(ctx);
ctx.builder.return_();
ctx.builder.br(exit_label);
ctx.builder.block_end();
}
@ -1114,6 +1114,9 @@ fn jit_generate_module(
ctx.builder.block_end(); // loop
ctx.builder.block_end(); // exit
codegen::gen_move_registers_from_locals_to_memory(ctx);
ctx.builder.free_local(gen_local_state.unsafe_clone());
if let Some(local) = gen_local_iteration_counter {
ctx.builder.free_local(local);