@@ -1081,6 +1081,78 @@ let mk_no_flambda2_debug_concrete_types_only_on_canonicals f =
1081
1081
Flambda2.Debug.Default. concrete_types_only_on_canonicals)
1082
1082
;;
1083
1083
1084
+ let mk_flambda2_inline_max_depth f =
1085
+ " -flambda2-inline-max-depth" , Arg. String f,
1086
+ Printf. sprintf " <int>|<round>=<int>[,...]\n \
1087
+ \ Maximum depth of search for inlining opportunities inside\n \
1088
+ \ inlined functions (default %d) (Flambda 2 only)"
1089
+ Clflags.Flambda2.Inlining.Default. max_depth
1090
+ ;;
1091
+
1092
+ let mk_flambda2_inline_cost arg descr ~default f =
1093
+ Printf. sprintf " -flambda2-inline-%s-cost" arg,
1094
+ Arg. String f,
1095
+ Printf. sprintf " <float>|<round>=<float>[,...]\n \
1096
+ \ The cost of not removing %s during inlining\n \
1097
+ \ (default %.03f, higher = more costly) (Flambda 2 only)"
1098
+ descr
1099
+ default
1100
+ ;;
1101
+
1102
+ let mk_flambda2_inline_call_cost =
1103
+ mk_flambda2_inline_cost " call" " a call"
1104
+ ~default: Clflags.Flambda2.Inlining.Default. call_cost
1105
+
1106
+ let mk_flambda2_inline_alloc_cost =
1107
+ mk_flambda2_inline_cost " alloc" " an allocation"
1108
+ ~default: Clflags.Flambda2.Inlining.Default. alloc_cost
1109
+
1110
+ let mk_flambda2_inline_prim_cost =
1111
+ mk_flambda2_inline_cost " prim" " a primitive"
1112
+ ~default: Clflags.Flambda2.Inlining.Default. prim_cost
1113
+
1114
+ let mk_flambda2_inline_branch_cost =
1115
+ mk_flambda2_inline_cost " branch" " a conditional"
1116
+ ~default: Clflags.Flambda2.Inlining.Default. branch_cost
1117
+
1118
+ let mk_flambda2_inline_indirect_call_cost =
1119
+ mk_flambda2_inline_cost " indirect" " an indirect call"
1120
+ ~default: Clflags.Flambda2.Inlining.Default. indirect_call_cost
1121
+
1122
+ let mk_flambda2_inline_poly_compare_cost =
1123
+ mk_flambda2_inline_cost " poly-compare" " a polymorphic comparison"
1124
+ ~default: Clflags.Flambda2.Inlining.Default. poly_compare_cost
1125
+
1126
+ (* CR-someday mshinwell: We should have a check that the parameters provided by
1127
+ the user are sensible, e.g. small_function_size <= large_function_size. *)
1128
+
1129
+ let mk_flambda2_inline_small_function_size f =
1130
+ " -flambda2-inline-small-function-size" , Arg. String f,
1131
+ Printf. sprintf " <int>|<round>=<int>[,...]\n \
1132
+ \ Functions with a cost less than this will always be inlined\n \
1133
+ \ unless an attribute instructs otherwise (default %d)\n \
1134
+ \ (Flambda 2 only)"
1135
+ Clflags.Flambda2.Inlining.Default. small_function_size
1136
+ ;;
1137
+
1138
+ let mk_flambda2_inline_large_function_size f =
1139
+ " -flambda2-inline-large-function-size" , Arg. String f,
1140
+ Printf. sprintf " <int>|<round>=<int>[,...]\n \
1141
+ \ Functions with a cost greater than this will never be inlined\n \
1142
+ \ unless an attribute instructs otherwise (default %d); speculative\n \
1143
+ \ inlining will be disabled if equal to the small function size\n \
1144
+ \ (Flambda 2 only)"
1145
+ Clflags.Flambda2.Inlining.Default. large_function_size
1146
+ ;;
1147
+
1148
+ let mk_flambda2_inline_threshold f =
1149
+ " -flambda2-inline-threshold" , Arg. String f,
1150
+ Printf. sprintf " <float>|<round>=<float>[,...]\n \
1151
+ \ Aggressiveness of inlining (default %.02f, higher numbers mean\n \
1152
+ \ more aggressive) (Flambda 2 only)"
1153
+ Clflags.Flambda2.Inlining.Default. threshold
1154
+ ;;
1155
+
1084
1156
module type Common_options = sig
1085
1157
val _absname : unit -> unit
1086
1158
val _alert : string -> unit
@@ -1309,6 +1381,17 @@ module type Optcommon_options = sig
1309
1381
val _no_flambda2_debug_permute_every_name : unit -> unit
1310
1382
val _flambda2_debug_concrete_types_only_on_canonicals : unit -> unit
1311
1383
val _no_flambda2_debug_concrete_types_only_on_canonicals : unit -> unit
1384
+
1385
+ val _flambda2_inline_max_depth : string -> unit
1386
+ val _flambda2_inline_call_cost : string -> unit
1387
+ val _flambda2_inline_alloc_cost : string -> unit
1388
+ val _flambda2_inline_prim_cost : string -> unit
1389
+ val _flambda2_inline_branch_cost : string -> unit
1390
+ val _flambda2_inline_indirect_call_cost : string -> unit
1391
+ val _flambda2_inline_poly_compare_cost : string -> unit
1392
+ val _flambda2_inline_small_function_size : string -> unit
1393
+ val _flambda2_inline_large_function_size : string -> unit
1394
+ val _flambda2_inline_threshold : string -> unit
1312
1395
end ;;
1313
1396
1314
1397
module type Optcomp_options = sig
@@ -1682,6 +1765,19 @@ struct
1682
1765
mk_no_flambda2_debug_concrete_types_only_on_canonicals
1683
1766
F. _no_flambda2_debug_concrete_types_only_on_canonicals;
1684
1767
1768
+ mk_flambda2_inline_max_depth F. _flambda2_inline_max_depth;
1769
+ mk_flambda2_inline_alloc_cost F. _flambda2_inline_alloc_cost;
1770
+ mk_flambda2_inline_branch_cost F. _flambda2_inline_branch_cost;
1771
+ mk_flambda2_inline_call_cost F. _flambda2_inline_call_cost;
1772
+ mk_flambda2_inline_prim_cost F. _flambda2_inline_prim_cost;
1773
+ mk_flambda2_inline_indirect_call_cost F. _flambda2_inline_indirect_call_cost;
1774
+ mk_flambda2_inline_poly_compare_cost F. _flambda2_inline_poly_compare_cost;
1775
+ mk_flambda2_inline_small_function_size
1776
+ F. _flambda2_inline_small_function_size;
1777
+ mk_flambda2_inline_large_function_size
1778
+ F. _flambda2_inline_large_function_size;
1779
+ mk_flambda2_inline_threshold F. _flambda2_inline_threshold;
1780
+
1685
1781
mk_match_context_rows F. _match_context_rows;
1686
1782
mk_dno_unique_ids F. _dno_unique_ids;
1687
1783
mk_dunique_ids F. _dunique_ids;
@@ -1838,6 +1934,19 @@ module Make_opttop_options (F : Opttop_options) = struct
1838
1934
mk_no_flambda2_debug_concrete_types_only_on_canonicals
1839
1935
F. _no_flambda2_debug_concrete_types_only_on_canonicals;
1840
1936
1937
+ mk_flambda2_inline_max_depth F. _flambda2_inline_max_depth;
1938
+ mk_flambda2_inline_alloc_cost F. _flambda2_inline_alloc_cost;
1939
+ mk_flambda2_inline_branch_cost F. _flambda2_inline_branch_cost;
1940
+ mk_flambda2_inline_call_cost F. _flambda2_inline_call_cost;
1941
+ mk_flambda2_inline_prim_cost F. _flambda2_inline_prim_cost;
1942
+ mk_flambda2_inline_indirect_call_cost F. _flambda2_inline_indirect_call_cost;
1943
+ mk_flambda2_inline_poly_compare_cost F. _flambda2_inline_poly_compare_cost;
1944
+ mk_flambda2_inline_small_function_size
1945
+ F. _flambda2_inline_small_function_size;
1946
+ mk_flambda2_inline_large_function_size
1947
+ F. _flambda2_inline_large_function_size;
1948
+ mk_flambda2_inline_threshold F. _flambda2_inline_threshold;
1949
+
1841
1950
mk_dsource F. _dsource;
1842
1951
mk_dparsetree F. _dparsetree;
1843
1952
mk_dtypedtree F. _dtypedtree;
@@ -2160,6 +2269,60 @@ module Default = struct
2160
2269
set Flambda2.Debug. concrete_types_only_on_canonicals
2161
2270
let _no_flambda2_debug_concrete_types_only_on_canonicals =
2162
2271
clear Flambda2.Debug. concrete_types_only_on_canonicals
2272
+
2273
+ let _flambda2_inline_max_depth spec =
2274
+ Int_arg_helper. parse spec
2275
+ " Syntax: -flambda2-inline-max-depth <int> | <round>=<int>[,...]"
2276
+ Flambda2.Inlining. max_depth
2277
+
2278
+ let _flambda2_inline_alloc_cost spec =
2279
+ Float_arg_helper. parse spec
2280
+ " Syntax: -flambda2-inline-alloc-cost <float> | <round>=<float>[,...]"
2281
+ Flambda2.Inlining. alloc_cost
2282
+
2283
+ let _flambda2_inline_branch_cost spec =
2284
+ Float_arg_helper. parse spec
2285
+ " Syntax: -flambda2-inline-branch-cost <float> | <round>=<float>[,...]"
2286
+ Flambda2.Inlining. branch_cost
2287
+
2288
+ let _flambda2_inline_call_cost spec =
2289
+ Float_arg_helper. parse spec
2290
+ " Syntax: -flambda2-inline-call-cost <float> | <round>=<float>[,...]"
2291
+ Flambda2.Inlining. call_cost
2292
+
2293
+ let _flambda2_inline_prim_cost spec =
2294
+ Float_arg_helper. parse spec
2295
+ " Syntax: -flambda2-inline-prim-cost <float> | <round>=<float>[,...]"
2296
+ Flambda2.Inlining. prim_cost
2297
+
2298
+ let _flambda2_inline_indirect_call_cost spec =
2299
+ Float_arg_helper. parse spec
2300
+ " Syntax: -flambda2-inline-indirect-call-cost <float> | \
2301
+ <round>=<float>[,...]"
2302
+ Flambda2.Inlining. indirect_call_cost
2303
+
2304
+ let _flambda2_inline_poly_compare_cost spec =
2305
+ Float_arg_helper. parse spec
2306
+ " Syntax: -flambda2-inline-poly-compare-cost <float> | \
2307
+ <round>=<float>[,...]"
2308
+ Flambda2.Inlining. poly_compare_cost
2309
+
2310
+ let _flambda2_inline_small_function_size spec =
2311
+ Int_arg_helper. parse spec
2312
+ " Syntax: -flambda2-inline-small-function-size <int> | \
2313
+ <round>=<int>[,...]"
2314
+ Flambda2.Inlining. small_function_size
2315
+
2316
+ let _flambda2_inline_large_function_size spec =
2317
+ Int_arg_helper. parse spec
2318
+ " Syntax: -flambda2-inline-large-function-size <int> | \
2319
+ <round>=<int>[,...]"
2320
+ Flambda2.Inlining. large_function_size
2321
+
2322
+ let _flambda2_inline_threshold spec =
2323
+ Float_arg_helper. parse spec
2324
+ " Syntax: -flambda2-inline-threshold <float> | <round>=<float>[,...]"
2325
+ Flambda2.Inlining. threshold
2163
2326
end
2164
2327
2165
2328
module Compiler = struct
0 commit comments