Move Semantics_of_primitives to bytecomp/ and use it in closure.

master
alainfrisch 2016-12-22 10:52:34 +01:00
parent 6ee0d0538b
commit 5dce0914e2
5 changed files with 17 additions and 98 deletions

22
.depend
View File

@ -1134,11 +1134,11 @@ asmcomp/strmatch.cmx : bytecomp/lambda.cmx typing/ident.cmx \
middle_end/debuginfo.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \
asmcomp/strmatch.cmi
asmcomp/strmatch.cmi : middle_end/debuginfo.cmi asmcomp/cmm.cmi
asmcomp/un_anf.cmo : middle_end/semantics_of_primitives.cmi \
asmcomp/un_anf.cmo : bytecomp/semantics_of_primitives.cmi \
asmcomp/printclambda.cmi utils/misc.cmi bytecomp/lambda.cmi \
typing/ident.cmi middle_end/debuginfo.cmi utils/clflags.cmi \
asmcomp/clambda.cmi parsing/asttypes.cmi asmcomp/un_anf.cmi
asmcomp/un_anf.cmx : middle_end/semantics_of_primitives.cmx \
asmcomp/un_anf.cmx : bytecomp/semantics_of_primitives.cmx \
asmcomp/printclambda.cmx utils/misc.cmx bytecomp/lambda.cmx \
typing/ident.cmx middle_end/debuginfo.cmx utils/clflags.cmx \
asmcomp/clambda.cmx parsing/asttypes.cmi asmcomp/un_anf.cmi
@ -1251,10 +1251,10 @@ middle_end/closure_conversion_aux.cmi : middle_end/base_types/variable.cmi \
middle_end/debuginfo.cmo : parsing/location.cmi middle_end/debuginfo.cmi
middle_end/debuginfo.cmx : parsing/location.cmx middle_end/debuginfo.cmi
middle_end/debuginfo.cmi : parsing/location.cmi
middle_end/effect_analysis.cmo : middle_end/semantics_of_primitives.cmi \
middle_end/effect_analysis.cmo : bytecomp/semantics_of_primitives.cmi \
utils/misc.cmi bytecomp/lambda.cmi middle_end/flambda.cmi \
middle_end/effect_analysis.cmi
middle_end/effect_analysis.cmx : middle_end/semantics_of_primitives.cmx \
middle_end/effect_analysis.cmx : bytecomp/semantics_of_primitives.cmx \
utils/misc.cmx bytecomp/lambda.cmx middle_end/flambda.cmx \
middle_end/effect_analysis.cmi
middle_end/effect_analysis.cmi : middle_end/flambda.cmi
@ -1733,11 +1733,11 @@ middle_end/remove_unused_program_constructs.cmx : \
middle_end/effect_analysis.cmx \
middle_end/remove_unused_program_constructs.cmi
middle_end/remove_unused_program_constructs.cmi : middle_end/flambda.cmi
middle_end/semantics_of_primitives.cmo : bytecomp/printlambda.cmi \
utils/misc.cmi bytecomp/lambda.cmi middle_end/semantics_of_primitives.cmi
middle_end/semantics_of_primitives.cmx : bytecomp/printlambda.cmx \
utils/misc.cmx bytecomp/lambda.cmx middle_end/semantics_of_primitives.cmi
middle_end/semantics_of_primitives.cmi : bytecomp/lambda.cmi
bytecomp/semantics_of_primitives.cmo : bytecomp/printlambda.cmi \
utils/misc.cmi bytecomp/lambda.cmi bytecomp/semantics_of_primitives.cmi
bytecomp/semantics_of_primitives.cmx : bytecomp/printlambda.cmx \
utils/misc.cmx bytecomp/lambda.cmx bytecomp/semantics_of_primitives.cmi
bytecomp/semantics_of_primitives.cmi : bytecomp/lambda.cmi
middle_end/share_constants.cmo : middle_end/base_types/symbol.cmi \
middle_end/flambda_iterators.cmi middle_end/flambda.cmi \
middle_end/share_constants.cmi
@ -1790,14 +1790,14 @@ middle_end/simplify_common.cmi : middle_end/simple_value_approx.cmi \
middle_end/simplify_primitives.cmo : middle_end/base_types/tag.cmi \
middle_end/base_types/symbol.cmi middle_end/simplify_common.cmi \
middle_end/simplify_boxed_integer_ops.cmi \
middle_end/simple_value_approx.cmi middle_end/semantics_of_primitives.cmi \
middle_end/simple_value_approx.cmi bytecomp/semantics_of_primitives.cmi \
utils/misc.cmi bytecomp/lambda.cmi middle_end/inlining_cost.cmi \
middle_end/flambda.cmi utils/clflags.cmi parsing/asttypes.cmi \
middle_end/simplify_primitives.cmi
middle_end/simplify_primitives.cmx : middle_end/base_types/tag.cmx \
middle_end/base_types/symbol.cmx middle_end/simplify_common.cmx \
middle_end/simplify_boxed_integer_ops.cmx \
middle_end/simple_value_approx.cmx middle_end/semantics_of_primitives.cmx \
middle_end/simple_value_approx.cmx bytecomp/semantics_of_primitives.cmx \
utils/misc.cmx bytecomp/lambda.cmx middle_end/inlining_cost.cmx \
middle_end/flambda.cmx utils/clflags.cmx parsing/asttypes.cmi \
middle_end/simplify_primitives.cmi

