Skip to content

Commit 72378c0

Browse files
authored
Phantom let support in Cmm (#2070)
1 parent 74e3b9a commit 72378c0

12 files changed

+171
-41
lines changed

.depend

+39-37
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,10 @@ typing/envaux.cmo : typing/subst.cmi typing/printtyp.cmi typing/path.cmi \
213213
typing/envaux.cmx : typing/subst.cmx typing/printtyp.cmx typing/path.cmx \
214214
typing/ident.cmx typing/env.cmx typing/envaux.cmi
215215
typing/envaux.cmi : typing/subst.cmi typing/path.cmi typing/env.cmi
216-
typing/ident.cmo : utils/identifiable.cmi utils/clflags.cmi typing/ident.cmi
217-
typing/ident.cmx : utils/identifiable.cmx utils/clflags.cmx typing/ident.cmi
216+
typing/ident.cmo : utils/misc.cmi utils/identifiable.cmi utils/clflags.cmi \
217+
typing/ident.cmi
218+
typing/ident.cmx : utils/misc.cmx utils/identifiable.cmx utils/clflags.cmx \
219+
typing/ident.cmi
218220
typing/ident.cmi : utils/identifiable.cmi
219221
typing/includeclass.cmo : typing/types.cmi typing/printtyp.cmi \
220222
typing/path.cmi typing/ctype.cmi parsing/builtin_attributes.cmi \
@@ -308,17 +310,17 @@ typing/printpat.cmi : typing/typedtree.cmi parsing/asttypes.cmi
308310
typing/printtyp.cmo : utils/warnings.cmi typing/types.cmi \
309311
typing/primitive.cmi typing/predef.cmi typing/path.cmi \
310312
parsing/parsetree.cmi typing/outcometree.cmi typing/oprint.cmi \
311-
utils/numbers.cmi utils/misc.cmi parsing/longident.cmi \
312-
parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \
313-
utils/clflags.cmi parsing/builtin_attributes.cmi typing/btype.cmi \
314-
parsing/asttypes.cmi typing/printtyp.cmi
313+
utils/misc.cmi parsing/longident.cmi parsing/location.cmi \
314+
typing/ident.cmi typing/env.cmi typing/ctype.cmi utils/clflags.cmi \
315+
parsing/builtin_attributes.cmi typing/btype.cmi parsing/asttypes.cmi \
316+
typing/printtyp.cmi
315317
typing/printtyp.cmx : utils/warnings.cmx typing/types.cmx \
316318
typing/primitive.cmx typing/predef.cmx typing/path.cmx \
317319
parsing/parsetree.cmi typing/outcometree.cmi typing/oprint.cmx \
318-
utils/numbers.cmx utils/misc.cmx parsing/longident.cmx \
319-
parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \
320-
utils/clflags.cmx parsing/builtin_attributes.cmx typing/btype.cmx \
321-
parsing/asttypes.cmi typing/printtyp.cmi
320+
utils/misc.cmx parsing/longident.cmx parsing/location.cmx \
321+
typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/clflags.cmx \
322+
parsing/builtin_attributes.cmx typing/btype.cmx parsing/asttypes.cmi \
323+
typing/printtyp.cmi
322324
typing/printtyp.cmi : typing/types.cmi typing/path.cmi \
323325
typing/outcometree.cmi parsing/longident.cmi parsing/location.cmi \
324326
typing/ident.cmi typing/env.cmi parsing/asttypes.cmi
@@ -836,10 +838,10 @@ asmcomp/asmpackager.cmx : typing/typemod.cmx bytecomp/translmod.cmx \
836838
utils/clflags.cmx utils/ccomp.cmx asmcomp/asmlink.cmx asmcomp/asmgen.cmx \
837839
asmcomp/asmpackager.cmi
838840
asmcomp/asmpackager.cmi : typing/env.cmi middle_end/backend_intf.cmi
839-
asmcomp/backend_var.cmo : typing/printtyp.cmi typing/path.cmi \
840-
typing/ident.cmi middle_end/debuginfo.cmi asmcomp/backend_var.cmi
841-
asmcomp/backend_var.cmx : typing/printtyp.cmx typing/path.cmx \
842-
typing/ident.cmx middle_end/debuginfo.cmx asmcomp/backend_var.cmi
841+
asmcomp/backend_var.cmo : typing/path.cmi typing/ident.cmi \
842+
middle_end/debuginfo.cmi asmcomp/backend_var.cmi
843+
asmcomp/backend_var.cmx : typing/path.cmx typing/ident.cmx \
844+
middle_end/debuginfo.cmx asmcomp/backend_var.cmi
843845
asmcomp/backend_var.cmi : typing/path.cmi typing/ident.cmi \
844846
middle_end/debuginfo.cmi
845847
asmcomp/branch_relaxation.cmo : utils/misc.cmi asmcomp/mach.cmi \
@@ -891,14 +893,14 @@ asmcomp/clambda.cmi : bytecomp/lambda.cmi middle_end/debuginfo.cmi \
891893
asmcomp/closure.cmo : utils/warnings.cmi bytecomp/switch.cmi \
892894
bytecomp/simplif.cmi bytecomp/semantics_of_primitives.cmi \
893895
typing/primitive.cmi utils/numbers.cmi utils/misc.cmi \
894-
parsing/location.cmi bytecomp/lambda.cmi typing/env.cmi \
896+
parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi \
895897
middle_end/debuginfo.cmi utils/config.cmi asmcomp/compilenv.cmi \
896898
utils/clflags.cmi asmcomp/clambda.cmi asmcomp/backend_var.cmi \
897899
parsing/asttypes.cmi asmcomp/arch.cmo asmcomp/closure.cmi
898900
asmcomp/closure.cmx : utils/warnings.cmx bytecomp/switch.cmx \
899901
bytecomp/simplif.cmx bytecomp/semantics_of_primitives.cmx \
900902
typing/primitive.cmx utils/numbers.cmx utils/misc.cmx \
901-
parsing/location.cmx bytecomp/lambda.cmx typing/env.cmx \
903+
parsing/location.cmx bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx \
902904
middle_end/debuginfo.cmx utils/config.cmx asmcomp/compilenv.cmx \
903905
utils/clflags.cmx asmcomp/clambda.cmx asmcomp/backend_var.cmx \
904906
parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/closure.cmi
@@ -914,13 +916,13 @@ asmcomp/closure_offsets.cmx : middle_end/base_types/variable.cmx \
914916
asmcomp/closure_offsets.cmi : middle_end/base_types/var_within_closure.cmi \
915917
middle_end/flambda.cmi middle_end/base_types/closure_id.cmi
916918
asmcomp/cmm.cmo : bytecomp/lambda.cmi middle_end/debuginfo.cmi \
917-
asmcomp/backend_var.cmi parsing/asttypes.cmi asmcomp/arch.cmo \
918-
asmcomp/cmm.cmi
919+
asmcomp/clambda.cmi asmcomp/backend_var.cmi parsing/asttypes.cmi \
920+
asmcomp/arch.cmo asmcomp/cmm.cmi
919921
asmcomp/cmm.cmx : bytecomp/lambda.cmx middle_end/debuginfo.cmx \
920-
asmcomp/backend_var.cmx parsing/asttypes.cmi asmcomp/arch.cmx \
921-
asmcomp/cmm.cmi
922+
asmcomp/clambda.cmx asmcomp/backend_var.cmx parsing/asttypes.cmi \
923+
asmcomp/arch.cmx asmcomp/cmm.cmi
922924
asmcomp/cmm.cmi : bytecomp/lambda.cmi middle_end/debuginfo.cmi \
923-
asmcomp/backend_var.cmi parsing/asttypes.cmi
925+
asmcomp/clambda.cmi asmcomp/backend_var.cmi parsing/asttypes.cmi
924926
asmcomp/cmmgen.cmo : asmcomp/un_anf.cmi typing/types.cmi bytecomp/switch.cmi \
925927
asmcomp/strmatch.cmi asmcomp/proc.cmi bytecomp/printlambda.cmi \
926928
typing/primitive.cmi utils/numbers.cmi utils/misc.cmi bytecomp/lambda.cmi \
@@ -1130,18 +1132,18 @@ asmcomp/mach.cmi : asmcomp/debug/reg_availability_set.cmi asmcomp/reg.cmi \
11301132
middle_end/debuginfo.cmi asmcomp/cmm.cmi asmcomp/backend_var.cmi \
11311133
asmcomp/arch.cmo
11321134
asmcomp/printclambda.cmo : bytecomp/printlambda.cmi bytecomp/lambda.cmi \
1133-
asmcomp/clambda.cmi asmcomp/backend_var.cmi parsing/asttypes.cmi \
1134-
asmcomp/printclambda.cmi
1135+
typing/ident.cmi asmcomp/clambda.cmi asmcomp/backend_var.cmi \
1136+
parsing/asttypes.cmi asmcomp/printclambda.cmi
11351137
asmcomp/printclambda.cmx : bytecomp/printlambda.cmx bytecomp/lambda.cmx \
1136-
asmcomp/clambda.cmx asmcomp/backend_var.cmx parsing/asttypes.cmi \
1137-
asmcomp/printclambda.cmi
1138+
typing/ident.cmx asmcomp/clambda.cmx asmcomp/backend_var.cmx \
1139+
parsing/asttypes.cmi asmcomp/printclambda.cmi
11381140
asmcomp/printclambda.cmi : asmcomp/clambda.cmi
1139-
asmcomp/printcmm.cmo : bytecomp/lambda.cmi middle_end/debuginfo.cmi \
1140-
asmcomp/cmm.cmi asmcomp/backend_var.cmi parsing/asttypes.cmi \
1141-
asmcomp/printcmm.cmi
1142-
asmcomp/printcmm.cmx : bytecomp/lambda.cmx middle_end/debuginfo.cmx \
1143-
asmcomp/cmm.cmx asmcomp/backend_var.cmx parsing/asttypes.cmi \
1144-
asmcomp/printcmm.cmi
1141+
asmcomp/printcmm.cmo : asmcomp/printclambda.cmi bytecomp/lambda.cmi \
1142+
middle_end/debuginfo.cmi asmcomp/cmm.cmi asmcomp/backend_var.cmi \
1143+
parsing/asttypes.cmi asmcomp/printcmm.cmi
1144+
asmcomp/printcmm.cmx : asmcomp/printclambda.cmx bytecomp/lambda.cmx \
1145+
middle_end/debuginfo.cmx asmcomp/cmm.cmx asmcomp/backend_var.cmx \
1146+
parsing/asttypes.cmi asmcomp/printcmm.cmi
11451147
asmcomp/printcmm.cmi : middle_end/debuginfo.cmi asmcomp/cmm.cmi
11461148
asmcomp/printlinear.cmo : asmcomp/printmach.cmi asmcomp/printcmm.cmi \
11471149
asmcomp/mach.cmi asmcomp/linearize.cmi middle_end/debuginfo.cmi \
@@ -2460,14 +2462,14 @@ toplevel/genprintval.cmi : typing/types.cmi typing/path.cmi \
24602462
typing/outcometree.cmi typing/env.cmi
24612463
toplevel/opttopdirs.cmo : utils/warnings.cmi typing/types.cmi \
24622464
typing/printtyp.cmi toplevel/opttoploop.cmi utils/misc.cmi \
2463-
parsing/longident.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \
2464-
utils/config.cmi driver/compdynlink.cmi utils/clflags.cmi \
2465-
asmcomp/asmlink.cmi toplevel/opttopdirs.cmi
2465+
parsing/longident.cmi typing/env.cmi typing/ctype.cmi utils/config.cmi \
2466+
driver/compdynlink.cmi utils/clflags.cmi asmcomp/asmlink.cmi \
2467+
toplevel/opttopdirs.cmi
24662468
toplevel/opttopdirs.cmx : utils/warnings.cmx typing/types.cmx \
24672469
typing/printtyp.cmx toplevel/opttoploop.cmx utils/misc.cmx \
2468-
parsing/longident.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \
2469-
utils/config.cmx driver/compdynlink.cmi utils/clflags.cmx \
2470-
asmcomp/asmlink.cmx toplevel/opttopdirs.cmi
2470+
parsing/longident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \
2471+
driver/compdynlink.cmi utils/clflags.cmx asmcomp/asmlink.cmx \
2472+
toplevel/opttopdirs.cmi
24712473
toplevel/opttopdirs.cmi : parsing/longident.cmi
24722474
toplevel/opttoploop.cmo : utils/warnings.cmi typing/types.cmi \
24732475
typing/typemod.cmi typing/typedtree.cmi typing/typecore.cmi \

Changes

+6
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,12 @@ Working version
437437
- GPR#2065: Add [Proc.destroyed_at_reloadretaddr].
438438
(Mark Shinwell, review by Damien Doligez)
439439

440+
- GPR#2060: "Phantom let" support for the Clambda language.
441+
(Mark Shinwell, review by Vincent Laviron)
442+
443+
- GPR#2070: "Phantom let" support for the Cmm language.
444+
(Mark Shinwell, review by Vincent Laviron)
445+
440446
- GPR#2072: Always associate a scope to a type
441447
(Thomas Refis, review by Jacques Garrigue and Leo White)
442448

asmcomp/afl_instrument.ml

+2
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ and instrument = function
6868

6969
(* these cases add no logging, but instrument subexpressions *)
7070
| Clet (v, e, body) -> Clet (v, instrument e, instrument body)
71+
| Cphantom_let (v, defining_expr, body) ->
72+
Cphantom_let (v, defining_expr, instrument body)
7173
| Cassign (v, e) -> Cassign (v, instrument e)
7274
| Ctuple es -> Ctuple (List.map instrument es)
7375
| Cop (op, es, dbg) -> Cop (op, List.map instrument es, dbg)

asmcomp/clambda.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ and uphantom_defining_expr =
4141
| Uphantom_var of Backend_var.t
4242
| Uphantom_offset_var of { var : Backend_var.t; offset_in_words : int; }
4343
| Uphantom_read_field of { var : Backend_var.t; field : int; }
44-
| Uphantom_read_symbol_field of { sym : uconstant; field : int; }
44+
| Uphantom_read_symbol_field of { sym : string; field : int; }
4545
| Uphantom_block of { tag : int; fields : Backend_var.t list; }
4646

4747
and ulambda =

asmcomp/clambda.mli

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ and uphantom_defining_expr =
4848
(** The phantom-let-bound-variable's value is found by adding the given
4949
number of words to the pointer contained in the given identifier, then
5050
dereferencing. *)
51-
| Uphantom_read_symbol_field of { sym : uconstant; field : int; }
51+
| Uphantom_read_symbol_field of { sym : string; field : int; }
5252
(** As for [Uphantom_read_var_field], but with the pointer specified by
5353
a symbol. *)
5454
| Uphantom_block of { tag : int; fields : Backend_var.t list; }

asmcomp/cmm.ml

+11
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ type raise_kind =
116116

117117
type rec_flag = Nonrecursive | Recursive
118118

119+
type phantom_defining_expr =
120+
| Cphantom_const_int of Targetint.t
121+
| Cphantom_const_symbol of string
122+
| Cphantom_var of Backend_var.t
123+
| Cphantom_offset_var of { var : Backend_var.t; offset_in_words : int; }
124+
| Cphantom_read_field of { var : Backend_var.t; field : int; }
125+
| Cphantom_read_symbol_field of { sym : string; field : int; }
126+
| Cphantom_block of { tag : int; fields : Backend_var.t list; }
127+
119128
type memory_chunk =
120129
Byte_unsigned
121130
| Byte_signed
@@ -159,6 +168,8 @@ type expression =
159168
| Cblockheader of nativeint * Debuginfo.t
160169
| Cvar of Backend_var.t
161170
| Clet of Backend_var.With_provenance.t * expression * expression
171+
| Cphantom_let of Backend_var.With_provenance.t
172+
* phantom_defining_expr option * expression
162173
| Cassign of Backend_var.t * expression
163174
| Ctuple of expression list
164175
| Cop of operation * expression list * Debuginfo.t

asmcomp/cmm.mli

+29
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,33 @@ type raise_kind =
9393

9494
type rec_flag = Nonrecursive | Recursive
9595

96+
type phantom_defining_expr =
97+
(* CR-soon mshinwell: Convert this to [Targetint.OCaml.t] (or whatever the
98+
representation of "target-width OCaml integers of type [int]"
99+
becomes when merged). *)
100+
| Cphantom_const_int of Targetint.t
101+
(** The phantom-let-bound variable is a constant integer.
102+
The argument must be the tagged representation of an integer within
103+
the range of type [int] on the target. (Analogously to [Cconst_int].) *)
104+
| Cphantom_const_symbol of string
105+
(** The phantom-let-bound variable is an alias for a symbol. *)
106+
| Cphantom_var of Backend_var.t
107+
(** The phantom-let-bound variable is an alias for another variable. The
108+
aliased variable must not be a bound by a phantom let. *)
109+
| Cphantom_offset_var of { var : Backend_var.t; offset_in_words : int; }
110+
(** The phantom-let-bound-variable's value is defined by adding the given
111+
number of words to the pointer contained in the given identifier. *)
112+
| Cphantom_read_field of { var : Backend_var.t; field : int; }
113+
(** The phantom-let-bound-variable's value is found by adding the given
114+
number of words to the pointer contained in the given identifier, then
115+
dereferencing. *)
116+
| Cphantom_read_symbol_field of { sym : string; field : int; }
117+
(** As for [Uphantom_read_var_field], but with the pointer specified by
118+
a symbol. *)
119+
| Cphantom_block of { tag : int; fields : Backend_var.t list; }
120+
(** The phantom-let-bound variable points at a block with the given
121+
structure. *)
122+
96123
type memory_chunk =
97124
Byte_unsigned
98125
| Byte_signed
@@ -139,6 +166,8 @@ and expression =
139166
| Cblockheader of nativeint * Debuginfo.t
140167
| Cvar of Backend_var.t
141168
| Clet of Backend_var.With_provenance.t * expression * expression
169+
| Cphantom_let of Backend_var.With_provenance.t
170+
* phantom_defining_expr option * expression
142171
| Cassign of Backend_var.t * expression
143172
| Ctuple of expression list
144173
| Cop of operation * expression list * Debuginfo.t

asmcomp/cmmgen.ml

+28-1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ let int_const n =
133133
let cint_const n =
134134
Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n)
135135

