@@ -3,7 +3,7 @@ use std::mem;
33use crate :: asm:: * ;
44use crate :: asm:: x86_64:: * ;
55use crate :: codegen:: split_patch_point;
6- use crate :: stats:: CompileError ;
6+ use crate :: stats:: { CompileError , trace_compile_phase } ;
77use crate :: virtualmem:: CodePtr ;
88use crate :: cruby:: * ;
99use crate :: backend:: lir:: * ;
@@ -1143,14 +1143,15 @@ impl Assembler {
11431143 let use_scratch_regs = !self . accept_scratch_reg ;
11441144 asm_dump ! ( self , init) ;
11451145
1146- let mut asm = self . x86_split ( ) ;
1146+ let mut asm = trace_compile_phase ( "split" , || self . x86_split ( ) ) ;
11471147
11481148 asm_dump ! ( asm, split) ;
11491149
1150- asm. number_instructions ( 0 ) ;
1150+ let ( intervals, assignments, num_stack_slots) = trace_compile_phase ( "regalloc" , || {
1151+ trace_compile_phase ( "number_instructions" , || asm. number_instructions ( 0 ) ) ;
11511152
1152- let live_in = asm. analyze_liveness ( ) ;
1153- let intervals = asm. build_intervals ( live_in) ;
1153+ let live_in = trace_compile_phase ( "analyze_liveness" , || asm. analyze_liveness ( ) ) ;
1154+ let intervals = trace_compile_phase ( "build_intervals" , || asm. build_intervals ( live_in) ) ;
11541155
11551156 // Dump live intervals if requested
11561157 if let Some ( crate :: options:: Options { dump_lir : Some ( dump_lirs) , .. } ) = unsafe { crate :: options:: OPTIONS . as_ref ( ) } {
@@ -1160,7 +1161,9 @@ impl Assembler {
11601161 }
11611162
11621163 let preferred_registers = asm. preferred_register_assignments ( & intervals) ;
1163- let ( assignments, num_stack_slots) = asm. linear_scan ( intervals. clone ( ) , regs. len ( ) , & preferred_registers) ;
1164+ let ( assignments, num_stack_slots) = trace_compile_phase ( "linear_scan" , || asm. linear_scan ( intervals. clone ( ) , regs. len ( ) , & preferred_registers) ) ;
1165+ ( intervals, assignments, num_stack_slots)
1166+ } ) ;
11641167
11651168 let total_stack_slots = asm. stack_base_idx + num_stack_slots;
11661169 if total_stack_slots > Self :: MAX_FRAME_STACK_SLOTS {
@@ -1198,36 +1201,41 @@ impl Assembler {
11981201 }
11991202 }
12001203
1201- asm. handle_caller_saved_regs ( & intervals, & assignments, & C_ARG_REGREGS ) ;
1202- asm. resolve_ssa ( & intervals, & assignments) ;
1204+ trace_compile_phase ( "resolve_ssa" , || {
1205+ asm. handle_caller_saved_regs ( & intervals, & assignments, & C_ARG_REGREGS ) ;
1206+ asm. resolve_ssa ( & intervals, & assignments) ;
1207+ } ) ;
12031208 asm_dump ! ( asm, alloc_regs) ;
12041209
12051210 // We are moved out of SSA after resolve_ssa
12061211
12071212 // We put compile_exits after alloc_regs to avoid extending live ranges for VRegs spilled on side exits.
12081213 // Exit code is compiled into a separate list of instructions that we append
12091214 // to the last reachable block before scratch_split, so it gets linearized and split.
1210- let exit_insns = asm. compile_exits ( ) ;
1211- asm_dump ! ( asm, compile_exits) ;
1212-
1213- // Append exit instructions to the last reachable block so they are
1214- // included in linearize_instructions and processed by scratch_split.
1215- if let Some ( & last_block) = asm. block_order ( ) . last ( ) {
1216- for insn in exit_insns {
1217- asm. basic_blocks [ last_block. 0 ] . insns . push ( insn) ;
1218- asm. basic_blocks [ last_block. 0 ] . insn_ids . push ( None ) ;
1215+ trace_compile_phase ( "compile_exits" , || {
1216+ let exit_insns = asm. compile_exits ( ) ;
1217+
1218+ // Append exit instructions to the last reachable block so they are
1219+ // included in linearize_instructions and processed by scratch_split.
1220+ if let Some ( & last_block) = asm. block_order ( ) . last ( ) {
1221+ for insn in exit_insns {
1222+ asm. basic_blocks [ last_block. 0 ] . insns . push ( insn) ;
1223+ asm. basic_blocks [ last_block. 0 ] . insn_ids . push ( None ) ;
1224+ }
12191225 }
1220- }
1226+ } ) ;
1227+ asm_dump ! ( asm, compile_exits) ;
12211228
12221229 if use_scratch_regs {
1223- asm = asm. x86_scratch_split ( ) ;
1230+ asm = trace_compile_phase ( "scratch_split" , || asm. x86_scratch_split ( ) ) ;
12241231 asm_dump ! ( asm, scratch_split) ;
12251232 } else {
12261233 // For trampolines that use scratch registers, resolve ParallelMov without scratch_reg.
1227- asm = asm. resolve_parallel_mov_pass ( ) ;
1234+ asm = trace_compile_phase ( "resolve_parallel_mov" , || asm. resolve_parallel_mov_pass ( ) ) ;
12281235 asm_dump ! ( asm, resolve_parallel_mov) ;
12291236 }
12301237
1238+ trace_compile_phase ( "emit" , || {
12311239 // Create label instances in the code block
12321240 for ( idx, name) in asm. label_names . iter ( ) . enumerate ( ) {
12331241 let label = cb. new_label ( name. to_string ( ) ) ;
@@ -1240,6 +1248,7 @@ impl Assembler {
12401248
12411249 cb. link_labels ( ) . or ( Err ( CompileError :: LabelLinkingFailure ) ) ?;
12421250 Ok ( ( start_ptr, gc_offsets) )
1251+ } )
12431252 }
12441253}
12451254
0 commit comments