diff options
Diffstat (limited to 'middle_end')
-rw-r--r-- | middle_end/clambda_primitives.ml | 16 | ||||
-rw-r--r-- | middle_end/clambda_primitives.mli | 17 | ||||
-rw-r--r-- | middle_end/closure/closure.ml | 21 | ||||
-rw-r--r-- | middle_end/convert_primitives.ml | 15 | ||||
-rw-r--r-- | middle_end/flambda/build_export_info.ml | 2 | ||||
-rw-r--r-- | middle_end/flambda/closure_conversion.ml | 6 | ||||
-rw-r--r-- | middle_end/flambda/extract_projections.ml | 2 | ||||
-rw-r--r-- | middle_end/flambda/flambda_to_clambda.ml | 13 | ||||
-rw-r--r-- | middle_end/flambda/flambda_utils.ml | 4 | ||||
-rw-r--r-- | middle_end/flambda/inline_and_simplify.ml | 2 | ||||
-rw-r--r-- | middle_end/flambda/lift_constants.ml | 4 | ||||
-rw-r--r-- | middle_end/flambda/lift_let_to_initialize_symbol.ml | 4 | ||||
-rw-r--r-- | middle_end/flambda/ref_to_variables.ml | 2 | ||||
-rw-r--r-- | middle_end/flambda/remove_unused_program_constructs.ml | 8 | ||||
-rw-r--r-- | middle_end/internal_variable_names.ml | 42 | ||||
-rw-r--r-- | middle_end/printclambda_primitives.ml | 22 | ||||
-rw-r--r-- | middle_end/semantics_of_primitives.ml | 9 |
17 files changed, 154 insertions, 35 deletions
diff --git a/middle_end/clambda_primitives.ml b/middle_end/clambda_primitives.ml index 3dd0587972..eace031fab 100644 --- a/middle_end/clambda_primitives.ml +++ b/middle_end/clambda_primitives.ml @@ -34,13 +34,18 @@ type primitive = | Pread_symbol of string (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape - | Pfield of int + | Pfield of int * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment | Psetfield_computed of immediate_or_pointer * initialization_or_assignment | Pfloatfield of int | Psetfloatfield of int * initialization_or_assignment | Pduprecord of Types.record_representation * int + (* Context switches *) + | Prunstack + | Pperform + | Presume + | Preperform (* External call *) | Pccall of Primitive.description (* Exceptions *) @@ -114,8 +119,17 @@ type primitive = | Pbbswap of boxed_integer (* Integer to external pointer *) | Pint_as_pointer + (* Atomic operations *) + | Patomic_load of {immediate_or_pointer : immediate_or_pointer} + | Patomic_exchange + | Patomic_cas + | Patomic_fetch_add (* Inhibition of optimisation *) | Popaque + (* Polling for interrupts *) + | Ppoll + (* nop instruction for debugging *) + | Pnop and integer_comparison = Lambda.integer_comparison = Ceq | Cne | Clt | Cgt | Cle | Cge diff --git a/middle_end/clambda_primitives.mli b/middle_end/clambda_primitives.mli index a75cd04814..74daefdd95 100644 --- a/middle_end/clambda_primitives.mli +++ b/middle_end/clambda_primitives.mli @@ -34,13 +34,18 @@ type primitive = | Pread_symbol of string (* Operations on heap blocks *) | Pmakeblock of int * mutable_flag * block_shape - | Pfield of int + | Pfield of int * immediate_or_pointer * mutable_flag | Pfield_computed | Psetfield of int * immediate_or_pointer * initialization_or_assignment | Psetfield_computed of immediate_or_pointer * initialization_or_assignment | Pfloatfield of int | Psetfloatfield of int * initialization_or_assignment | Pduprecord of Types.record_representation * int + (* Context switches *) + | Prunstack + | Pperform + | Presume + | Preperform (* External call *) | Pccall of Primitive.description (* Exceptions *) @@ -117,8 +122,18 @@ type primitive = | Pbbswap of boxed_integer (* Integer to external pointer *) | Pint_as_pointer + (* Atomic operations *) + | Patomic_load of {immediate_or_pointer : immediate_or_pointer} + | Patomic_exchange + | Patomic_cas + | Patomic_fetch_add (* Inhibition of optimisation *) | Popaque + (* Polling for interrupts *) + | Ppoll + (* nop instruction for debugging *) + | Pnop + and integer_comparison = Lambda.integer_comparison = Ceq | Cne | Clt | Cgt | Cle | Cge diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index a51768216c..bc942c27c8 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -54,7 +54,7 @@ let rec build_closure_env env_param pos = function [] -> V.Map.empty | id :: rem -> V.Map.add id - (Uprim(P.Pfield pos, [Uvar env_param], Debuginfo.none)) + (Uprim(P.Pfield(pos, Pointer, Immutable), [Uvar env_param], Debuginfo.none)) (build_closure_env env_param (pos+1) rem) (* Auxiliary for accessing globals. We change the name of the global @@ -117,10 +117,15 @@ let prim_size prim args = match prim with | Pread_symbol _ -> 1 | Pmakeblock _ -> 5 + List.length args - | Pfield _ -> 1 + | Pfield(_, isptr, Mutable) -> + begin match isptr with + | Pointer -> 2 + | Immediate -> 1 + end + | Pfield(_, _, Immutable) -> 1 | Psetfield(_f, isptr, init) -> begin match init with - | Root_initialization -> 1 (* never causes a write barrier hit *) + | Root_initialization | Assignment | Heap_initialization -> match isptr with | Pointer -> 4 @@ -478,10 +483,10 @@ let simplif_prim_pure ~backend fpc p (args, approxs) dbg = (Uprim(p, args, dbg), Value_tuple (Array.of_list approxs)) end (* Field access *) - | Pfield n, _, [ Value_const(Uconst_ref(_, Some (Uconst_block(_, l)))) ] + | Pfield (n, _, _), _, [ Value_const(Uconst_ref(_, Some (Uconst_block(_, l)))) ] when n < List.length l -> make_const (List.nth l n) - | Pfield n, [ Uprim(P.Pmakeblock _, ul, _) ], [approx] + | Pfield(n, _, _), [ Uprim(P.Pmakeblock _, ul, _) ], [approx] when n < List.length ul -> (List.nth ul n, field_approx n approx) (* Strings *) @@ -819,7 +824,7 @@ let check_constant_result ulam approx = let glb = Uprim(P.Pread_symbol id, [], Debuginfo.none) in - Uprim(P.Pfield i, [glb], Debuginfo.none), approx + Uprim(P.Pfield(i, Pointer, Immutable), [glb], Debuginfo.none), approx end | _ -> (ulam, approx) @@ -1081,10 +1086,10 @@ let rec close ({ backend; fenv; cenv ; mutable_vars } as env) lam = let dbg = Debuginfo.from_location loc in check_constant_result (getglobal dbg id) (Compilenv.global_approx id) - | Lprim(Pfield n, [lam], loc) -> + | Lprim(Pfield (n, ptr, mut), [lam], loc) -> let (ulam, approx) = close env lam in let dbg = Debuginfo.from_location loc in - check_constant_result (Uprim(P.Pfield n, [ulam], dbg)) + check_constant_result (Uprim(P.Pfield (n, ptr, mut), [ulam], dbg)) (field_approx n approx) | Lprim(Psetfield(n, is_ptr, init), [Lprim(Pgetglobal id, [], _); lam], loc)-> let (ulam, approx) = close env lam in diff --git a/middle_end/convert_primitives.ml b/middle_end/convert_primitives.ml index 4ea177393e..8ea75c2e3a 100644 --- a/middle_end/convert_primitives.ml +++ b/middle_end/convert_primitives.ml @@ -26,7 +26,8 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = match prim with | Pmakeblock (tag, mutability, shape) -> Pmakeblock (tag, mutability, shape) - | Pfield field -> Pfield field + | Pfield (field, imm_or_pointer, mutability) -> + Pfield (field, imm_or_pointer, mutability) | Pfield_computed -> Pfield_computed | Psetfield (field, imm_or_pointer, init_or_assign) -> Psetfield (field, imm_or_pointer, init_or_assign) @@ -36,6 +37,10 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Psetfloatfield (field, init_or_assign) -> Psetfloatfield (field, init_or_assign) | Pduprecord (repr, size) -> Pduprecord (repr, size) + | Prunstack -> Prunstack + | Pperform -> Pperform + | Presume -> Presume + | Preperform -> Preperform | Pccall prim -> Pccall prim | Praise kind -> Praise kind | Psequand -> Psequand @@ -139,8 +144,14 @@ let convert (prim : Lambda.primitive) : Clambda_primitives.primitive = | Pbigarraydim dim -> Pbigarraydim dim | Pbswap16 -> Pbswap16 | Pint_as_pointer -> Pint_as_pointer + | Patomic_load { immediate_or_pointer } -> + Patomic_load { immediate_or_pointer } + | Patomic_exchange -> Patomic_exchange + | Patomic_cas -> Patomic_cas + | Patomic_fetch_add -> Patomic_fetch_add | Popaque -> Popaque - + | Ppoll -> Ppoll + | Pnop -> Pnop | Pbytes_to_string | Pbytes_of_string | Pctconst _ diff --git a/middle_end/flambda/build_export_info.ml b/middle_end/flambda/build_export_info.ml index 554b69a2e2..a3cb96d251 100644 --- a/middle_end/flambda/build_export_info.ml +++ b/middle_end/flambda/build_export_info.ml @@ -286,7 +286,7 @@ and descr_of_named (env : Env.t) (named : Flambda.named) Value_block (Tag.create_exn tag, Array.of_list approxs) in Value_id (Env.new_descr env descr) - | Prim (Pfield i, [arg], _) -> + | Prim (Pfield (i, _, _), [arg], _) -> begin match Env.get_descr env (Env.find_approx env arg) with | Some (Value_block (_, fields)) when Array.length fields > i -> fields.(i) | _ -> Value_unknown diff --git a/middle_end/flambda/closure_conversion.ml b/middle_end/flambda/closure_conversion.ml index 8c731a9faa..0dd0f972bf 100644 --- a/middle_end/flambda/closure_conversion.ml +++ b/middle_end/flambda/closure_conversion.ml @@ -92,7 +92,7 @@ let tupled_function_call_stub original_params unboxed_version ~closure_bound_var let _, body = List.fold_left (fun (pos, body) param -> let lam : Flambda.named = - Prim (Pfield pos, [tuple_param_var], Debuginfo.none) + Prim (Pfield (pos, Pointer, Mutable), [tuple_param_var], Debuginfo.none) in pos + 1, Flambda.create_let param lam body) (0, call) params @@ -708,9 +708,9 @@ let lambda_to_flambda ~backend ~module_ident ~size ~filename lam Flambda.create_let sym_v (Symbol block_symbol) (Flambda.create_let result_v - (Prim (Pfield 0, [sym_v], Debuginfo.none)) + (Prim (Pfield (0, Pointer, Mutable), [sym_v], Debuginfo.none)) (Flambda.create_let value_v - (Prim (Pfield pos, [result_v], Debuginfo.none)) + (Prim (Pfield (pos, Pointer, Mutable), [result_v], Debuginfo.none)) (Var value_v)))) in let module_initializer : Flambda.program_body = diff --git a/middle_end/flambda/extract_projections.ml b/middle_end/flambda/extract_projections.ml index 33cd473ecd..a368b3bd7f 100644 --- a/middle_end/flambda/extract_projections.ml +++ b/middle_end/flambda/extract_projections.ml @@ -124,7 +124,7 @@ let rec analyse_expr ~which_variables expr = when Variable.Map.mem move.closure which_variables -> projections := Projection.Set.add (Move_within_set_of_closures move) !projections - | Prim (Pfield field_index, [var], _dbg) + | Prim (Pfield (field_index, _, _), [var], _dbg) when Variable.Map.mem var which_variables -> projections := Projection.Set.add (Field (field_index, var)) !projections diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index 6b4fae2462..c28167e042 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -371,7 +371,8 @@ and to_clambda_named t env var (named : Flambda.named) : Clambda.ulambda = Flambda.print_named named end | Read_symbol_field (symbol, field) -> - Uprim (Pfield field, [to_clambda_symbol env symbol], Debuginfo.none) + Uprim (Pfield (field, Pointer, Mutable), + [to_clambda_symbol env symbol], Debuginfo.none) | Set_of_closures set_of_closures -> to_clambda_set_of_closures t env set_of_closures | Project_closure { set_of_closures; closure_id } -> @@ -396,12 +397,13 @@ and to_clambda_named t env var (named : Flambda.named) : Clambda.ulambda = let fun_offset = get_fun_offset t closure_id in let var_offset = get_fv_offset t var in let pos = var_offset - fun_offset in - Uprim (Pfield pos, + Uprim (Pfield (pos, Pointer, Mutable), [check_field t (check_closure t ulam (Expr (Var closure))) pos (Some named)], Debuginfo.none) - | Prim (Pfield index, [block], dbg) -> - Uprim (Pfield index, [check_field t (subst_var env block) index None], dbg) + | Prim (Pfield (index, ptr, mut), [block], dbg) -> + Uprim (Pfield (index, ptr, mut), + [check_field t (subst_var env block) index None], dbg) | Prim (Psetfield (index, maybe_ptr, init), [block; new_value], dbg) -> Uprim (Psetfield (index, maybe_ptr, init), [ check_field t (subst_var env block) index None; @@ -514,7 +516,8 @@ and to_clambda_set_of_closures t env in let pos = var_offset - fun_offset in Env.add_subst env id - (Uprim (Pfield pos, [Clambda.Uvar env_var], Debuginfo.none)) + (Uprim (Pfield (pos, Pointer, Mutable), + [Clambda.Uvar env_var], Debuginfo.none)) in let env = Variable.Map.fold add_env_free_variable free_vars env in (* Add the Clambda expressions for all functions defined in the current diff --git a/middle_end/flambda/flambda_utils.ml b/middle_end/flambda/flambda_utils.ml index c204f5e67c..1eb9705a34 100644 --- a/middle_end/flambda/flambda_utils.ml +++ b/middle_end/flambda/flambda_utils.ml @@ -543,7 +543,7 @@ let substitute_read_symbol_field_for_variables Expr ( Flambda.create_let block (make_named t) (Flambda.create_let field - (Prim (Pfield h, [block], Debuginfo.none)) + (Prim (Pfield (h, Pointer, Mutable), [block], Debuginfo.none)) (Var field))) in Flambda.create_let fresh_var (make_named path) expr @@ -902,7 +902,7 @@ let projection_to_named (projection : Projection.t) : Flambda.named = | Project_closure project_closure -> Project_closure project_closure | Move_within_set_of_closures move -> Move_within_set_of_closures move | Field (field_index, var) -> - Prim (Pfield field_index, [var], Debuginfo.none) + Prim (Pfield (field_index, Pointer, Mutable), [var], Debuginfo.none) type specialised_to_same_as = | Not_specialised diff --git a/middle_end/flambda/inline_and_simplify.ml b/middle_end/flambda/inline_and_simplify.ml index 775268a2c3..538bf9ff3e 100644 --- a/middle_end/flambda/inline_and_simplify.ml +++ b/middle_end/flambda/inline_and_simplify.ml @@ -991,7 +991,7 @@ and simplify_named env r (tree : Flambda.named) : Flambda.named * R.t = let tree = Flambda.Prim (prim, args, dbg) in begin match prim, args, args_approxs with (* CR-someday mshinwell: Optimise [Pfield_computed]. *) - | Pfield field_index, [arg], [arg_approx] -> + | Pfield (field_index, _, _), [arg], [arg_approx] -> let projection : Projection.t = Field (field_index, arg) in begin match E.find_projection env ~projection with | Some var -> diff --git a/middle_end/flambda/lift_constants.ml b/middle_end/flambda/lift_constants.ml index dd60de9ce2..4af9829d85 100644 --- a/middle_end/flambda/lift_constants.ml +++ b/middle_end/flambda/lift_constants.ml @@ -89,7 +89,7 @@ let assign_symbols_and_collect_constant_definitions | Project_closure ({ closure_id } as project_closure) -> assign_existing_symbol (closure_symbol ~backend closure_id); record_definition (AA.Project_closure project_closure) - | Prim (Pfield index, [block], _) -> + | Prim (Pfield (index, _, _), [block], _) -> record_definition (AA.Field (block, index)) | Prim (Pfield _, _, _) -> Misc.fatal_errorf "[Pfield] with the wrong number of arguments" @@ -997,7 +997,7 @@ let lift_constants (program : Flambda.program) ~backend = constant_definitions in let effect_tbl = - Symbol.Tbl.map effect_tbl (fun (effect, dep) -> rewrite_expr effect, dep) + Symbol.Tbl.map effect_tbl (fun (eff, dep) -> rewrite_expr eff, dep) in let initialize_symbol_tbl = Symbol.Tbl.map initialize_symbol_tbl (fun (tag, fields, dep) -> diff --git a/middle_end/flambda/lift_let_to_initialize_symbol.ml b/middle_end/flambda/lift_let_to_initialize_symbol.ml index ccef0d8a1f..32703833b7 100644 --- a/middle_end/flambda/lift_let_to_initialize_symbol.ml +++ b/middle_end/flambda/lift_let_to_initialize_symbol.ml @@ -264,8 +264,8 @@ let add_extracted introduced program = match extracted with | Initialisation (symbol, tag, def) -> Flambda.Initialize_symbol (symbol, tag, def, program) - | Effect effect -> - Flambda.Effect (effect, program)) + | Effect eff -> + Flambda.Effect (eff, program)) introduced program let rec split_program (program : Flambda.program_body) : Flambda.program_body = diff --git a/middle_end/flambda/ref_to_variables.ml b/middle_end/flambda/ref_to_variables.ml index aa2a73c630..746374e885 100644 --- a/middle_end/flambda/ref_to_variables.ml +++ b/middle_end/flambda/ref_to_variables.ml @@ -155,7 +155,7 @@ let eliminate_ref_of_expr flam = flam and aux_named (named : Flambda.named) : Flambda.named = match named with - | Prim(Pfield field, [v], _) + | Prim(Pfield (field, _, _), [v], _) when convertible_variable v -> (match get_variable v field with | None -> Expr Proved_unreachable diff --git a/middle_end/flambda/remove_unused_program_constructs.ml b/middle_end/flambda/remove_unused_program_constructs.ml index 059d68bcba..468223dcfa 100644 --- a/middle_end/flambda/remove_unused_program_constructs.ml +++ b/middle_end/flambda/remove_unused_program_constructs.ml @@ -94,14 +94,14 @@ let rec loop (program : Flambda.program_body) Flambda.Effect (field, program), dep) (program, dep) fields end - | Effect (effect, program) -> + | Effect (eff, program) -> let program, dep = loop program in - if Effect_analysis.no_effects effect then begin + if Effect_analysis.no_effects eff then begin program, dep end else begin - let new_dep = dependency effect in + let new_dep = dependency eff in let dep = Symbol.Set.union new_dep dep in - Effect (effect, program), dep + Effect (eff, program), dep end | End symbol -> program, Symbol.Set.singleton symbol diff --git a/middle_end/internal_variable_names.ml b/middle_end/internal_variable_names.ml index d139dbb21e..98c6a8bfa8 100644 --- a/middle_end/internal_variable_names.ml +++ b/middle_end/internal_variable_names.ml @@ -172,6 +172,17 @@ let psubfloat = "Psubfloat" let psubint = "Psubint" let pxorbint = "Pxorbint" let pxorint = "Pxorint" +let patomic_cas = "Patomic_cas" +let patomic_exchange = "Patomic_exchange" +let patomic_fetch_add = "Patomic_fetch_add" +let patomic_load = "Patomic_load" +let prunstack = "Prunstack" +let pperform = "Pperform" +let presume = "Presume" +let preperform = "Preperform" +let ppoll = "Ppoll" +let pnop = "Pnop" + let pabsfloat_arg = "Pabsfloat_arg" let paddbint_arg = "Paddbint_arg" let paddfloat_arg = "Paddfloat_arg" @@ -277,6 +288,17 @@ let psubfloat_arg = "Psubfloat_arg" let psubint_arg = "Psubint_arg" let pxorbint_arg = "Pxorbint_arg" let pxorint_arg = "Pxorint_arg" +let patomic_cas_arg = "Patomic_cas_arg" +let patomic_exchange_arg = "Patomic_exchange_arg" +let patomic_fetch_add_arg = "Patomic_fetch_add_arg" +let patomic_load_arg = "Patomic_load_arg" +let prunstack_arg = "Prunstack_arg" +let pperform_arg = "Pperform_arg" +let presume_arg = "Presume_arg" +let preperform_arg = "Preperform_arg" +let ppoll_arg = "Ppoll_arg" +let pnop_arg = "Pnop_arg" + let raise = "raise" let raise_arg = "raise_arg" let read_mutable = "read_mutable" @@ -414,6 +436,16 @@ let of_primitive : Lambda.primitive -> string = function | Pbbswap _ -> pbbswap | Pint_as_pointer -> pint_as_pointer | Popaque -> popaque + | Patomic_cas -> patomic_cas + | Patomic_exchange -> patomic_exchange + | Patomic_fetch_add -> patomic_fetch_add + | Patomic_load _ -> patomic_load + | Prunstack -> prunstack + | Pperform -> pperform + | Presume -> presume + | Preperform -> preperform + | Ppoll -> ppoll + | Pnop -> pnop let of_primitive_arg : Lambda.primitive -> string = function | Pidentity -> pidentity_arg @@ -520,3 +552,13 @@ let of_primitive_arg : Lambda.primitive -> string = function | Pbbswap _ -> pbbswap_arg | Pint_as_pointer -> pint_as_pointer_arg | Popaque -> popaque_arg + | Patomic_cas -> patomic_cas_arg + | Patomic_exchange -> patomic_exchange_arg + | Patomic_fetch_add -> patomic_fetch_add_arg + | Patomic_load _ -> patomic_load_arg + | Prunstack -> prunstack_arg + | Pperform -> pperform_arg + | Presume -> presume_arg + | Preperform -> preperform_arg + | Ppoll -> ppoll_arg + | Pnop -> pnop_arg diff --git a/middle_end/printclambda_primitives.ml b/middle_end/printclambda_primitives.ml index 2e94989155..5c591bfc21 100644 --- a/middle_end/printclambda_primitives.ml +++ b/middle_end/printclambda_primitives.ml @@ -61,7 +61,14 @@ let primitive ppf (prim:Clambda_primitives.primitive) = fprintf ppf "makeblock %i%a" tag Printlambda.block_shape shape | Pmakeblock(tag, Mutable, shape) -> fprintf ppf "makemutable %i%a" tag Printlambda.block_shape shape - | Pfield n -> fprintf ppf "field %i" n + | Pfield(n, ptr, mut) -> + let instr = + match ptr, mut with + | Immediate, _ -> "field_int " + | Pointer, Mutable -> "field_mut " + | Pointer, Immutable -> "field_imm " + in + fprintf ppf "%s%i" instr n | Pfield_computed -> fprintf ppf "field_computed" | Psetfield(n, ptr, init) -> let instr = @@ -100,6 +107,10 @@ let primitive ppf (prim:Clambda_primitives.primitive) = fprintf ppf "setfloatfield%s %i" init n | Pduprecord (rep, size) -> fprintf ppf "duprecord %a %i" Printlambda.record_rep rep size + | Prunstack -> fprintf ppf "runstack" + | Pperform -> fprintf ppf "perform" + | Presume -> fprintf ppf "resume" + | Preperform -> fprintf ppf "reperform" | Pccall p -> fprintf ppf "%s" p.Primitive.prim_name | Praise k -> fprintf ppf "%s" (Lambda.raise_kind k) | Psequand -> fprintf ppf "&&" @@ -202,4 +213,13 @@ let primitive ppf (prim:Clambda_primitives.primitive) = | Pbswap16 -> fprintf ppf "bswap16" | Pbbswap(bi) -> print_boxed_integer "bswap" ppf bi | Pint_as_pointer -> fprintf ppf "int_as_pointer" + | Patomic_load {immediate_or_pointer} -> + (match immediate_or_pointer with + | Immediate -> fprintf ppf "atomic_load_imm" + | Pointer -> fprintf ppf "atomic_load_ptr") + | Patomic_exchange -> fprintf ppf "atomic_exchange" + | Patomic_cas -> fprintf ppf "atomic_cas" + | Patomic_fetch_add -> fprintf ppf "atomic_fetch_add" | Popaque -> fprintf ppf "opaque" + | Ppoll -> fprintf ppf "poll" + | Pnop -> fprintf ppf "nop" diff --git a/middle_end/semantics_of_primitives.ml b/middle_end/semantics_of_primitives.ml index 47ed8c3e59..71feafc94b 100644 --- a/middle_end/semantics_of_primitives.ml +++ b/middle_end/semantics_of_primitives.ml @@ -33,8 +33,13 @@ let for_primitive (prim : Clambda_primitives.primitive) = ( "caml_format_float" | "caml_format_int" | "caml_int32_format" | "caml_nativeint_format" | "caml_int64_format" ) } -> No_effects, No_coeffects + | Pnop -> Arbitrary_effects, Has_coeffects (* XXX KC: conservative so that + the optimiser will not move it + around. Is that right? *) | Pccall _ -> Arbitrary_effects, Has_coeffects | Praise _ -> Arbitrary_effects, No_coeffects + | Prunstack | Pperform | Presume | Preperform -> Arbitrary_effects, Has_coeffects + | Ppoll -> Arbitrary_effects, Has_coeffects | Pnot | Pnegint | Paddint @@ -115,6 +120,10 @@ let for_primitive (prim : Clambda_primitives.primitive) = | Psetfield _ | Psetfield_computed _ | Psetfloatfield _ + | Patomic_load _ + | Patomic_exchange + | Patomic_cas + | Patomic_fetch_add | Parraysetu _ | Parraysets _ | Pbytessetu |