Skip to content

Commit 6ab7196

Browse files
committed
Add attributes "check noalloc" "check noalloc_exn" "check noeffects"
Propagate through Flambda to Cmm
1 parent 04c191e commit 6ab7196

26 files changed

+81
-19
lines changed

backend/cmmgen.ml

+7
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,12 @@ and transl_letrec env bindings cont =
14601460
fill_blocks rem
14611461
in init_blocks bsz
14621462

1463+
let transl_attrib : Lambda.check_attribute -> Cmm.codegen_option list = function
1464+
| Noalloc_check -> [ Noalloc_check ]
1465+
| Noalloc_exn_check -> [ Noalloc_exn_check ]
1466+
| Noeffects_check -> [ Noeffect_check ]
1467+
| Default_check -> []
1468+
14631469
(* Translate a function definition *)
14641470

14651471
let transl_function f =
@@ -1471,6 +1477,7 @@ let transl_function f =
14711477
else
14721478
transl env body in
14731479
let fun_codegen_options =
1480+
transl_attrib f.attrib @
14741481
if !Clflags.optimize_for_speed then
14751482
[]
14761483
else

middle_end/clambda.ml

+1
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ and ufunction = {
100100
dbg : Debuginfo.t;
101101
env : Backend_var.t option;
102102
mode : Lambda.alloc_mode;
103+
attrib : Lambda.check_attribute;
103104
}
104105

105106
and ulambda_switch =

middle_end/clambda.mli

+1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ and ufunction = {
111111
dbg : Debuginfo.t;
112112
env : Backend_var.t option;
113113
mode : Lambda.alloc_mode;
114+
attrib : Lambda.check_attribute;
114115
}
115116

116117
and ulambda_switch =

middle_end/closure/closure.ml

