@@ -2463,6 +2463,57 @@ fn trace_jit_region_preserves_owned_value_drop_contract() {
24632463 assert_eq ! ( Arc :: strong_count( & output) , 1 ) ;
24642464}
24652465
2466+ #[ test]
2467+ fn trace_jit_region_progress_prevents_callable_frame_backoff ( ) {
2468+ if !native_jit_supported ( ) {
2469+ return ;
2470+ }
2471+ let source = r#"
2472+ fn run(limit, payload) {
2473+ let mut i = 0;
2474+ let mut total = 0;
2475+ while i < limit {
2476+ if i % 2 == 0 {
2477+ total = total + 3;
2478+ } else {
2479+ total = total + 5;
2480+ }
2481+ i = i + 1;
2482+ }
2483+ total + payload[0]
2484+ }
2485+ run(256, [1]);
2486+ "# ;
2487+ let compiled = compile_source ( source) . expect ( "region progress fixture should compile" ) ;
2488+ let mut vm = Vm :: new ( compiled. program ) ;
2489+ vm. set_jit_config ( JitConfig {
2490+ enabled : true ,
2491+ hot_loop_threshold : 1 ,
2492+ max_trace_len : 256 ,
2493+ } ) ;
2494+
2495+ assert_eq ! ( vm. run( ) . unwrap( ) , VmStatus :: Halted ) ;
2496+ assert_eq ! ( vm. stack( ) , & [ Value :: Int ( 1_025 ) ] ) ;
2497+ assert_eq ! ( vm. jit_native_region_count( ) , 1 , "{}" , vm. dump_jit_info( ) ) ;
2498+ let first_execs = vm. jit_native_exec_count ( ) ;
2499+ let first_edges = vm. jit_native_internal_region_edge_count ( ) ;
2500+
2501+ vm. reset_for_reuse ( ) ;
2502+ assert_eq ! ( vm. run( ) . unwrap( ) , VmStatus :: Halted ) ;
2503+ assert_eq ! ( vm. stack( ) , & [ Value :: Int ( 1_025 ) ] ) ;
2504+ assert ! (
2505+ vm. jit_native_exec_count( ) > first_execs,
2506+ "{}" ,
2507+ vm. dump_jit_info( )
2508+ ) ;
2509+ assert ! (
2510+ vm. jit_native_internal_region_edge_count( ) > first_edges,
2511+ "{}" ,
2512+ vm. dump_jit_info( )
2513+ ) ;
2514+ assert_eq ! ( vm. jit_native_region_count( ) , 1 , "{}" , vm. dump_jit_info( ) ) ;
2515+ }
2516+
24662517#[ test]
24672518fn trace_jit_region_respects_fuel_and_epoch_interrupts ( ) {
24682519 if !native_jit_supported ( ) {
0 commit comments