diff --git a/compiler/add_pragma_decl.m b/compiler/add_pragma_decl.m index 9ac34036e..16526dd47 100644 --- a/compiler/add_pragma_decl.m +++ b/compiler/add_pragma_decl.m @@ -89,6 +89,7 @@ :- import_module hlds.pred_info_types. :- import_module hlds.pred_proc_id. :- import_module hlds.pred_table. +:- import_module hlds.proc_info_types. :- import_module hlds.status. :- import_module mdbcomp. :- import_module mdbcomp.prim_data. @@ -919,8 +920,13 @@ add_pragma_struct_sharing(SharingInfo, !ModuleInfo, !ErrSpecs):- MaybePredId = ok1(PredId), PFNameArity = pf_sym_name_user_arity(PredOrFunc, SymName, UserArity), - ProcTransform = proc_info_set_imported_structure_sharing(HeadVars, - Types, SharingDomain), + ImportedSharing = imported_sharing(HeadVars, Types, SharingDomain), + ProcTransform = + ( pred(PI0::in, PI::out) is det :- + proc_info_get_sharing_reuse_info(PI0, SR0), + SR = SR0 ^ maybe_imported_sharing := yes(ImportedSharing), + proc_info_set_sharing_reuse_info(SR, PI0, PI) + ), transform_selected_mode_of_pred(PredId, PFNameArity, Modes, "structure_sharing", Context, ProcTransform, !ModuleInfo, !ErrSpecs) @@ -959,8 +965,13 @@ add_pragma_struct_reuse(ReuseInfo, !ModuleInfo, !ErrSpecs):- MaybePredId = ok1(PredId), PFNameArity = pf_sym_name_user_arity(PredOrFunc, SymName, UserArity), - ProcTransform = proc_info_set_imported_structure_reuse(HeadVars, - Types, ReuseDomain), + ImportedReuse = imported_reuse(HeadVars, Types, ReuseDomain), + ProcTransform = + ( pred(PI0::in, PI::out) is det :- + proc_info_get_sharing_reuse_info(PI0, SR0), + SR = SR0 ^ maybe_imported_reuse := yes(ImportedReuse), + proc_info_set_sharing_reuse_info(SR, PI0, PI) + ), transform_selected_mode_of_pred(PredId, PFNameArity, Modes, "structure_reuse", Context, ProcTransform, !ModuleInfo, !ErrSpecs) diff --git a/compiler/add_pragma_type_spec.m b/compiler/add_pragma_type_spec.m index 60c3149c9..4c3f8525e 100644 --- a/compiler/add_pragma_type_spec.m +++ b/compiler/add_pragma_type_spec.m @@ -41,6 +41,7 @@ :- import_module hlds.pred_name. :- import_module hlds.pred_proc_id. :- import_module hlds.pred_table. +:- import_module hlds.proc_info_types. :- import_module hlds.status. :- import_module libs. :- import_module libs.globals. @@ -495,8 +496,10 @@ add_forcing_caller_of_pred(PredId, PredInfo0, PredFormArity, TypeSpecInfo0, proc_info::in, proc_info::out) is det. reset_imported_structure_sharing_reuse(!ProcInfo) :- - proc_info_reset_imported_structure_sharing(!ProcInfo), - proc_info_reset_imported_structure_reuse(!ProcInfo). + proc_info_get_sharing_reuse_info(!.ProcInfo, SharingReuseInfo0), + SharingReuseInfo1 = SharingReuseInfo0 ^ maybe_imported_sharing := no, + SharingReuseInfo = SharingReuseInfo1 ^ maybe_imported_reuse := no, + proc_info_set_sharing_reuse_info(SharingReuseInfo, !ProcInfo). :- func tvar_subst_desc(tvar_subst) = pair(int, mer_type). diff --git a/compiler/direct_arg_in_out.m b/compiler/direct_arg_in_out.m index 1edcf376d..3028c0fc7 100644 --- a/compiler/direct_arg_in_out.m +++ b/compiler/direct_arg_in_out.m @@ -689,7 +689,7 @@ make_direct_arg_in_out_clone(ProgressStream, PredProcId, OoMInOutArgs, MaybeCallTableTip, MaybeTableIOInfo, MaybeTableAttrs, MaybeObsoleteInFavourOf, MaybeDeepProfProcInfo, MaybeArgSizes, MaybeTermInfo, Term2Info, MaybeExceptionInfo, MaybeTrailingInfo, - MaybeMMTablingInfo, SharingInfo, ReuseInfo), + MaybeMMTablingInfo, SharingReuseInfo), pred_prepare_to_clone(PredInfo0, ModuleName, PredOrFunc, PredName, OrigArity, Origin, Status, Markers, ArgTypes, DeclTypeVarSet, TypeVarSet, ExistQVars, PolyAddedArgs, ClassContext, @@ -727,7 +727,7 @@ make_direct_arg_in_out_clone(ProgressStream, PredProcId, OoMInOutArgs, StackSlots, NeedsMaxfrSlot, MaybeCallTableTip, MaybeTableIOInfo, MaybeTableAttrs, MaybeObsoleteInFavourOf, MaybeDeepProfProcInfo, MaybeArgSizes, MaybeTermInfo, Term2Info, MaybeExceptionInfo, - MaybeTrailingInfo, MaybeMMTablingInfo, SharingInfo, ReuseInfo, + MaybeTrailingInfo, MaybeMMTablingInfo, SharingReuseInfo, CloneProcInfo), ClonePredName = string.format("direct_arg_in_out_%d_%s", diff --git a/compiler/higher_order.make_specialized_preds.m b/compiler/higher_order.make_specialized_preds.m index 16b7100c7..ce7c73413 100644 --- a/compiler/higher_order.make_specialized_preds.m +++ b/compiler/higher_order.make_specialized_preds.m @@ -49,6 +49,7 @@ :- import_module hlds.pred_name. :- import_module hlds.pred_proc_id. :- import_module hlds.pred_table. +:- import_module hlds.proc_info_types. :- import_module hlds.status. :- import_module hlds.type_util. :- import_module hlds.var_table_hlds. @@ -671,9 +672,11 @@ specialize_and_add_new_proc(NewPred, !.NewProcInfo, proc_info_set_goal(Goal, !NewProcInfo), % Remove any imported structure sharing and reuse information for the - % original procedure as they won't be (directly) applicable. - proc_info_reset_imported_structure_sharing(!NewProcInfo), - proc_info_reset_imported_structure_reuse(!NewProcInfo), + % original procedure, as they won't be (directly) applicable. + proc_info_get_sharing_reuse_info(!.NewProcInfo, SharingReuseInfo0), + SharingReuseInfo1 = SharingReuseInfo0 ^ maybe_imported_sharing := no, + SharingReuseInfo = SharingReuseInfo1 ^ maybe_imported_reuse := no, + proc_info_set_sharing_reuse_info(SharingReuseInfo, !NewProcInfo), proc_info_get_var_table(!.NewProcInfo, VarTable7), lookup_var_types(VarTable7, ExtraHeadVars, ExtraHeadVarTypes0), diff --git a/compiler/hlds_out_pred.m b/compiler/hlds_out_pred.m index 92021841e..10edc9503 100644 --- a/compiler/hlds_out_pred.m +++ b/compiler/hlds_out_pred.m @@ -746,8 +746,7 @@ format_proc(Info, VarNamePrint, ModuleInfo, PredId, PredInfo, proc_info_get_goal(ProcInfo, Goal), proc_info_get_maybe_arg_size_info(ProcInfo, MaybeArgSize), proc_info_get_maybe_termination_info(ProcInfo, MaybeTermination), - proc_info_get_structure_sharing(ProcInfo, MaybeStructureSharing), - proc_info_get_structure_reuse(ProcInfo, MaybeStructureReuse), + proc_info_get_sharing_reuse_info(ProcInfo, SharingReuseInfo), proc_info_get_rtti_varmaps(ProcInfo, RttiVarMaps), proc_info_get_cse_nopull_contexts(ProcInfo, CseNoPullContexts), proc_info_get_eval_method(ProcInfo, EvalMethod), @@ -794,8 +793,7 @@ format_proc(Info, VarNamePrint, ModuleInfo, PredId, PredInfo, ), format_proc_opt_info(DumpOptions, VarTable, TVarSet, VarNamePrint, - MaybeStructureSharing, MaybeStructureReuse, - MaybeUntupleInfo, !State), + SharingReuseInfo, MaybeUntupleInfo, !State), format_proc_deleted_callee_set(DeletedCallCalleeSet, !State), format_pred_proc_var_name_remap(vns_var_table(VarTable), VarNameRemap, !State), @@ -1271,17 +1269,15 @@ format_proc_termination_info(MaybeArgSize, MaybeTermination, !State) :- %---------------------% :- pred format_proc_opt_info(hlds_dump_options::in, var_table::in, tvarset::in, - var_name_print::in, maybe(structure_sharing_domain_and_status)::in, - maybe(structure_reuse_domain_and_status)::in, maybe(untuple_proc_info)::in, + var_name_print::in, sharing_reuse_info::in, maybe(untuple_proc_info)::in, string.builder.state::di, string.builder.state::uo) is det. format_proc_opt_info(DumpOptions, VarTable, TVarSet, VarNamePrint, - MaybeStructureSharing, MaybeStructureReuse, MaybeUntupleInfo, - !State) :- + SharingReuseInfo, MaybeUntupleInfo, !State) :- DumpStructSharing = DumpOptions ^ dump_struct_sharing_info, ( if DumpStructSharing = yes, - MaybeStructureSharing = yes(StructureSharing) + SharingReuseInfo ^ maybe_sharing = yes(StructureSharing) then string.builder.append_string("% structure sharing: \n", !State), StructureSharing = @@ -1294,7 +1290,7 @@ format_proc_opt_info(DumpOptions, VarTable, TVarSet, VarNamePrint, DumpUseReuse = DumpOptions ^ dump_use_reuse_info, ( if DumpUseReuse = yes, - MaybeStructureReuse = yes(StructureReuse) + SharingReuseInfo ^ maybe_reuse = yes(StructureReuse) then string.builder.append_string("% structure reuse: \n", !State), StructureReuse = diff --git a/compiler/hlds_proc.m b/compiler/hlds_proc.m index 817d30aaf..2cb234628 100644 --- a/compiler/hlds_proc.m +++ b/compiler/hlds_proc.m @@ -110,8 +110,7 @@ maybe(deep_profile_proc_info)::out, maybe(arg_size_info)::out, maybe(termination_info)::out, termination2_info::out, maybe(proc_exception_info)::out, maybe(proc_trailing_info)::out, - maybe(proc_mm_tabling_info)::out, structure_sharing_info::out, - structure_reuse_info::out) is det. + maybe(proc_mm_tabling_info)::out, sharing_reuse_info::out) is det. :- pred proc_create(list(prog_var)::in, hlds_goal::in, var_table::in, rtti_varmaps::in, @@ -131,8 +130,8 @@ maybe(deep_profile_proc_info)::in, maybe(arg_size_info)::in, maybe(termination_info)::in, termination2_info::in, maybe(proc_exception_info)::in, maybe(proc_trailing_info)::in, - maybe(proc_mm_tabling_info)::in, structure_sharing_info::in, - structure_reuse_info::in, proc_info::out) is det. + maybe(proc_mm_tabling_info)::in, sharing_reuse_info::in, + proc_info::out) is det. %---------------------------------------------------------------------------% % @@ -143,41 +142,6 @@ list(prog_var)::in, hlds_goal::in, rtti_varmaps::in, proc_info::in, proc_info::out) is det. -:- pred proc_info_get_structure_sharing(proc_info::in, - maybe(structure_sharing_domain_and_status)::out) is det. - -:- pred proc_info_set_structure_sharing( - structure_sharing_domain_and_status::in, - proc_info::in, proc_info::out) is det. - -:- pred proc_info_get_imported_structure_sharing(proc_info::in, - list(prog_var)::out, list(mer_type)::out, structure_sharing_domain::out) - is semidet. - -:- pred proc_info_set_imported_structure_sharing(list(prog_var)::in, - list(mer_type)::in, structure_sharing_domain::in, proc_info::in, - proc_info::out) is det. - -:- pred proc_info_reset_imported_structure_sharing(proc_info::in, - proc_info::out) is det. - -:- pred proc_info_get_structure_reuse(proc_info::in, - maybe(structure_reuse_domain_and_status)::out) is det. - -:- pred proc_info_set_structure_reuse(structure_reuse_domain_and_status::in, - proc_info::in, proc_info::out) is det. - -:- pred proc_info_get_imported_structure_reuse(proc_info::in, - list(prog_var)::out, list(mer_type)::out, structure_reuse_domain::out) - is semidet. - -:- pred proc_info_set_imported_structure_reuse(list(prog_var)::in, - list(mer_type)::in, structure_reuse_domain::in, - proc_info::in, proc_info::out) is det. - -:- pred proc_info_reset_imported_structure_reuse(proc_info::in, - proc_info::out) is det. - %---------------------------------------------------------------------------% % % Getters and setters. @@ -264,6 +228,8 @@ maybe(proc_trailing_info)::out) is det. :- pred proc_info_get_mm_tabling_info(proc_info::in, maybe(proc_mm_tabling_info)::out) is det. +:- pred proc_info_get_sharing_reuse_info(proc_info::in, + sharing_reuse_info::out) is det. :- pred proc_info_set_headvars(list(prog_var)::in, proc_info::in, proc_info::out) is det. @@ -353,6 +319,8 @@ proc_info::in, proc_info::out) is det. :- pred proc_info_set_mm_tabling_info(maybe(proc_mm_tabling_info)::in, proc_info::in, proc_info::out) is det. +:- pred proc_info_set_sharing_reuse_info(sharing_reuse_info::in, + proc_info::in, proc_info::out) is det. %---------------------------------------------------------------------------% %---------------------------------------------------------------------------% @@ -427,8 +395,7 @@ proc_info_create_with_declared_detism(MainContext, ItemNumber, MaybeExceptionInfo = no `with_type` maybe(proc_exception_info), MaybeTrailingInfo = no `with_type` maybe(proc_trailing_info), MaybeMMTablingInfo = no `with_type` maybe(proc_mm_tabling_info), - SharingInfo = structure_sharing_info_init, - ReuseInfo = structure_reuse_info_init, + SharingReuseInfo = sharing_reuse_info_init, ProcSubInfo = proc_sub_info( MainContext, @@ -466,8 +433,7 @@ proc_info_create_with_declared_detism(MainContext, ItemNumber, MaybeExceptionInfo, MaybeTrailingInfo, MaybeMMTablingInfo, - SharingInfo, - ReuseInfo), + SharingReuseInfo), % argument HeadVars % argument Goal @@ -554,8 +520,7 @@ proc_info_init(ModuleInfo, MainContext, ItemNumber, Types, InstVarSet, MaybeExceptionInfo = no `with_type` maybe(proc_exception_info), MaybeTrailingInfo = no `with_type` maybe(proc_trailing_info), MaybeMMTablingInfo = no `with_type` maybe(proc_mm_tabling_info), - SharingInfo = structure_sharing_info_init, - ReuseInfo = structure_reuse_info_init, + SharingReuseInfo = sharing_reuse_info_init, ProcSubInfo = proc_sub_info( MainContext, @@ -593,8 +558,7 @@ proc_info_init(ModuleInfo, MainContext, ItemNumber, Types, InstVarSet, MaybeExceptionInfo, MaybeTrailingInfo, MaybeMMTablingInfo, - SharingInfo, - ReuseInfo), + SharingReuseInfo), init_var_table(VarTable0), make_fresh_prefix_named_vars_from_types(ModuleInfo, "HeadVar__", 1, @@ -668,7 +632,7 @@ proc_prepare_to_clone(ProcInfo, HeadVars, Goal, VarTable, RttiVarMaps, StackSlots, NeedsMaxfrSlot, MaybeCallTableTip, MaybeTableIOInfo, MaybeTableAttrs, MaybeObsoleteInFavourOf, MaybeDeepProfProcInfo, MaybeArgSizes, MaybeTermInfo, Term2Info, MaybeExceptionInfo, - MaybeTrailingInfo, MaybeMMTablingInfo, SharingInfo, ReuseInfo) :- + MaybeTrailingInfo, MaybeMMTablingInfo, SharingReuseInfo) :- ProcInfo = proc_info( HeadVars, Goal, @@ -718,8 +682,7 @@ proc_prepare_to_clone(ProcInfo, HeadVars, Goal, VarTable, RttiVarMaps, MaybeExceptionInfo, MaybeTrailingInfo, MaybeMMTablingInfo, - SharingInfo, - ReuseInfo). + SharingReuseInfo). proc_create(HeadVars, Goal, VarTable, RttiVarMaps, InstVarSet, DeclaredModes, Modes, MaybeArgLives, @@ -733,8 +696,7 @@ proc_create(HeadVars, Goal, VarTable, RttiVarMaps, StackSlots, NeedsMaxfrSlot, MaybeCallTableTip, MaybeTableIOInfo, MaybeTableAttrs, MaybeObsoleteInFavourOf, MaybeDeepProfProcInfo, MaybeArgSizes, MaybeTermInfo, Term2Info, MaybeExceptionInfo, - MaybeTrailingInfo, MaybeMMTablingInfo, SharingInfo, ReuseInfo, - ProcInfo) :- + MaybeTrailingInfo, MaybeMMTablingInfo, SharingReuseInfo, ProcInfo) :- ProcSubInfo = proc_sub_info( MainContext, ItemNumber, @@ -771,8 +733,7 @@ proc_create(HeadVars, Goal, VarTable, RttiVarMaps, MaybeExceptionInfo, MaybeTrailingInfo, MaybeMMTablingInfo, - SharingInfo, - ReuseInfo), + SharingReuseInfo), ProcInfo = proc_info( HeadVars, Goal, @@ -798,54 +759,6 @@ proc_info_set_body(VarTable, HeadVars, Goal, RttiVarMaps, !ProcInfo) :- !ProcInfo ^ proc_body := Goal, !ProcInfo ^ proc_rtti_varmaps := RttiVarMaps. -proc_info_get_structure_sharing(ProcInfo, MaybeSharing) :- - MaybeSharing = ProcInfo ^ proc_sub_info ^ psi_structure_sharing - ^ maybe_sharing. - -proc_info_set_structure_sharing(Sharing, !ProcInfo) :- - !ProcInfo ^ proc_sub_info ^ psi_structure_sharing ^ maybe_sharing := - yes(Sharing). - -proc_info_get_imported_structure_sharing(ProcInfo, HeadVars, Types, Sharing) :- - MaybeImportedSharing = ProcInfo ^ proc_sub_info ^ psi_structure_sharing - ^ maybe_imported_sharing, - MaybeImportedSharing = yes(ImportedSharing), - ImportedSharing = imported_sharing(HeadVars, Types, Sharing). - -proc_info_set_imported_structure_sharing(HeadVars, Types, Sharing, - !ProcInfo) :- - ImportedSharing = imported_sharing(HeadVars, Types, Sharing), - MaybeImportedSharing = yes(ImportedSharing), - !ProcInfo ^ proc_sub_info ^ psi_structure_sharing - ^ maybe_imported_sharing := MaybeImportedSharing. - -proc_info_reset_imported_structure_sharing(!ProcInfo) :- - !ProcInfo ^ proc_sub_info ^ psi_structure_sharing - ^ maybe_imported_sharing := no. - -proc_info_get_structure_reuse(ProcInfo, MaybeReuse) :- - MaybeReuse = ProcInfo ^ proc_sub_info ^ psi_structure_reuse ^ maybe_reuse. - -proc_info_set_structure_reuse(Reuse, !ProcInfo) :- - !ProcInfo ^ proc_sub_info ^ psi_structure_reuse ^ maybe_reuse - := yes(Reuse). - -proc_info_get_imported_structure_reuse(ProcInfo, HeadVars, Types, Reuse) :- - MaybeImportedReuse = ProcInfo ^ proc_sub_info ^ psi_structure_reuse - ^ maybe_imported_reuse, - MaybeImportedReuse = yes(ImportedReuse), - ImportedReuse = imported_reuse(HeadVars, Types, Reuse). - -proc_info_set_imported_structure_reuse(HeadVars, Types, Reuse, !ProcInfo) :- - ImportedReuse = imported_reuse(HeadVars, Types, Reuse), - MaybeImportedReuse = yes(ImportedReuse), - !ProcInfo ^ proc_sub_info ^ psi_structure_reuse ^ maybe_imported_reuse := - MaybeImportedReuse. - -proc_info_reset_imported_structure_reuse(!ProcInfo) :- - !ProcInfo ^ proc_sub_info ^ psi_structure_reuse - ^ maybe_imported_reuse := no. - %---------------------------------------------------------------------------% % % The information specific to a procedure, as opposed to a predicate. @@ -1134,13 +1047,9 @@ proc_info_reset_imported_structure_reuse(!ProcInfo) :- psi_trailing_info :: maybe(proc_trailing_info), psi_mm_tabling_info :: maybe(proc_mm_tabling_info), - % Structure sharing information as obtained by the structure - % sharing analysis. - psi_structure_sharing :: structure_sharing_info, - - % Structure reuse conditions obtained by the structure reuse - % analysis (CTGC). - psi_structure_reuse :: structure_reuse_info + % Structure sharing and reuse information as obtained by + % structure sharing/reuse analysis (CTGC). + psi_sharing_reuse_info :: sharing_reuse_info ). proc_info_get_headvars(PI, X) :- @@ -1236,6 +1145,8 @@ proc_info_get_trailing_info(PI, X) :- X = PI ^ proc_sub_info ^ psi_trailing_info. proc_info_get_mm_tabling_info(PI, X) :- X = PI ^ proc_sub_info ^ psi_mm_tabling_info. +proc_info_get_sharing_reuse_info(PI, X) :- + X = PI ^ proc_sub_info ^ psi_sharing_reuse_info. proc_info_set_headvars(X, !PI) :- !PI ^ proc_head_vars := X. @@ -1324,6 +1235,8 @@ proc_info_set_trailing_info(X, !PI) :- !PI ^ proc_sub_info ^ psi_trailing_info := X. proc_info_set_mm_tabling_info(X, !PI) :- !PI ^ proc_sub_info ^ psi_mm_tabling_info := X. +proc_info_set_sharing_reuse_info(X, !PI) :- + !PI ^ proc_sub_info ^ psi_sharing_reuse_info := X. %---------------------------------------------------------------------------% :- end_module hlds.hlds_proc. diff --git a/compiler/intermod_analysis.m b/compiler/intermod_analysis.m index 4767d2d11..5f06cb944 100644 --- a/compiler/intermod_analysis.m +++ b/compiler/intermod_analysis.m @@ -781,7 +781,8 @@ gather_pragma_structure_sharing_for_proc(ModuleInfo, OrderPredInfo, should_write_sharing_info(ModuleInfo, PredId, ProcId, PredInfo, for_pragma, ShouldWrite), ShouldWrite = should_write, - proc_info_get_structure_sharing(ProcInfo, MaybeSharingStatus), + proc_info_get_sharing_reuse_info(ProcInfo, SharingReuseInfo), + MaybeSharingStatus = SharingReuseInfo ^ maybe_sharing, MaybeSharingStatus = yes(SharingStatus) then proc_info_get_var_table(ProcInfo, VarTable), @@ -832,7 +833,8 @@ gather_pragma_structure_reuse_for_proc(ModuleInfo, OrderPredInfo, should_write_reuse_info(ModuleInfo, PredId, ProcId, PredInfo, for_pragma, ShouldWrite), ShouldWrite = should_write, - proc_info_get_structure_reuse(ProcInfo, MaybeStructureReuseDomain), + proc_info_get_sharing_reuse_info(ProcInfo, SharingReuseInfo), + MaybeStructureReuseDomain = SharingReuseInfo ^ maybe_reuse, MaybeStructureReuseDomain = yes(StructureReuseDomain) then proc_info_get_var_table(ProcInfo, VarTable), diff --git a/compiler/proc_info_types.m b/compiler/proc_info_types.m index ba253fa35..8f3ff8253 100644 --- a/compiler/proc_info_types.m +++ b/compiler/proc_info_types.m @@ -345,20 +345,29 @@ %---------------------% +:- type sharing_reuse_info + ---> sharing_reuse_info( + maybe_sharing :: maybe(structure_sharing_domain_and_status), + maybe_reuse :: maybe(structure_reuse_domain_and_status), + + % These two fields record sharing and reuse information + % from any `.opt' or `.trans_opt' file. This information + % needs to be processed at the beginning of structure + % sharing/reuse analysis. After that, this field is of no use. + maybe_imported_sharing :: maybe(imported_sharing), + maybe_imported_reuse :: maybe(imported_reuse) + ). + :- type structure_sharing_domain_and_status ---> structure_sharing_domain_and_status( structure_sharing_domain, analysis_status ). -:- type structure_sharing_info - ---> structure_sharing_info( - maybe_sharing :: maybe(structure_sharing_domain_and_status), - maybe_imported_sharing :: maybe(imported_sharing) - % Records the sharing information from any `.opt' or - % `.trans_opt' file. This information needs to be processed at - % the beginning of structure sharing analysis. After that, - % this field is of no use. +:- type structure_reuse_domain_and_status + ---> structure_reuse_domain_and_status( + structure_reuse_domain, + analysis_status ). % Sharing information is expressed in terms of head variables and the @@ -382,27 +391,6 @@ s_sharing :: structure_sharing_domain ). -:- func structure_sharing_info_init = structure_sharing_info. - -%---------------------% - -:- type structure_reuse_domain_and_status - ---> structure_reuse_domain_and_status( - structure_reuse_domain, - analysis_status - ). - -:- type structure_reuse_info - ---> structure_reuse_info( - maybe_reuse :: maybe(structure_reuse_domain_and_status), - - maybe_imported_reuse :: maybe(imported_reuse) - % Records the reuse information from any `.opt' or - % `.trans_opt' file. This information needs to be processed - % at the beginning of structure reuse analysis. After that - % this field is of no use. - ). - % Same rationale as for imported_sharing. % :- type imported_reuse @@ -417,7 +405,7 @@ r_reuse :: structure_reuse_domain ). -:- func structure_reuse_info_init = structure_reuse_info. +:- func sharing_reuse_info_init = sharing_reuse_info. %---------------------------------------------------------------------------% @@ -425,9 +413,7 @@ %---------------------------------------------------------------------------% -structure_sharing_info_init = structure_sharing_info(no, no). - -structure_reuse_info_init = structure_reuse_info(no, no). +sharing_reuse_info_init = sharing_reuse_info(no, no, no, no). %---------------------------------------------------------------------------% :- end_module hlds.proc_info_types. diff --git a/compiler/structure_reuse.analysis.m b/compiler/structure_reuse.analysis.m index ff72915ed..f0a997158 100644 --- a/compiler/structure_reuse.analysis.m +++ b/compiler/structure_reuse.analysis.m @@ -526,11 +526,12 @@ process_imported_reuse_in_procs(!PredInfo) :- process_imported_reuse_in_proc(PredInfo, ProcId, !ProcTable) :- some [!ProcInfo] ( - !:ProcInfo = !.ProcTable ^ det_elem(ProcId), - ( if - proc_info_get_imported_structure_reuse(!.ProcInfo, - ImpHeadVars, ImpTypes, ImpReuse) - then + map.lookup(!.ProcTable, ProcId, !:ProcInfo), + proc_info_get_sharing_reuse_info(!.ProcInfo, SharingReuseInfo0), + MaybeImportedReuse0 = SharingReuseInfo0 ^ maybe_imported_reuse, + ( + MaybeImportedReuse0 = yes(ImportedReuse0), + ImportedReuse0 = imported_reuse(ImpHeadVars, ImpTypes, ImpReuse), proc_info_get_headvars(!.ProcInfo, HeadVars), pred_info_get_arg_types(PredInfo, HeadVarTypes), map.from_corresponding_lists(ImpHeadVars, HeadVars, VarRenaming), @@ -549,12 +550,13 @@ process_imported_reuse_in_proc(PredInfo, ProcId, !ProcTable) :- ), % Optimality does not apply to `--intermodule-optimisation' % system, only `--intermodule-analysis'. - proc_info_set_structure_reuse( - structure_reuse_domain_and_status(Reuse, optimal), !ProcInfo), - proc_info_reset_imported_structure_reuse(!ProcInfo), + SharingReuseInfo1 = SharingReuseInfo0 ^ maybe_reuse := + yes(structure_reuse_domain_and_status(Reuse, optimal)), + SharingReuseInfo = SharingReuseInfo1 ^ maybe_imported_reuse := no, + proc_info_set_sharing_reuse_info(SharingReuseInfo, !ProcInfo), map.det_update(ProcId, !.ProcInfo, !ProcTable) - else - true + ; + MaybeImportedReuse0 = no ) ). @@ -750,7 +752,9 @@ save_reuse_in_module_info(PPId, ReuseAs_Status, !ModuleInfo) :- Domain_Status = structure_reuse_domain_and_status(ReuseDomain, Status), module_info_pred_proc_info(!.ModuleInfo, PPId, PredInfo, ProcInfo0), - proc_info_set_structure_reuse(Domain_Status, ProcInfo0, ProcInfo), + proc_info_get_sharing_reuse_info(ProcInfo0, SharingReuseInfo0), + SharingReuseInfo = SharingReuseInfo0 ^ maybe_reuse := yes(Domain_Status), + proc_info_set_sharing_reuse_info(SharingReuseInfo, ProcInfo0, ProcInfo), module_info_set_pred_proc_info(PPId, PredInfo, ProcInfo, !ModuleInfo). :- pred annotate_in_use_information(module_info::in, diff --git a/compiler/structure_reuse.domain.m b/compiler/structure_reuse.domain.m index ba20e2214..40898c107 100644 --- a/compiler/structure_reuse.domain.m +++ b/compiler/structure_reuse.domain.m @@ -1014,7 +1014,8 @@ load_structure_reuse_table_2(ModuleInfo, PredId, !ReuseTable) :- load_structure_reuse_table_3(ModuleInfo, PredId, ProcId, !ReuseTable) :- module_info_proc_info(ModuleInfo, PredId, ProcId, ProcInfo), - proc_info_get_structure_reuse(ProcInfo, MaybePublicReuse), + proc_info_get_sharing_reuse_info(ProcInfo, SharingReuseInfo), + MaybePublicReuse = SharingReuseInfo ^ maybe_reuse, ( MaybePublicReuse = yes(structure_reuse_domain_and_status(PublicReuse, Status)), diff --git a/compiler/structure_sharing.analysis.m b/compiler/structure_sharing.analysis.m index f8ebe8c91..1584c14a8 100644 --- a/compiler/structure_sharing.analysis.m +++ b/compiler/structure_sharing.analysis.m @@ -190,10 +190,12 @@ process_imported_sharing_in_procs(!PredInfo) :- process_imported_sharing_in_proc(PredInfo, ProcId, !ProcTable) :- some [!ProcInfo] ( map.lookup(!.ProcTable, ProcId, !:ProcInfo), - ( if - proc_info_get_imported_structure_sharing(!.ProcInfo, - ImpHeadVars, ImpTypes, ImpSharing) - then + proc_info_get_sharing_reuse_info(!.ProcInfo, SharingReuseInfo0), + MaybeImportedSharing0 = SharingReuseInfo0 ^ maybe_imported_sharing, + ( + MaybeImportedSharing0 = yes(ImportedSharing0), + ImportedSharing0 = + imported_sharing(ImpHeadVars, ImpTypes, ImpSharing), proc_info_get_headvars(!.ProcInfo, HeadVars), pred_info_get_arg_types(PredInfo, HeadVarTypes), map.from_corresponding_lists(ImpHeadVars, HeadVars, VarRenaming), @@ -212,13 +214,14 @@ process_imported_sharing_in_proc(PredInfo, ProcId, !ProcTable) :- ), % Optimality does not apply to `--intermodule-optimisation' % system, only `--intermodule-analysis'. - proc_info_set_structure_sharing( - structure_sharing_domain_and_status(Sharing, optimal), - !ProcInfo), - proc_info_reset_imported_structure_sharing(!ProcInfo), + SharingReuseInfo1 = SharingReuseInfo0 ^ maybe_sharing := + yes(structure_sharing_domain_and_status(Sharing, optimal)), + SharingReuseInfo = SharingReuseInfo1 ^ maybe_imported_sharing + := no, + proc_info_set_sharing_reuse_info(SharingReuseInfo, !ProcInfo), map.det_update(ProcId, !.ProcInfo, !ProcTable) - else - true + ; + MaybeImportedSharing0 = no ) ). @@ -283,9 +286,11 @@ process_intermod_analysis_imported_sharing_in_proc(ModuleInfo, AnalysisInfo, pred_info_get_arg_types(PredInfo, HeadVarTypes), structure_sharing_answer_to_domain(yes(PPId), HeadVarTypes, !.ProcInfo, Answer, Sharing), - proc_info_set_structure_sharing( - structure_sharing_domain_and_status(Sharing, ResultStatus), - !ProcInfo), + proc_info_get_sharing_reuse_info(!.ProcInfo, SharingReuseInfo0), + SharingReuseInfo = SharingReuseInfo0 ^ maybe_sharing := + yes(structure_sharing_domain_and_status(Sharing, + ResultStatus)), + proc_info_set_sharing_reuse_info(SharingReuseInfo, !ProcInfo), map.det_update(ProcId, !.ProcInfo, !ProcTable) ; MaybeBestResult = no @@ -403,9 +408,10 @@ save_sharing_in_module_info(PPId, SharingAs_Status, !ModuleInfo) :- SharingAs_Status = sharing_as_and_status(SharingAs, Status), module_info_pred_proc_info(!.ModuleInfo, PPId, PredInfo, ProcInfo0), SharingDomain = to_structure_sharing_domain(SharingAs), - proc_info_set_structure_sharing( - structure_sharing_domain_and_status(SharingDomain, Status), - ProcInfo0, ProcInfo), + proc_info_get_sharing_reuse_info(ProcInfo0, SharingReuseInfo0), + SharingReuseInfo = SharingReuseInfo0 ^ maybe_sharing := + yes(structure_sharing_domain_and_status(SharingDomain, Status)), + proc_info_set_sharing_reuse_info(SharingReuseInfo, ProcInfo0, ProcInfo), module_info_set_pred_proc_info(PPId, PredInfo, ProcInfo, !ModuleInfo). :- pred analyse_scc(io.text_output_stream::in, module_info::in, scc::in, diff --git a/compiler/structure_sharing.domain.m b/compiler/structure_sharing.domain.m index b9cde5110..380907037 100644 --- a/compiler/structure_sharing.domain.m +++ b/compiler/structure_sharing.domain.m @@ -2180,7 +2180,8 @@ load_structure_sharing_table_2(ModuleInfo, PredId, !SharingTable) :- load_structure_sharing_table_3(ModuleInfo, PredId, ProcId, !SharingTable) :- module_info_proc_info(ModuleInfo, PredId, ProcId, ProcInfo), - proc_info_get_structure_sharing(ProcInfo, MaybePublicSharing), + proc_info_get_sharing_reuse_info(ProcInfo, SharingReuseInfo), + MaybePublicSharing = SharingReuseInfo ^ maybe_sharing, ( MaybePublicSharing = yes( structure_sharing_domain_and_status(PublicSharing, Status)),