Skip to content

Commit 0bd2fa6

Browse files
authored
flambda-backend: Add [@inline ready] attribute and remove [@inline hint] (not [@inlined hint]) (#351)
1 parent cee74af commit 0bd2fa6

29 files changed

+208
-143
lines changed

bytecomp/bytegen.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ let rec comp_expr env exp sz cont =
685685
ap_func=func;
686686
ap_args=[arg];
687687
ap_tailcall=Default_tailcall;
688-
ap_inlined=Default_inline;
688+
ap_inlined=Default_inlined;
689689
ap_specialised=Default_specialise;
690690
ap_probe=None;
691691
} in

lambda/lambda.ml

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -235,22 +235,43 @@ type tailcall_attribute =
235235
type inline_attribute =
236236
| Always_inline (* [@inline] or [@inline always] *)
237237
| Never_inline (* [@inline never] *)
238-
| Hint_inline (* [@inlined hint] attribute *)
238+
| Available_inline (* [@inline available] *)
239239
| Unroll of int (* [@unroll x] *)
240240
| Default_inline (* no [@inline] attribute *)
241241

242-
let equal_inline_attribute x y =
242+
type inlined_attribute =
243+
| Always_inlined (* [@inlined] or [@inlined always] *)
244+
| Never_inlined (* [@inlined never] *)
245+
| Hint_inlined (* [@inlined hint] *)
246+
| Unroll of int (* [@unroll x] *)
247+
| Default_inlined (* no [@inlined] attribute *)
248+
249+
let equal_inline_attribute (x : inline_attribute) (y : inline_attribute) =
243250
match x, y with
244251
| Always_inline, Always_inline
245252
| Never_inline, Never_inline
246-
| Hint_inline, Hint_inline
253+
| Available_inline, Available_inline
247254
| Default_inline, Default_inline
248255
->
249256
true
250257
| Unroll u, Unroll v ->
251258
u = v
252259
| (Always_inline | Never_inline
253-
| Hint_inline | Unroll _ | Default_inline), _ ->
260+
| Available_inline | Unroll _ | Default_inline), _ ->
261+
false
262+
263+
let equal_inlined_attribute (x : inlined_attribute) (y : inlined_attribute) =
264+
match x, y with
265+
| Always_inlined, Always_inlined
266+
| Never_inlined, Never_inlined
267+
| Hint_inlined, Hint_inlined
268+
| Default_inlined, Default_inlined
269+
->
270+
true
271+
| Unroll u, Unroll v ->
272+
u = v
273+
| (Always_inlined | Never_inlined
274+
| Hint_inlined | Unroll _ | Default_inlined), _ ->
254275
false
255276

256277
type probe_desc = { name: string }
@@ -336,7 +357,7 @@ and lambda_apply =
336357
ap_args : lambda list;
337358
ap_loc : scoped_location;
338359
ap_tailcall : tailcall_attribute;
339-
ap_inlined : inline_attribute;
360+
ap_inlined : inlined_attribute;
340361
ap_specialised : specialise_attribute;
341362
ap_probe : probe;
342363
}

lambda/lambda.mli

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,24 @@ type tailcall_attribute =
220220
[@tailcall false] has [false] *)
221221
| Default_tailcall (* no [@tailcall] attribute *)
222222

223+
(* Function declaration inlining annotations *)
223224
type inline_attribute =
224225
| Always_inline (* [@inline] or [@inline always] *)
225226
| Never_inline (* [@inline never] *)
226-
| Hint_inline (* [@inline hint] *)
227+
| Available_inline (* [@inline available] *)
227228
| Unroll of int (* [@unroll x] *)
228229
| Default_inline (* no [@inline] attribute *)
229230

231+
(* Call site inlining annotations *)
232+
type inlined_attribute =
233+
| Always_inlined (* [@inlined] or [@inlined always] *)
234+
| Never_inlined (* [@inlined never] *)
235+
| Hint_inlined (* [@inlined hint] *)
236+
| Unroll of int (* [@unroll x] *)
237+
| Default_inlined (* no [@inlined] attribute *)
238+
230239
val equal_inline_attribute : inline_attribute -> inline_attribute -> bool
240+
val equal_inlined_attribute : inlined_attribute -> inlined_attribute -> bool
231241