136+
let targetint_const n =
137+
Targetint.add (Targetint.shift_left (Targetint.of_int n) 1)
138+
Targetint.one
139+
136140
let add_no_overflow n x c dbg =
137141
let d = n + x in
138142
if d = 0 then c else Cop(Caddi, [c; Cconst_int d], dbg)
@@ -1789,7 +1793,30 @@ let rec transl env e =
17891793
(call_met obj args))
17901794
| Ulet(str, kind, id, exp, body) ->
17911795
transl_let env str kind id exp body
1792-
| Uphantom_let (_var, _defining_expr, body) -> transl env body
1796+
| Uphantom_let (var, defining_expr, body) ->
1797+
let defining_expr =
1798+
match defining_expr with
1799+
| None -> None
1800+
| Some defining_expr ->
1801+
let defining_expr =
1802+
match defining_expr with
1803+
| Uphantom_const (Uconst_ref (sym, _defining_expr)) ->
1804+
Cphantom_const_symbol sym
1805+
| Uphantom_read_symbol_field { sym; field; } ->
1806+
Cphantom_read_symbol_field { sym; field; }
1807+
| Uphantom_const (Uconst_int i) | Uphantom_const (Uconst_ptr i) ->
1808+
Cphantom_const_int (targetint_const i)
1809+
| Uphantom_var var -> Cphantom_var var
1810+
| Uphantom_read_field { var; field; } ->
1811+
Cphantom_read_field { var; field; }
1812+
| Uphantom_offset_var { var; offset_in_words; } ->
1813+
Cphantom_offset_var { var; offset_in_words; }
1814+
| Uphantom_block { tag; fields; } ->
1815+
Cphantom_block { tag; fields; }
1816+
in
1817+
Some defining_expr
1818+
in
1819+
Cphantom_let (var, defining_expr, transl env body)
17931820
| Uletrec(bindings, body) ->
17941821
transl_letrec env bindings (transl env body)
17951822