View File

@ -75,6 +75,7 @@ TYPING=typing/ident.cmo typing/path.cmo \
typing/typemod.cmo
COMP=bytecomp/lambda.cmo bytecomp/printlambda.cmo \
bytecomp/semantics_of_primitives.cmo \
bytecomp/typeopt.cmo bytecomp/switch.cmo bytecomp/matching.cmo \
bytecomp/translobj.cmo bytecomp/translattribute.cmo \
bytecomp/translcore.cmo \
@ -157,7 +158,6 @@ MIDDLE_END=\
middle_end/base_types/export_id.cmo \
middle_end/base_types/symbol.cmo \
middle_end/pass_wrapper.cmo \
middle_end/semantics_of_primitives.cmo \
middle_end/allocated_const.cmo \
middle_end/projection.cmo \
middle_end/flambda.cmo \

View File

@ -201,92 +201,11 @@ let lambda_smaller lam threshold =
with Exit ->
false
let is_pure_prim = function
(* Obvious side-effects *)
| Psetglobal _ | Psetfield _ | Psetfloatfield _ | Pduprecord _
| Poffsetref _ | Pbytessetu | Pbytessets
| Parraysetu _ | Parraysets _ | Pbigarrayset _
| Pccall _ | Praise _
| Prevapply
| Pdirapply
| Plazyforce
| Pstring_set_16 _
| Pstring_set_32 _
| Pstring_set_64 _
| Pbigstring_set_16 _
| Pbigstring_set_32 _
| Pbigstring_set_64 _
(* can raise Division by zero *)
| Pdivint _ | Pmodint _
| Pdivbint _
| Pmodbint _
(* can raise Out of bound *)
| Parrayrefs _
| Pstringrefs
| Pbytesrefs
| Pbigarrayref _
| Pstring_load_16 _
| Pstring_load_32 _
| Pstring_load_64 _
| Pbigstring_load_16 _
| Pbigstring_load_32 _
| Pbigstring_load_64 _
-> false
(* Pure primitives *)
| Pidentity
| Pbytes_to_string
| Pbytes_of_string
| Pignore
| Ploc _
| Pgetglobal _
| Pmakeblock _
| Pfield _
| Pfloatfield _
| Psequand | Psequor | Pnot
| Pnegint | Paddint | Psubint | Pmulint
| Pandint | Porint | Pxorint
| Plslint | Plsrint | Pasrint
| Pintcomp _
| Poffsetint _
| Pintoffloat | Pfloatofint
| Pnegfloat | Pabsfloat
| Paddfloat | Psubfloat | Pmulfloat | Pdivfloat
| Pfloatcomp _
| Pstringrefu
| Parrayrefu _
| Pstringlength
| Pbyteslength | Pbytesrefu
| Pmakearray _
| Pduparray _
| Parraylength _
| Pisint
| Pisout
| Pbittest
| Pbintofint _
| Pintofbint _
| Pcvtbint _
| Pnegbint _
| Paddbint _
| Psubbint _
| Pmulbint _
| Pandbint _
| Porbint _
| Pxorbint _
| Plslbint _
| Plsrbint _
| Pasrbint _
| Pbintcomp _
| Pbigarraydim _
| Pctconst _
| Pbswap16
| Pbbswap _
| Pint_as_pointer
| Popaque ->
true
let is_pure_prim p =
let open Semantics_of_primitives in
match Semantics_of_primitives.for_primitive p with
| (No_effects | Only_generative_effects), _ -> true
| Arbitrary_effects, _ -> false
(* Check if a clambda term is ``pure'',
that is without side-effects *and* not containing function definitions *)