232242
type probe_desc = { name: string }
233243
type probe = probe_desc option
@@ -317,7 +327,7 @@ and lambda_apply =
317327
ap_args : lambda list;
318328
ap_loc : scoped_location;
319329
ap_tailcall : tailcall_attribute;
320-
ap_inlined : inline_attribute; (* specified with the [@inlined] attribute *)
330+
ap_inlined : inlined_attribute; (* [@inlined] attribute in code *)
321331
ap_specialised : specialise_attribute;
322332
ap_probe : probe;
323333
}

lambda/matching.ml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1846,7 +1846,7 @@ let inline_lazy_force_cond arg loc =
18461846
ap_loc = loc;
18471847
ap_func = force_fun;
18481848
ap_args = [ varg ];
1849-
ap_inlined = Default_inline;
1849+
ap_inlined = Default_inlined;
18501850
ap_specialised = Default_specialise;
18511851
ap_probe=None
18521852
},
@@ -1880,7 +1880,7 @@ let inline_lazy_force_switch arg loc =
18801880
ap_loc = loc;
18811881
ap_func = force_fun;
18821882
ap_args = [ varg ];
1883-
ap_inlined = Default_inline;
1883+
ap_inlined = Default_inlined;
18841884
ap_specialised = Default_specialise;
18851885
ap_probe=None;
18861886
} )
@@ -1900,7 +1900,7 @@ let inline_lazy_force arg loc =
19001900
ap_loc = loc;
19011901
ap_func = Lazy.force code_force_lazy;
19021902
ap_args = [ arg ];
1903-
ap_inlined = Default_inline;
1903+
ap_inlined = Default_inlined;
19041904
ap_specialised = Default_specialise;
19051905
ap_probe=None;
19061906
}

lambda/printlambda.ml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ let function_attribute ppf { inline; specialise; local; is_a_functor; stub } =
507507
begin match inline with
508508
| Default_inline -> ()
509509
| Always_inline -> fprintf ppf "always_inline@ "
510-
| Hint_inline -> fprintf ppf "hint_inline@ "
510+
| Available_inline -> fprintf ppf "available_inline@ "
511511
| Never_inline -> fprintf ppf "never_inline@ "
512512
| Unroll i -> fprintf ppf "unroll(%i)@ " i
513513
end;
@@ -530,10 +530,10 @@ let apply_tailcall_attribute ppf = function
530530
fprintf ppf " tailcall(false)"
531531

532532
let apply_inlined_attribute ppf = function
533-
| Default_inline -> ()
534-
| Always_inline -> fprintf ppf " always_inline"
535-
| Never_inline -> fprintf ppf " never_inline"
536-
| Hint_inline -> fprintf ppf " hint_inline"
533+
| Default_inlined -> ()
534+
| Always_inlined -> fprintf ppf " always_inline"
535+
| Never_inlined -> fprintf ppf " never_inline"
536+
| Hint_inlined -> fprintf ppf " hint_inline"
537537
| Unroll i -> fprintf ppf " never_inline(%i)" i
538538

539539
let apply_specialised_attribute ppf = function

lambda/simplif.ml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ let simplify_exits lam =
226226
ap_func=f;
227227
ap_args=[x];
228228
ap_tailcall=Default_tailcall;
229-
ap_inlined=Default_inline;
229+
ap_inlined=Default_inlined;
230230
ap_specialised=Default_specialise;
231231
ap_probe=None;
232232
}
@@ -240,7 +240,7 @@ let simplify_exits lam =
240240
ap_func=f;
241241
ap_args=[x];
242242
ap_tailcall=Default_tailcall;
243-
ap_inlined=Default_inline;
243+
ap_inlined=Default_inlined;
244244
ap_specialised=Default_specialise;
245245
ap_probe=None;
246246
}
@@ -743,7 +743,7 @@ let split_default_wrapper ~id:fun_id ~kind ~params ~return ~body ~attr ~loc =
743743
ap_args = args;
744744
ap_loc = Loc_unknown;
745745
ap_tailcall = Default_tailcall;
746-
ap_inlined = Default_inline;
746+
ap_inlined = Default_inlined;
747747
ap_specialised = Default_specialise;
748748
ap_probe=None;
749749
}
@@ -806,10 +806,11 @@ let simplify_local_functions lam =
806806
in
807807
let enabled = function
808808
| {local = Always_local; _}
809-
| {local = Default_local; inline = (Never_inline | Default_inline); _}
809+
| {local = Default_local;
810+
inline = (Never_inline | Default_inline | Available_inline); _}
810811
-> true
811812
| {local = Default_local;
812-
inline = (Always_inline | Unroll _ | Hint_inline); _}
813+
inline = (Always_inline | Unroll _); _}
813814
| {local = Never_local; _}
814815
-> false
815816
in