+9-7
Original file line numberDiff line numberDiff line change
@@ -1394,9 +1394,10 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs =
13941394
let uncurried_defs =
13951395
List.map
13961396
(function
1397-
(id, Lfunction({kind; params; return; body; loc; mode; region}
1397+
(id, Lfunction({kind; params; return; body; attr; loc; mode; region}
13981398
as funct)) ->
13991399
Lambda.check_lfunction funct;
1400+
let attrib = attr.check in
14001401
let label = Compilenv.make_fun_symbol loc (V.unique_name id) in
14011402
let arity = List.length params in
14021403
let fundesc =
@@ -1407,20 +1408,20 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs =
14071408
fun_float_const_prop = !Clflags.float_const_prop;
14081409
fun_region = region} in
14091410
let dbg = Debuginfo.from_location loc in
1410-
(id, params, return, body, mode, fundesc, dbg)
1411+
(id, params, return, body, mode, attrib, fundesc, dbg)
14111412
| (_, _) -> fatal_error "Closure.close_functions")
14121413
fun_defs in
14131414
(* Build an approximate fenv for compiling the functions *)
14141415
let fenv_rec =
14151416
List.fold_right
1416-
(fun (id, _params, _return, _body, mode, fundesc, _dbg) fenv ->
1417+
(fun (id, _params, _return, _body, mode, _attrib, fundesc, _dbg) fenv ->
14171418
V.Map.add id (Value_closure(mode, fundesc, Value_unknown)) fenv)
14181419
uncurried_defs fenv in
14191420
(* Determine the offsets of each function's closure in the shared block *)
14201421
let env_pos = ref (-1) in
14211422
let clos_offsets =
14221423
List.map
1423-
(fun (_id, _params, _return, _body, _mode, fundesc, _dbg) ->
1424+
(fun (_id, _params, _return, _body, _mode, _attrib, fundesc, _dbg) ->
14241425
let pos = !env_pos + 1 in
14251426
env_pos := !env_pos + 1 +
14261427
(match fundesc.fun_arity with (Curried _, (0|1)) -> 2 | _ -> 3);
@@ -1431,13 +1432,13 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs =
14311432
does not use its environment parameter is invalidated. *)
14321433
let useless_env = ref initially_closed in
14331434
(* Translate each function definition *)
1434-
let clos_fundef (id, params, return, body, mode, fundesc, dbg) env_pos =
1435+
let clos_fundef (id, params, return, body, mode, attrib, fundesc, dbg) env_pos =
14351436
let env_param = V.create_local "env" in
14361437
let cenv_fv =
14371438
build_closure_env env_param (fv_pos - env_pos) fv in
14381439
let cenv_body =
14391440
List.fold_right2
1440-
(fun (id, _params, _return, _body, _mode, _fundesc, _dbg) pos env ->
1441+
(fun (id, _params, _return, _body, _mode, _attrib, _fundesc, _dbg) pos env ->
14411442
V.Map.add id (Uoffset(Uvar env_param, pos - env_pos)) env)
14421443
uncurried_defs clos_offsets cenv_fv in
14431444
let (ubody, approx) =
@@ -1459,6 +1460,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs =
14591460
dbg;
14601461
env = Some env_param;
14611462
mode;
1463+
attrib;
14621464
}
14631465
in
14641466
(* give more chance of function with default parameters (i.e.
@@ -1497,7 +1499,7 @@ and close_functions { backend; fenv; cenv; mutable_vars } fun_defs =
14971499
recompile *)
14981500
Compilenv.backtrack snap; (* PR#6337 *)
14991501
List.iter
1500-
(fun (_id, _params, _return, _body, _mode, fundesc, _dbg) ->
1502+
(fun (_id, _params, _return, _body, _mode, _attrib, fundesc, _dbg) ->
15011503
fundesc.fun_closed <- false;
15021504
fundesc.fun_inline <- None;
15031505
)

middle_end/flambda/augment_specialised_args.ml

+2
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ module Make (T : S) = struct
546546
~stub:true
547547
~inline:Default_inline
548548
~specialise:Default_specialise
549+
~check:Default_check
549550
~is_a_functor:false
550551
~closure_origin:function_decl.closure_origin
551552
in
@@ -639,6 +640,7 @@ module Make (T : S) = struct
639640
~stub:function_decl.stub
640641
~inline:function_decl.inline
641642
~specialise:function_decl.specialise
643+
~check:function_decl.check
642644
~is_a_functor:function_decl.is_a_functor
643645
~closure_origin
644646
in

middle_end/flambda/closure_conversion.ml

+2-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ let tupled_function_call_stub original_params unboxed_version ~closure_bound_var
107107
let tuple_param = Parameter.wrap tuple_param_var alloc_mode in
108108
Flambda.create_function_declaration ~params:[tuple_param] ~alloc_mode ~region
109109
~body ~stub:true ~inline:Default_inline
110-
~specialise:Default_specialise ~is_a_functor:false
110+
~specialise:Default_specialise ~check:Default_check ~is_a_functor:false
111111
~closure_origin:(Closure_origin.create (Closure_id.wrap closure_bound_var))
112112

113113
let register_const t (constant:Flambda.constant_defining_value) name
@@ -650,6 +650,7 @@ and close_functions t external_env function_declarations : Flambda.named =
650650
~body ~stub
651651
~inline:(Function_decl.inline decl)
652652
~specialise:(Function_decl.specialise decl)
653+
~check:(Function_decl.check decl)
653654
~is_a_functor:(Function_decl.is_a_functor decl)
654655
~closure_origin
655656
in

middle_end/flambda/closure_conversion_aux.ml

+1
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ module Function_decls = struct
125125
let free_idents t = t.free_idents_of_body
126126
let inline t = t.attr.inline
127127
let specialise t = t.attr.specialise
128+
let check t = t.attr.check
128129
let is_a_functor t = t.attr.is_a_functor
129130
let stub t = t.attr.stub
130131
let loc t = t.loc

middle_end/flambda/closure_conversion_aux.mli

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ module Function_decls : sig
7373
val body : t -> Lambda.lambda
7474
val inline : t -> Lambda.inline_attribute
7575
val specialise : t -> Lambda.specialise_attribute
76+
val check : t -> Lambda.check_attribute
7677
val is_a_functor : t -> bool
7778
val stub : t -> bool
7879
val loc : t -> Lambda.scoped_location

middle_end/flambda/export_info_for_pack.ml

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ and import_function_declarations_for_pack_aux units pack
146146
~stub:function_decl.stub
147147
~inline:function_decl.inline
148148
~specialise:function_decl.specialise
149+
~check:function_decl.check
149150
~is_a_functor:function_decl.is_a_functor
150151
~closure_origin:function_decl.closure_origin)
151152
function_decls.funs

middle_end/flambda/flambda.ml

+15-3
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ and function_declaration = {
137137
dbg : Debuginfo.t;
138138
inline : Lambda.inline_attribute;
139139
specialise : Lambda.specialise_attribute;
140+
check : Lambda.check_attribute;
140141
is_a_functor : bool;
141142
}
142143

@@ -406,8 +407,15 @@ and print_function_declaration ppf var (f : function_declaration) =
406407
| Never_specialise -> " *never_specialise*"
407408
| Default_specialise -> ""
408409
in
409-
fprintf ppf "@[<2>(%a%s%s%s%s@ =@ fun@[<2>%a@] ->@ @[<2>%a@])@]@ "
410-
Variable.print var stub is_a_functor inline specialise
410+
let check =
411+
match f.check with
412+
| Noalloc_check -> " *noalloc_check*"
413+
| Noalloc_exn_check -> " *noalloc_exn_check*"
414+
| Noeffects_check -> " *noeffects_check*"
415+
| Default_check -> ""
416+
in
417+
fprintf ppf "@[<2>(%a%s%s%s%s%s@ =@ fun@[<2>%a@] ->@ @[<2>%a@])@]@ "
418+
Variable.print var stub is_a_functor inline specialise check
411419
params f.params lam f.body
412420

413421
and print_set_of_closures ppf (set_of_closures : set_of_closures) =
@@ -1042,6 +1050,7 @@ let update_body_of_function_declaration (func_decl: function_declaration)
10421050
stub = func_decl.stub;
10431051
dbg = func_decl.dbg;
10441052
inline = func_decl.inline;
1053+
check = func_decl.check;
10451054
specialise = func_decl.specialise;
10461055
is_a_functor = func_decl.is_a_functor;
10471056
}
@@ -1056,7 +1065,9 @@ let rec check_param_modes mode = function
10561065

10571066
let create_function_declaration ~params ~alloc_mode ~region ~body ~stub
10581067
~(inline : Lambda.inline_attribute)
1059-
~(specialise : Lambda.specialise_attribute) ~is_a_functor
1068+
~(specialise : Lambda.specialise_attribute)
1069+
~(check : Lambda.check_attribute)
1070+
~is_a_functor
10601071
~closure_origin
10611072
: function_declaration =
10621073
begin match stub, inline with
@@ -1090,6 +1101,7 @@ let create_function_declaration ~params ~alloc_mode ~region ~body ~stub
10901101
dbg = dbg_origin;
10911102
inline;
10921103
specialise;
1104+
check;
10931105
is_a_functor;
10941106
}
10951107

middle_end/flambda/flambda.mli

+3
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ and function_declaration = private {
336336
(** Inlining requirements from the source code. *)
337337
specialise : Lambda.specialise_attribute;
338338
(** Specialising requirements from the source code. *)
339+
check : Lambda.check_attribute;
340+
(** Check function properties requirements from the source code *)
339341
is_a_functor : bool;
340342
(** Whether the function is known definitively to be a functor. *)
341343
}
@@ -567,6 +569,7 @@ val create_function_declaration
567569
-> stub:bool
568570
-> inline:Lambda.inline_attribute
569571
-> specialise:Lambda.specialise_attribute
572+
-> check:Lambda.check_attribute
570573
-> is_a_functor:bool
571574
-> closure_origin:Closure_origin.t
572575
-> function_declaration

middle_end/flambda/flambda_to_clambda.ml

+2
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ and to_clambda_set_of_closures t env
578578
dbg = function_decl.dbg;
579579
env = Some env_var;
580580
mode = set_of_closures.alloc_mode;
581+
attrib = function_decl.check;
581582
}
582583
in
583584
let funs = List.map to_clambda_function all_functions in
@@ -627,6 +628,7 @@ and to_clambda_closed_set_of_closures t env symbol
627628
dbg = function_decl.dbg;
628629
env = None;
629630
mode = Lambda.alloc_heap;
631+
attrib = function_decl.check;
630632
}
631633
in
632634
let ufunct = List.map to_clambda_function functions in

middle_end/flambda/flambda_utils.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ let make_closure_declaration
364364
Flambda.create_function_declaration
365365
~params:(List.map subst_param params) ~alloc_mode ~region
366366
~body ~stub ~inline:Default_inline
367-
~specialise:Default_specialise ~is_a_functor:false
367+
~specialise:Default_specialise ~check:Default_check ~is_a_functor:false
368368
~closure_origin:(Closure_origin.create (Closure_id.wrap id))
369369
in
370370
assert (Variable.Set.equal (Variable.Set.map subst free_variables)

middle_end/flambda/freshening.ml

+1
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,7 @@ module Project_var = struct
326326
~body
327327
~stub:func_decl.stub
328328
~inline:func_decl.inline ~specialise:func_decl.specialise
329+
~check:func_decl.check
329330
~is_a_functor:func_decl.is_a_functor
330331
~closure_origin:func_decl.closure_origin
331332
in

middle_end/flambda/inline_and_simplify.ml

+2
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ and simplify_set_of_closures original_env r
615615
~alloc_mode:function_decl.alloc_mode ~region:function_decl.region
616616
~body ~stub:function_decl.stub
617617
~inline:function_decl.inline ~specialise:function_decl.specialise
618+
~check:function_decl.check
618619
~is_a_functor:function_decl.is_a_functor
619620
~closure_origin:function_decl.closure_origin
620621
in
@@ -1500,6 +1501,7 @@ and duplicate_function ~env ~(set_of_closures : Flambda.set_of_closures)
15001501
~alloc_mode:function_decl.alloc_mode ~region:function_decl.region
15011502
~body ~stub:function_decl.stub
15021503
~inline:function_decl.inline ~specialise:function_decl.specialise
1504+
~check:function_decl.check
15031505
~is_a_functor:function_decl.is_a_functor
15041506
~closure_origin:(Closure_origin.create (Closure_id.wrap new_fun_var))
15051507
in

middle_end/flambda/inlining_transforms.ml

+1
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ let rewrite_function ~lhs_of_application ~closure_id_being_applied
543543
~stub:function_body.stub
544544
~inline:function_body.inline
545545
~specialise:function_body.specialise
546+
~check:function_body.check
546547
~is_a_functor:function_body.is_a_functor
547548
~closure_origin:(Closure_origin.create (Closure_id.wrap new_fun_var))
548549
in

middle_end/flambda/remove_unused_arguments.ml

+5-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ let remove_params unused (fun_decl: Flambda.function_declaration)
4343
~params:used_params ~alloc_mode:fun_decl.alloc_mode ~region:fun_decl.region
4444
~body
4545
~stub:fun_decl.stub ~inline:fun_decl.inline
46-
~specialise:fun_decl.specialise ~is_a_functor:fun_decl.is_a_functor
46+
~specialise:fun_decl.specialise ~check:fun_decl.check
47+
~is_a_functor:fun_decl.is_a_functor
4748
~closure_origin:(Closure_origin.create (Closure_id.wrap new_fun_var))
4849

4950
let make_stub unused var (fun_decl : Flambda.function_declaration)
@@ -107,7 +108,9 @@ let make_stub unused var (fun_decl : Flambda.function_declaration)
107108
~alloc_mode:fun_decl.alloc_mode ~region:fun_decl.region
108109
~body
109110
~stub:true ~inline:Default_inline
110-
~specialise:Default_specialise ~is_a_functor:fun_decl.is_a_functor
111+
~specialise:Default_specialise
112+
~check:Default_check
113+
~is_a_functor:fun_decl.is_a_functor
111114
~closure_origin:fun_decl.closure_origin
112115
in
113116
function_decl, renamed, additional_specialised_args

middle_end/flambda/simple_value_approx.ml

+2
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ and function_body = {
8080
dbg : Debuginfo.t;
8181
inline : Lambda.inline_attribute;
8282
specialise : Lambda.specialise_attribute;
83+
check : Lambda.check_attribute;
8384
is_a_functor : bool;
8485
body : Flambda.t;
8586
}
@@ -944,6 +945,7 @@ let function_declaration_approx ~keep_body fun_var
944945
inline = fun_decl.inline;
945946
dbg = fun_decl.dbg;
946947
specialise = fun_decl.specialise;
948+
check = fun_decl.check;
947949
is_a_functor = fun_decl.is_a_functor;
948950
free_variables = fun_decl.free_variables;
949951
free_symbols = fun_decl.free_symbols; }

middle_end/flambda/simple_value_approx.mli

+1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ and function_body = private {
156156
dbg : Debuginfo.t;
157157
inline : Lambda.inline_attribute;
158158
specialise : Lambda.specialise_attribute;
159+
check : Lambda.check_attribute;
159160
is_a_functor : bool;
160161
body : Flambda.t;
161162
}

middle_end/flambda/un_anf.ml

+4-2
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ let make_var_info (clam : Clambda.ulambda) : var_info =
147147
| Uclosure (functions, captured_variables) ->
148148
List.iter (loop ~depth) captured_variables;
149149
List.iter (fun (
150-
{ Clambda. label; arity=_; params; return; body; dbg; env; mode=_} as clos) ->
150+
{ Clambda. label; arity=_; params; return; body; dbg; env; mode=_;
151+
attrib=_} as clos) ->
151152
(match closure_environment_var clos with
152153
| None -> ()
153154
| Some env_var ->
@@ -323,7 +324,8 @@ let let_bound_vars_that_can_be_moved var_info (clam : Clambda.ulambda) =
323324
| Uclosure (functions, captured_variables) ->
324325
ignore_ulambda_list captured_variables;
325326
(* Start a new let stack for speed. *)
326-
List.iter (fun {Clambda. label; arity=_; params; return; body; dbg; env; mode=_} ->
327+
List.iter (fun {Clambda. label; arity=_; params; return; body; dbg; env; mode=_;
328+
attrib=_} ->
327329
ignore_function_label label;
328330
ignore_params_with_value_kind params;
329331
ignore_value_kind return;

middle_end/flambda2/from_lambda/closure_conversion.ml

+1
Original file line numberDiff line numberDiff line change
@@ -1565,6 +1565,7 @@ let wrap_partial_application acc env apply_continuation (apply : IR.apply)
15651565
{ inline = Default_inline;
15661566
specialise = Default_specialise;
15671567
local = Default_local;
1568+
check = Default_check;
15681569
is_a_functor = false;
15691570
stub = false
15701571
}

middle_end/printclambda.ml

+8-2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ let rec value_kind0 ppf kind =
5252

5353
let value_kind kind = Format.asprintf "%a" value_kind0 kind
5454

55+
let check : Lambda.check_attribute -> string = function
56+
| Default_check -> ""
57+
| Noalloc_check -> " noalloc_check"
58+
| Noalloc_exn_check -> " noalloc_exn_check"
59+
| Noeffects_check -> " noeffects_check"
60+
5561
let rec structured_constant ppf = function
5662
| Uconst_float x -> fprintf ppf "%F" x
5763
| Uconst_int32 x -> fprintf ppf "%ldl" x
@@ -84,8 +90,8 @@ and one_fun ppf f =
8490
Printlambda.value_kind k
8591
)
8692
in
87-
fprintf ppf "(fun@ %s%s@ %d@ @[<2>%a@]@ @[<2>%a@])"
88-
f.label (value_kind f.return) (snd f.arity) idents f.params lam f.body
93+
fprintf ppf "(fun@ %s%s%s@ %d@ @[<2>%a@]@ @[<2>%a@])"
94+
f.label (value_kind f.return) (check f.attrib) (snd f.arity) idents f.params lam f.body
8995

9096
and phantom_defining_expr ppf = function
9197
| Uphantom_const const -> uconstant ppf const

ocaml/lambda/lambda.ml

+1
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ let default_function_attribute = {
527527
inline = Default_inline;
528528
specialise = Default_specialise;
529529
local = Default_local;
530+
check = Default_check ;
530531
is_a_functor = false;
531532
stub = false;
532533
}

0 commit comments

Comments
 (0)