@@ -551,6 +551,80 @@ module Flambda2 = struct
551
551
let threshold = ref (F. default Default. threshold)
552
552
553
553
let report_bin = ref false
554
+
555
+ type inlining_arguments = {
556
+ max_depth : int option ;
557
+ call_cost : float option ;
558
+ alloc_cost : float option ;
559
+ prim_cost : float option ;
560
+ branch_cost : float option ;
561
+ indirect_call_cost : float option ;
562
+ poly_compare_cost : float option ;
563
+ small_function_size : int option ;
564
+ large_function_size : int option ;
565
+ threshold : float option ;
566
+ }
567
+
568
+ let use_inlining_arguments_set ?round (arg : inlining_arguments ) =
569
+ let set_int = set_int_arg round in
570
+ let set_float = set_float_arg round in
571
+ set_int max_depth Default. max_depth arg.max_depth;
572
+ set_float call_cost Default. call_cost arg.call_cost;
573
+ set_float alloc_cost Default. alloc_cost arg.alloc_cost;
574
+ set_float prim_cost Default. prim_cost arg.prim_cost;
575
+ set_float branch_cost Default. branch_cost arg.branch_cost;
576
+ set_float indirect_call_cost
577
+ Default. indirect_call_cost arg.indirect_call_cost;
578
+ set_float poly_compare_cost
579
+ Default. poly_compare_cost arg.poly_compare_cost;
580
+ set_int small_function_size
581
+ Default. small_function_size arg.small_function_size;
582
+ set_int large_function_size
583
+ Default. large_function_size arg.large_function_size;
584
+ set_float threshold Default. threshold arg.threshold
585
+
586
+ let oclassic_arguments = {
587
+ max_depth = None ;
588
+ call_cost = None ;
589
+ alloc_cost = None ;
590
+ prim_cost = None ;
591
+ branch_cost = None ;
592
+ indirect_call_cost = None ;
593
+ poly_compare_cost = None ;
594
+ (* We set the small and large function sizes to the same value here to
595
+ recover "classic mode" semantics (no speculative inlining). *)
596
+ small_function_size = Some Default. small_function_size;
597
+ large_function_size = Some Default. small_function_size;
598
+ (* [threshold] matches the current compiler's default. (The factor of
599
+ 8 in that default is accounted for by [cost_divisor], above.) *)
600
+ threshold = Some 10. ;
601
+ }
602
+
603
+ let o2_arguments = {
604
+ max_depth = Some 2 ;
605
+ call_cost = Some (2.0 *. Default. call_cost);
606
+ alloc_cost = Some (2.0 *. Default. alloc_cost);
607
+ prim_cost = Some (2.0 *. Default. prim_cost);
608
+ branch_cost = Some (2.0 *. Default. branch_cost);
609
+ indirect_call_cost = Some (2.0 *. Default. indirect_call_cost);
610
+ poly_compare_cost = Some (2.0 *. Default. poly_compare_cost);
611
+ small_function_size = Some (2 * Default. small_function_size);
612
+ large_function_size = Some (4 * Default. large_function_size);
613
+ threshold = Some 25. ;
614
+ }
615
+
616
+ let o3_arguments = {
617
+ max_depth = Some 3 ;
618
+ call_cost = Some (3.0 *. Default. call_cost);
619
+ alloc_cost = Some (3.0 *. Default. alloc_cost);
620
+ prim_cost = Some (3.0 *. Default. prim_cost);
621
+ branch_cost = Some (3.0 *. Default. branch_cost);
622
+ indirect_call_cost = Some (3.0 *. Default. indirect_call_cost);
623
+ poly_compare_cost = Some (3.0 *. Default. poly_compare_cost);
624
+ small_function_size = Some (3 * Default. small_function_size);
625
+ large_function_size = Some (8 * Default. large_function_size);
626
+ threshold = Some 50. ;
627
+ }
554
628
end
555
629
556
630
let oclassic_flags () =
@@ -560,13 +634,6 @@ module Flambda2 = struct
560
634
Expert. fallback_inlining_heuristic := true ;
561
635
backend_cse_at_toplevel := false
562
636
563
- let o1_flags () =
564
- cse_depth := 2 ;
565
- join_points := true ;
566
- unbox_along_intra_function_control_flow := true ;
567
- Expert. fallback_inlining_heuristic := false ;
568
- backend_cse_at_toplevel := false
569
-
570
637
let o2_flags () =
571
638
cse_depth := 2 ;
572
639
join_points := true ;
@@ -582,6 +649,43 @@ module Flambda2 = struct
582
649
backend_cse_at_toplevel := false
583
650
end
584
651
652
+ let is_flambda2 () =
653
+ Config. flambda2 && ! native_code
654
+
655
+ let set_oclassic () =
656
+ if is_flambda2 () then begin
657
+ Flambda2.Inlining. use_inlining_arguments_set
658
+ Flambda2.Inlining. oclassic_arguments;
659
+ Flambda2. oclassic_flags ()
660
+ end else begin
661
+ classic_inlining := true ;
662
+ default_simplify_rounds := 1 ;
663
+ use_inlining_arguments_set classic_arguments;
664
+ unbox_free_vars_of_closures := false ;
665
+ unbox_specialised_args := false
666
+ end
667
+
668
+ let set_o2 () =
669
+ if is_flambda2 () then begin
670
+ Flambda2.Inlining. use_inlining_arguments_set Flambda2.Inlining. o2_arguments;
671
+ Flambda2. o2_flags ()
672
+ end else begin
673
+ default_simplify_rounds := 2 ;
674
+ use_inlining_arguments_set o2_arguments;
675
+ use_inlining_arguments_set ~round: 0 o1_arguments
676
+ end
677
+
678
+ let set_o3 () =
679
+ if is_flambda2 () then begin
680
+ Flambda2.Inlining. use_inlining_arguments_set Flambda2.Inlining. o3_arguments;
681
+ Flambda2. o3_flags ()
682
+ end else begin
683
+ default_simplify_rounds := 3 ;
684
+ use_inlining_arguments_set o3_arguments;
685
+ use_inlining_arguments_set ~round: 1 o2_arguments;
686
+ use_inlining_arguments_set ~round: 0 o1_arguments
687
+ end
688
+
585
689
(* This is used by the -stop-after option. *)
586
690
module Compiler_pass = struct
587
691
(* If you add a new pass, the following must be updated:
@@ -671,10 +775,6 @@ let set_save_ir_after pass enabled =
671
775
in
672
776
save_ir_after := new_passes
673
777
674
-
675
- let is_flambda2 () =
676
- Config. flambda2 && ! native_code
677
-
678
778
module String = Misc.Stdlib. String
679
779
680
780
let arg_spec = ref []
0 commit comments