lambda/translattribute.ml

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ let parse_id_payload txt loc ~default ~empty cases payload =
120120
| Some r -> r
121121
| None -> warn ()
122122

123-
let parse_inline_attribute attr =
123+
let parse_inline_attribute attr : inline_attribute =
124124
match attr with
125125
| None -> Default_inline
126126
| Some {Parsetree.attr_name = {txt;loc} as id; attr_payload = payload} ->
@@ -141,7 +141,32 @@ let parse_inline_attribute attr =
141141
[
142142
"never", Never_inline;
143143
"always", Always_inline;
144-
"hint", Hint_inline;
144+
"available", Available_inline;
145+
]
146+
payload
147+
148+
let parse_inlined_attribute attr : inlined_attribute =
149+
match attr with
150+
| None -> Default_inlined
151+
| Some {Parsetree.attr_name = {txt;loc} as id; attr_payload = payload} ->
152+
if is_unrolled id then begin
153+
(* the 'unrolled' attributes must be used as [@unrolled n]. *)
154+
let warning txt = Warnings.Attribute_payload
155+
(txt, "It must be an integer literal")
156+
in
157+
match get_payload get_int_from_exp payload with
158+
| Ok n -> Unroll n
159+
| Error () ->
160+
Location.prerr_warning loc (warning txt);
161+
Default_inlined
162+
end else
163+
parse_id_payload txt loc
164+
~default:Default_inlined
165+
~empty:Always_inlined
166+
[
167+
"never", Never_inlined;
168+
"always", Always_inlined;
169+
"hint", Hint_inlined;
145170
]
146171
payload
147172

@@ -186,7 +211,7 @@ let get_local_attribute l =
186211

187212
let check_local_inline loc attr =
188213
match attr.local, attr.inline with
189-
| Always_local, (Always_inline | Hint_inline | Unroll _) ->
214+
| Always_local, (Always_inline | Available_inline | Unroll _) ->
190215
Location.prerr_warning loc
191216
(Warnings.Duplicated_attribute "local/inline")
192217
| _ ->
@@ -198,14 +223,14 @@ let add_inline_attribute expr loc attributes =
198223
| Lfunction({ attr = { stub = false } as attr } as funct), inline ->
199224
begin match attr.inline with
200225
| Default_inline -> ()
201-
| Always_inline | Hint_inline | Never_inline | Unroll _ ->
226+
| Always_inline | Available_inline | Never_inline | Unroll _ ->
202227
Location.prerr_warning loc
203228
(Warnings.Duplicated_attribute "inline")
204229
end;
205230
let attr = { attr with inline } in
206231
check_local_inline loc attr;
207232
Lfunction { funct with attr = attr }
208-
| expr, (Always_inline | Hint_inline | Never_inline | Unroll _) ->
233+
| expr, (Always_inline | Available_inline | Never_inline | Unroll _) ->
209234
Location.prerr_warning loc
210235
(Warnings.Misplaced_attribute "inline");
211236
expr
@@ -254,23 +279,23 @@ let get_and_remove_inlined_attribute e =
254279
let attr, exp_attributes =
255280
find_attribute is_inlined_attribute e.exp_attributes
256281
in
257-
let inlined = parse_inline_attribute attr in
282+
let inlined = parse_inlined_attribute attr in
258283
inlined, { e with exp_attributes }
259284

260285
let get_and_remove_inlined_attribute_on_module e =
261286
let rec get_and_remove mod_expr =
262287
let attr, mod_attributes =
263288
find_attribute is_inlined_attribute mod_expr.mod_attributes
264289
in
265-
let attr = parse_inline_attribute attr in
290+
let attr = parse_inlined_attribute attr in
266291
let attr, mod_desc =
267292
match mod_expr.Typedtree.mod_desc with
268293
| Tmod_constraint (me, mt, mtc, mc) ->
269294
let inner_attr, me = get_and_remove me in
270295
let attr =
271296
match attr with
272-
| Always_inline | Hint_inline | Never_inline | Unroll _ -> attr
273-
| Default_inline -> inner_attr
297+
| Always_inlined | Hint_inlined | Never_inlined | Unroll _ -> attr
298+
| Default_inlined -> inner_attr
274299
in
275300
attr, Tmod_constraint (me, mt, mtc, mc)
276301
| md -> attr, md

