mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-17 02:13:54 +00:00
compiler/rbmm.m:
compiler/rbmm.region_analysis.m:
Move all the code (one predicate) out of rbmm.m to the new module
rbmm.region_analysis.m, leaving it containing nothing but
include_module declarations.
Delete the unneeded !IO argument pair of that predicate.
compiler/mercury_compile_middle_passes.m:
Don't pass the !IO arguments to that predicate.
compiler/notes/compiler_design.html:
This file has not mentioned the rbmm package until now.
Add a short description of the package itself, but since I don't
really know what each of its component modules do, I cannot add
even short descriptions of them.
compiler/rbmm.condition_renaming.m:
compiler/rbmm.execution_path.m:
compiler/rbmm.interproc_region_lifetime.m:
compiler/rbmm.live_region_analysis.m:
compiler/rbmm.live_variable_analysis.m:
compiler/rbmm.points_to_analysis.m:
compiler/rbmm.points_to_info.m:
compiler/rbmm.region_arguments.m:
compiler/rbmm.region_instruction.m:
compiler/rbmm.region_resurrection_renaming.m:
compiler/rbmm.region_transformation.m:
Conform to the changes above.
114 lines
5.5 KiB
Mathematica
114 lines
5.5 KiB
Mathematica
%---------------------------------------------------------------------------%
|
|
% vim: ft=mercury ts=4 sw=4 et
|
|
%---------------------------------------------------------------------------%
|
|
% Copyright (C) 2007, 2009-2010 The University of Melbourne.
|
|
% This file may only be copied under the terms of the GNU General
|
|
% Public License - see the file COPYING in the Mercury distribution.
|
|
%---------------------------------------------------------------------------%
|
|
%
|
|
% File: rbmm.analysis.m.
|
|
% Main author: quan.
|
|
%
|
|
% This is the main file for the region-based memory management package.
|
|
%
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- module transform_hlds.rbmm.region_analysis.
|
|
:- interface.
|
|
|
|
:- import_module hlds.
|
|
:- import_module hlds.hlds_module.
|
|
|
|
:- pred do_region_analysis(module_info::in, module_info::out) is det.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
%---------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module transform_hlds.rbmm.add_rbmm_goal_infos.
|
|
:- import_module transform_hlds.rbmm.condition_renaming.
|
|
:- import_module transform_hlds.rbmm.execution_path.
|
|
:- import_module transform_hlds.rbmm.interproc_region_lifetime.
|
|
:- import_module transform_hlds.rbmm.live_region_analysis.
|
|
:- import_module transform_hlds.rbmm.live_variable_analysis.
|
|
:- import_module transform_hlds.rbmm.points_to_analysis.
|
|
:- import_module transform_hlds.rbmm.region_arguments.
|
|
:- import_module transform_hlds.rbmm.region_instruction.
|
|
:- import_module transform_hlds.rbmm.region_resurrection_renaming.
|
|
:- import_module transform_hlds.rbmm.region_transformation.
|
|
|
|
:- import_module map.
|
|
|
|
%---------------------------------------------------------------------------%
|
|
|
|
do_region_analysis(!ModuleInfo) :-
|
|
region_points_to_analysis(RptaInfoTable, !ModuleInfo),
|
|
execution_path_analysis(!.ModuleInfo, ExecPathTable),
|
|
live_variable_analysis(!.ModuleInfo, ExecPathTable, LVBeforeTable,
|
|
LVAfterTable, VoidVarTable),
|
|
live_region_analysis(!.ModuleInfo, RptaInfoTable,
|
|
LVBeforeTable, LVAfterTable, VoidVarTable, LRBeforeTable0,
|
|
LRAfterTable0, VoidVarRegionTable0, InputRTable, OutputRTable,
|
|
BornRTable0, DeadRTable0, LocalRTable0),
|
|
compute_interproc_region_lifetime(!.ModuleInfo, RptaInfoTable,
|
|
ExecPathTable, LRBeforeTable0, LRAfterTable0, InputRTable,
|
|
OutputRTable, ConstantRTable0, BornRTable0, BornRTable1,
|
|
DeadRTable0, DeadRTable1),
|
|
ignore_primitive_regions(!.ModuleInfo, RptaInfoTable,
|
|
BornRTable1, BornRTable, DeadRTable1, DeadRTable,
|
|
ConstantRTable0, ConstantRTable, LocalRTable0, LocalRTable,
|
|
LRBeforeTable0, LRBeforeTable, LRAfterTable0, LRAfterTable,
|
|
VoidVarRegionTable0, VoidVarRegionTable),
|
|
introduce_region_instructions(!.ModuleInfo, RptaInfoTable,
|
|
ExecPathTable, LRBeforeTable, LRAfterTable, VoidVarRegionTable,
|
|
BornRTable, DeadRTable, LocalRTable,
|
|
BecomeLiveTable, BecomeDeadBeforeTable, BecomeDeadAfterTable,
|
|
RegionInstructionTable),
|
|
|
|
record_region_arguments(!.ModuleInfo, RptaInfoTable,
|
|
ConstantRTable, DeadRTable, BornRTable, FormalRegionArgTable,
|
|
ActualRegionArgTable),
|
|
|
|
% The region analysis treats region variables as if they are
|
|
% imperative-style updatable variables. They may also have scopes
|
|
% which are not valid in Mercury. In order for Mercury code to
|
|
% manipulate regions, we need to map these "region variables"
|
|
% on to Mercury variables.
|
|
% The calls below derive the necessary mapping to resolve the problem.
|
|
compute_resurrection_paths(ExecPathTable, LRBeforeTable, LRAfterTable,
|
|
BornRTable, DeadRTable, LocalRTable,
|
|
BecomeLiveTable, BecomeDeadBeforeTable, BecomeDeadAfterTable,
|
|
ResurrectionPathTable0),
|
|
collect_join_points(ResurrectionPathTable0, ExecPathTable,
|
|
JoinPointTable),
|
|
collect_paths_containing_join_points(ExecPathTable, JoinPointTable,
|
|
ResurrectionPathTable0, ResurrectionPathTable),
|
|
collect_region_resurrection_renaming(BecomeLiveTable, LocalRTable,
|
|
RptaInfoTable, ResurrectionPathTable, ResurrectionRenameTable),
|
|
collect_renaming_and_annotation(ResurrectionRenameTable, JoinPointTable,
|
|
LRBeforeTable, LRAfterTable, BornRTable, RptaInfoTable,
|
|
ResurrectionPathTable, ExecPathTable, ResurRenamingAnnoTable,
|
|
ResurRenamingTable),
|
|
collect_non_local_and_in_cond_regions(!.ModuleInfo, RptaInfoTable,
|
|
LRBeforeTable, LRAfterTable, ResurRenamingTable,
|
|
ResurRenamingAnnoTable, LocalRegionsTable, InCondRegionsTable),
|
|
collect_ite_renamed_regions(LocalRegionsTable, InCondRegionsTable,
|
|
RenamedRegionsTable),
|
|
collect_ite_renaming(!.ModuleInfo, RptaInfoTable, RenamedRegionsTable,
|
|
IteRenamingTable0),
|
|
collect_ite_annotation(RenamedRegionsTable, ExecPathTable,
|
|
RptaInfoTable, IteRenamingTable0, IteRenamingTable,
|
|
IteRenamingAnnoTable),
|
|
region_transform(RptaInfoTable, FormalRegionArgTable,
|
|
ActualRegionArgTable, ResurRenamingTable,
|
|
IteRenamingTable, RegionInstructionTable, ResurRenamingAnnoTable,
|
|
IteRenamingAnnoTable, map.init, NameToVarTable, !ModuleInfo),
|
|
|
|
collect_rbmm_goal_info(RptaInfoTable, ActualRegionArgTable,
|
|
ResurRenamingTable, IteRenamingTable, NameToVarTable, !ModuleInfo).
|
|
|
|
%---------------------------------------------------------------------------%
|
|
:- end_module transform_hlds.rbmm.region_analysis.
|
|
%---------------------------------------------------------------------------%
|