asmcomp/printclambda.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ and phantom_defining_expr ppf = function
7171
| Uphantom_read_field { var; field; } ->
7272
Format.fprintf ppf "%a[%d]" Backend_var.print var field
7373
| Uphantom_read_symbol_field { sym; field; } ->
74-
Format.fprintf ppf "%a[%d]" uconstant sym field
74+
Format.fprintf ppf "%s[%d]" sym field
7575
| Uphantom_block { tag; fields; } ->
7676
Format.fprintf ppf "[%d: " tag;
7777
List.iter (fun field ->

asmcomp/printclambda.mli

+5
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ open Format
1919
val clambda: formatter -> ulambda -> unit
2020
val approx: formatter -> value_approximation -> unit
2121
val structured_constant: formatter -> ustructured_constant -> unit
22+
23+
val phantom_defining_expr_opt
24+
: formatter
25+
-> uphantom_defining_expr option
26+
-> unit

asmcomp/printcmm.ml

+42
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,29 @@ let raise_kind fmt = function
7676
| Raise_withtrace -> Format.fprintf fmt "raise_withtrace"
7777
| Raise_notrace -> Format.fprintf fmt "raise_notrace"
7878

79+
let phantom_defining_expr ppf defining_expr =
80+
match defining_expr with
81+
| Cphantom_const_int i -> Targetint.print ppf i
82+
| Cphantom_const_symbol sym -> Format.pp_print_string ppf sym
83+
| Cphantom_var var -> V.print ppf var
84+
| Cphantom_offset_var { var; offset_in_words; } ->
85+
Format.fprintf ppf "%a+(%d)" V.print var offset_in_words
86+
| Cphantom_read_field { var; field; } ->
87+
Format.fprintf ppf "%a[%d]" V.print var field
88+
| Cphantom_read_symbol_field { sym; field; } ->
89+
Format.fprintf ppf "%s[%d]" sym field
90+
| Cphantom_block { tag; fields; } ->
91+
Format.fprintf ppf "[%d: " tag;
92+
List.iter (fun field ->
93+
Format.fprintf ppf "%a; " V.print field)
94+
fields;
95+
Format.fprintf ppf "]"
96+
97+
let phantom_defining_expr_opt ppf defining_expr =
98+
match defining_expr with
99+
| None -> Format.pp_print_string ppf "()"
100+
| Some defining_expr -> phantom_defining_expr ppf defining_expr
101+
79102
let operation d = function
80103
| Capply _ty -> "app" ^ Debuginfo.to_string d
81104
| Cextcall(lbl, _ty, _alloc, _) ->
@@ -147,6 +170,25 @@ let rec expr ppf = function
147170
fprintf ppf
148171
"@[<2>(let@ @[<2>%a@ %a@]@ %a)@]"
149172
VP.print id expr def sequence body
173+
| Cphantom_let(var, def, (Cphantom_let(_, _, _) as body)) ->
174+
let print_binding var ppf def =
175+
fprintf ppf "@[<2>%a@ %a@]" VP.print var
176+
phantom_defining_expr_opt def
177+
in
178+
let rec in_part ppf = function
179+
| Cphantom_let(var, def, body) ->
180+
fprintf ppf "@ %a" (print_binding var) def;
181+
in_part ppf body
182+
| exp -> exp in
183+
fprintf ppf "@[<2>(let?@ @[<1>(%a" (print_binding var) def;
184+
let exp = in_part ppf body in
185+
fprintf ppf ")@]@ %a)@]" sequence exp
186+
| Cphantom_let(var, def, body) ->
187+
fprintf ppf
188+
"@[<2>(let?@ @[<2>%a@ %a@]@ %a)@]"
189+
VP.print var
190+
phantom_defining_expr_opt def
191+
sequence body
150192
| Cassign(id, exp) ->
151193
fprintf ppf "@[<2>(assign @[<2>%a@ %a@])@]" V.print id expr exp
152194
| Ctuple el ->

asmcomp/selectgen.ml

+6
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ method is_simple_expr = function
298298
| Cvar _ -> true
299299
| Ctuple el -> List.for_all self#is_simple_expr el
300300
| Clet(_id, arg, body) -> self#is_simple_expr arg && self#is_simple_expr body
301+
| Cphantom_let(_var, _defining_expr, body) -> self#is_simple_expr body
301302
| Csequence(e1, e2) -> self#is_simple_expr e1 && self#is_simple_expr e2
302303
| Cop(op, args, _) ->
303304
begin match op with
@@ -333,6 +334,7 @@ method effects_of exp =
333334
| Ctuple el -> EC.join_list_map el self#effects_of
334335
| Clet (_id, arg, body) ->
335336
EC.join (self#effects_of arg) (self#effects_of body)
337+
| Cphantom_let (_var, _defining_expr, body) -> self#effects_of body
336338
| Csequence (e1, e2) ->
337339
EC.join (self#effects_of e1) (self#effects_of e2)
338340
| Cifthenelse (cond, ifso, ifnot) ->
@@ -670,6 +672,8 @@ method emit_expr (env:environment) exp =
670672
None -> None
671673
| Some r1 -> self#emit_expr (self#bind_let env v r1) e2
672674
end
675+
| Cphantom_let (_var, _defining_expr, body) ->
676+
self#emit_expr env body
673677
| Cassign(v, e1) ->
674678
let rv =
675679
try
@@ -1037,6 +1041,8 @@ method emit_tail (env:environment) exp =
10371041
None -> ()
10381042
| Some r1 -> self#emit_tail (self#bind_let env v r1) e2
10391043
end
1044+
| Cphantom_let (_var, _defining_expr, body) ->
1045+
self#emit_tail env body
10401046
| Cop((Capply ty) as op, args, dbg) ->
10411047
begin match self#emit_parts_list env args with
10421048
None -> ()

0 commit comments

Comments
 (0)