Skip to content

Commit dc9b7fd

Browse files
authored
flambda-backend: Only speculate during inlining if argument types have useful information (#343)
1 parent aa190ec commit dc9b7fd

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-0
lines changed

driver/compenv.ml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,9 @@ let read_one_param ppf position name v =
439439
Float_arg_helper.parse v
440440
"Bad syntax in OCAMLPARAM for 'flambda2-inline-threshold'"
441441
Flambda2.Inlining.threshold
442+
| "flambda2-speculative-inlining-only-if-arguments-useful" ->
443+
set "flambda2-speculative-inlining-only-if-arguments-useful"
444+
[Flambda2.Inlining.speculative_inlining_only_if_arguments_useful] v
442445
| "flambda2-treat-invalid-code-as-unreachable" ->
443446
set "flambda2-treat-invalid-code-as-unreachable"
444447
[Flambda2.treat_invalid_code_as_unreachable] v

driver/main_args.ml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,24 @@ let mk_flambda2_inline_threshold f =
11601160
\ more aggressive) (Flambda 2 only)"
11611161
Clflags.Flambda2.Inlining.Default.threshold
11621162

1163+
let mk_flambda2_speculative_inlining_only_if_arguments_useful f =
1164+
"-flambda2-speculative-inlining-only-if-arguments-useful", Arg.Unit f,
1165+
Printf.sprintf " Only\n\
1166+
\ perform speculative inlining if the Flambda type system has\n\
1167+
\ useful information about the argument(s) at the call site%s\n\
1168+
\ (Flambda 2 only)"
1169+
(format_default
1170+
Flambda2.Inlining.Default.speculative_inlining_only_if_arguments_useful)
1171+
1172+
let mk_no_flambda2_speculative_inlining_only_if_arguments_useful f =
1173+
"-no-flambda2-speculative-inlining-only-if-arguments-useful", Arg.Unit f,
1174+
Printf.sprintf " Ignore\n\
1175+
\ whether the Flambda type system has useful information\n\
1176+
\ about the argument(s) at the call site when performing\n\
1177+
\ speculative inlining%s (Flambda 2 only)"
1178+
(format_not_default
1179+
Flambda2.Inlining.Default.speculative_inlining_only_if_arguments_useful)
1180+
11631181
let mk_flambda2_treat_invalid_code_as_unreachable f =
11641182
"-flambda2-treat-invalid-code-as-unreachable", Arg.Unit f,
11651183
Printf.sprintf " Treat code deemed as\n\
@@ -1452,6 +1470,8 @@ module type Optcommon_options = sig
14521470
val _flambda2_inline_small_function_size : string -> unit
14531471
val _flambda2_inline_large_function_size : string -> unit
14541472
val _flambda2_inline_threshold : string -> unit
1473+
val _flambda2_speculative_inlining_only_if_arguments_useful : unit -> unit
1474+
val _no_flambda2_speculative_inlining_only_if_arguments_useful : unit -> unit
14551475

14561476
val _flambda2_inlining_report_bin : unit -> unit
14571477

@@ -1850,6 +1870,10 @@ struct
18501870
mk_flambda2_inline_large_function_size
18511871
F._flambda2_inline_large_function_size;
18521872
mk_flambda2_inline_threshold F._flambda2_inline_threshold;
1873+
mk_flambda2_speculative_inlining_only_if_arguments_useful
1874+
F._flambda2_speculative_inlining_only_if_arguments_useful;
1875+
mk_no_flambda2_speculative_inlining_only_if_arguments_useful
1876+
F._no_flambda2_speculative_inlining_only_if_arguments_useful;
18531877

18541878
mk_flambda2_inlining_report_bin F._flambda2_inlining_report_bin;
18551879

@@ -2035,6 +2059,10 @@ module Make_opttop_options (F : Opttop_options) = struct
20352059
mk_flambda2_inline_large_function_size
20362060
F._flambda2_inline_large_function_size;
20372061
mk_flambda2_inline_threshold F._flambda2_inline_threshold;
2062+
mk_flambda2_speculative_inlining_only_if_arguments_useful
2063+
F._flambda2_speculative_inlining_only_if_arguments_useful;
2064+
mk_no_flambda2_speculative_inlining_only_if_arguments_useful
2065+
F._no_flambda2_speculative_inlining_only_if_arguments_useful;
20382066

20392067
mk_flambda2_inlining_report_bin F._flambda2_inlining_report_bin;
20402068

@@ -2425,6 +2453,12 @@ module Default = struct
24252453
"Syntax: -flambda2-inline-threshold <float> | <round>=<float>[,...]"
24262454
Flambda2.Inlining.threshold
24272455

2456+
let _flambda2_speculative_inlining_only_if_arguments_useful =
2457+
set Flambda2.Inlining.speculative_inlining_only_if_arguments_useful
2458+
2459+
let _no_flambda2_speculative_inlining_only_if_arguments_useful =
2460+
clear Flambda2.Inlining.speculative_inlining_only_if_arguments_useful
2461+
24282462
let _flambda2_inlining_report_bin = set Flambda2.Inlining.report_bin
24292463

24302464
let _flambda2_unicode = set Flambda2.unicode

driver/main_args.mli

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@ module type Optcommon_options = sig
257257
val _flambda2_inline_large_function_size : string -> unit
258258
val _flambda2_inline_threshold : string -> unit
259259

260+
val _flambda2_speculative_inlining_only_if_arguments_useful : unit -> unit
261+
val _no_flambda2_speculative_inlining_only_if_arguments_useful : unit -> unit
262+
260263
val _flambda2_inlining_report_bin : unit -> unit
261264

262265
val _flambda2_unicode : unit -> unit

utils/clflags.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,8 @@ module Flambda2 = struct
536536
let large_function_size = 10
537537

538538
let threshold = 10.
539+
540+
let speculative_inlining_only_if_arguments_useful = true
539541
end
540542

541543
module F = Float_arg_helper
@@ -555,6 +557,9 @@ module Flambda2 = struct
555557

556558
let threshold = ref (F.default Default.threshold)
557559

560+
let speculative_inlining_only_if_arguments_useful =
561+
ref Default.speculative_inlining_only_if_arguments_useful
562+
558563
let report_bin = ref false
559564

560565
type inlining_arguments = {

utils/clflags.mli

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ module Flambda2 : sig
288288
val large_function_size : int
289289

290290
val threshold : float
291+
292+
val speculative_inlining_only_if_arguments_useful : bool
291293
end
292294

293295
val max_depth : Int_arg_helper.parsed ref
@@ -304,6 +306,8 @@ module Flambda2 : sig
304306

305307
val threshold : Float_arg_helper.parsed ref
306308

309+
val speculative_inlining_only_if_arguments_useful : bool ref
310+
307311
val report_bin : bool ref
308312
end
309313
end

0 commit comments

Comments
 (0)