lambda/translattribute.mli

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,11 @@ val get_local_attribute
5555

5656
val get_and_remove_inlined_attribute
5757
: Typedtree.expression
58-
-> Lambda.inline_attribute * Typedtree.expression
58+
-> Lambda.inlined_attribute * Typedtree.expression
5959

6060
val get_and_remove_inlined_attribute_on_module
6161
: Typedtree.module_expr
62-
-> Lambda.inline_attribute * Typedtree.module_expr
62+
-> Lambda.inlined_attribute * Typedtree.module_expr
6363

6464
val get_and_remove_specialised_attribute
6565
: Typedtree.expression

lambda/translclass.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ let mkappl (func, args) =
5555
ap_func=func;
5656
ap_args=args;
5757
ap_tailcall=Default_tailcall;
58-
ap_inlined=Default_inline;
58+
ap_inlined=Default_inlined;
5959
ap_specialised=Default_specialise;
6060
ap_probe=None;
6161
};;
@@ -499,7 +499,7 @@ let transl_class_rebind ~scopes cl vf =
499499
ap_func=Lvar obj_init;
500500
ap_args=[Lvar self];
501501
ap_tailcall=Default_tailcall;
502-
ap_inlined=Default_inline;
502+
ap_inlined=Default_inlined;
503503
ap_specialised=Default_specialise;
504504
ap_probe=None;
505505
}

lambda/translcore.ml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ and transl_exp0 ~in_new_scope ~scopes e =
487487
[transl_class_path loc e.exp_env cl], loc);
488488
ap_args=[lambda_unit];
489489
ap_tailcall=Default_tailcall;
490-
ap_inlined=Default_inline;
490+
ap_inlined=Default_inlined;
491491
ap_specialised=Default_specialise;
492492
ap_probe=None;
493493
}
@@ -511,7 +511,7 @@ and transl_exp0 ~in_new_scope ~scopes e =
511511
ap_func=Translobj.oo_prim "copy";
512512
ap_args=[self];
513513
ap_tailcall=Default_tailcall;
514-
ap_inlined=Default_inline;
514+
ap_inlined=Default_inlined;
515515
ap_specialised=Default_specialise;
516516
ap_probe=None;
517517
},
@@ -662,7 +662,7 @@ and transl_exp0 ~in_new_scope ~scopes e =
662662
ap_args = List.map (fun id -> Lvar id) arg_idents;
663663
ap_loc = of_location e.exp_loc ~scopes;
664664
ap_tailcall = Default_tailcall;
665-
ap_inlined = Never_inline;
665+
ap_inlined = Never_inlined;
666666
ap_specialised = Always_specialise;
667667
ap_probe = Some {name};
668668
}
@@ -741,7 +741,7 @@ and transl_tupled_cases ~scopes patl_expr_list =
741741

742742
and transl_apply ~scopes
743743
?(tailcall=Default_tailcall)
744-
?(inlined = Default_inline)
744+
?(inlined = Default_inlined)
745745
?(specialised = Default_specialise)
746746
lam sargs loc
747747
=
@@ -1207,7 +1207,7 @@ and transl_letop ~scopes loc env let_ ands param case partial =
12071207
ap_func = op;
12081208
ap_args=[Lvar left_id; Lvar right_id];
12091209
ap_tailcall = Default_tailcall;
1210-
ap_inlined = Default_inline;
1210+
ap_inlined = Default_inlined;
12111211
ap_specialised = Default_specialise;
12121212
ap_probe=None;
12131213
})
@@ -1236,7 +1236,7 @@ and transl_letop ~scopes loc env let_ ands param case partial =
12361236
ap_func = op;
12371237
ap_args=[exp; func];
12381238
ap_tailcall = Default_tailcall;
1239-
ap_inlined = Default_inline;
1239+
ap_inlined = Default_inlined;
12401240
ap_specialised = Default_specialise;
12411241
ap_probe=None;
12421242
}

lambda/translcore.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ val pure_module : module_expr -> let_kind
2626
val transl_exp: scopes:scopes -> expression -> lambda
2727
val transl_apply: scopes:scopes
2828
-> ?tailcall:tailcall_attribute
29-
-> ?inlined:inline_attribute
29+
-> ?inlined:inlined_attribute
3030
-> ?specialised:specialise_attribute
3131
-> lambda -> (arg_label * expression option) list
3232
-> scoped_location -> lambda

0 commit comments

Comments
 (0)