[m-rev.] for review: new termination analyser (part 6 of 6)
Julien Fischer
juliensf at cs.mu.OZ.AU
Thu Mar 31 12:37:32 AEST 2005
On Wed, 30 Mar 2005, Mark Brown wrote:
> On 24-Mar-2005, Julien Fischer <juliensf at cs.mu.OZ.AU> wrote:
> > Index: compiler/termination2.m
> > ===================================================================
> > RCS file: compiler/termination2.m
> > diff -N compiler/termination2.m
> > --- /dev/null 1 Jan 1970 00:00:00 -0000
> > +++ compiler/termination2.m 24 Mar 2005 04:17:13 -0000
> > @@ -0,0 +1,736 @@
> > +%-----------------------------------------------------------------------------%
> > +% vim: ft=mercury ts=4 sw=4 et
> > +%-----------------------------------------------------------------------------%
> > +% Copyright (C) 1997,2002-2005 The University of Melbourne.
>
> The copyright years are wrong.
>
How so?
> > +% (b) Perform fixpoint calculation to derive IR information.
> > +% ( See term_constr_fixpoint.m.)
>
> There's an extra space.
>
So there is - it's gone.
> > +:- interface.
> > +
> > +:- import_module hlds.hlds_module.
> > +:- import_module hlds.hlds_pred.
> > +
> > +:- import_module parse_tree.prog_data.
> > +
> > +:- import_module libs.polyhedron.
> > +
> > +:- import_module mdbcomp.prim_data.
> > +
> > +:- import_module transform_hlds.term_constr_data.
> > +:- import_module transform_hlds.term_constr_errors.
>
> According to the current coding standards, you should remove the above
> blank lines (and similarly elsewhere).
>
This diff dates from before that change to the coding standard.
I'll make sure that I incorporate any recent changes to the coding
standard before it's committed.
> > + % Why does the termination analyser think that a procedure is
> > + % terminating? This is useful for debugging purposes.
> > + %
> > +:- type term_reason
> > + ---> builtin % procedure was a builtin.
> > +
> > + ; pragma_supplied % procedure has pramga terminates decl.
> > +
> > + ; foreign_supplied % procedure has foreign code attribute.
> > +
> > + ; import_supplied % This procedure was imported and it's
>
> s/it's/its/
>
Done.
> > + % termination info. was read in from a .opt
>
> Probably should s/info./info/ (and elsewhere).
>
In that particular case it should be s/info./status/.
> > + % or .trans_opt file.
> > +
> > + ; analysis. % Termination info. was derived via analysis.
> > +
>
> > +%------------------------------------------------------------------------------%
> > +%
> > +% The termination2_info structure.
> > +%
> > +
> > +:- type termination2_info
> > + ---> term2_info(
> > + size_var_map :: size_var_map,
> > + % Map between prog_vars and size_vars.
> > + % Each procedure should have one of these.
>
> That second sentence applies to the whole termination2_info structure,
> so is redundant here.
>
I've deleted the second part.
> (Upon further inspection, perhaps you mean that this field should be filled
> in for each procedure, regardless of whether other fields are. If so, you
> should make that clearer.)
>
All of the fields should be filled in - those that are optional are
already have maybe types. (That part of the comment is out of date - it
had some relevance when the size_varset, which is a per-SCC data
structure, was stored there).
> > +
> > + head_vars :: list(size_var),
> > + % These are the size variables that occur in argument
> > + % size constraints. For procedures that are imported
> > + % via a `.opt' or `.trans_opt' file we set these during
> > + % the initial pass, for procedures in the module we are
> > + % analysing, pass 1 sets it.
> > +
> > + import_headvarids :: maybe(list(int)),
> > + import_success :: maybe(pragma_constr_arg_size_info),
> > + import_failure :: maybe(pragma_constr_arg_size_info),
> > + % Arg size info. imported from another module via a
> > + % `.opt' or `.trans_opt' file. The preprocessing pass
> > + % needs to convert these to the proper form. These
> > + % particular fields are of no use after that.
>
> By the "preprocessing" pass I take it you mean the initial pass, aka pass 0.
> If so, you should stick to one of those names.
>
Fixed. It now reads that: Pass 0 needs to convert these to the proper
form.
> > +
> > + success_constrs :: maybe(constr_arg_size_info),
> > + % The interargument size relationships
> > + % (expressed as convex constraints)
> > + % obtained during pass 1.
> > +
> > + failure_constrs :: maybe(constr_arg_size_info),
> > + % Failure constraints for predicates that
> > + % can fail (set by pass 1).
> > +
> > + term_status :: maybe(constr_termination_info),
> > + % The termination status of the procedure as determined
> > + % by pass 2.
> > +
> > + intermod_status :: maybe(intermod_status),
> > + % Is this procedure (possibly) involved in mutual
> > + % recursion across module boundaries. Set by pass 1.
>
> s/boundaries/boundaries?/
Fixed.
>
> > +
> > + abstract_rep :: maybe(abstract_proc)
> > + % The abstract representation of this
> > + % proc. Set by term_constr_build.m.
> > + ).
> > +
> > +term2_info_init = term2_info(map.init, [], no, no, no, no, no, no, no, no).
> > +
> > +%----------------------------------------------------------------------------%
> > +%
> > +% Main pass.
> > +%
> > +
> > +% The analysis proceeds as follows:
> > +%
> > +% * Preprocess the module:
> > +% - setup information from termination pragmas
> > +% - setup information from foreign proc attributes
> > +% - setup information about imported procedures
> > +% - setup termination information for builtin predicates
> > +%
> > +% * Analyse the module - process SCCs bottom-up.
> > +%
> > +% * Optionally write out termination information to the `.opt' and
> > +% `.trans_opt' files.
> > +%
>
> You should refer to these stages by the pass names mentioned above.
> Providing more detail would also be good, eg breaking pass 1 into build pass
> and whatever else, since the build pass is mentioned just below.
>
On reflection, I'm just going to delete that comment; it just duplicates
the one at the overview at the beginning of the module.
> > +analyse_scc(DepOrder, BuildOpts, FixpointOpts, Pass2Opts, SCC, !ModuleInfo,
> > + !IO) :-
> > + %
> > + % Since all of the passes are potentially optional we need to
> > + % initialise the size_var_maps separately. If they are left
> > + % uninitialised intermodule optimization will not work.
> > + %
> > + NeedsAR = list.filter(proc_needs_ar_built(!.ModuleInfo), SCC),
> > + %
> > + % Build the abstract representation for those procedures that
> > + % require it. (those that do not already have both arg_size_info and
> > + % termination info).
> > + %
> > + term_constr_build.build_abstract_scc(DepOrder, NeedsAR, BuildOpts,
> > + BuildErrors, !ModuleInfo, !IO),
> > + %
> > + % We only perform the fixpoint computation for those procedures
> > + % where we can gain meaningful information from it. We do not
> > + % do it when:
> > + % - the information is already known.
>
> s/./, or/
>
> (or maybe that should be "and".)
>
Fixed - s/./, or/
> > +%------------------------------------------------------------------------------%
> > +
> > +:- func this_file = string.
> > +
> > +this_file = "termination2.m".
>
> Do you still need this? It isn't used at the moment.
>
No but it doesn't hurt that as it is, and it's useful if any calls
to unexpected/2 or sorry/2 are added at a later date.
Thanks for that Mark.
Julien.
--------------------------------------------------------------------------
mercury-reviews mailing list
post: mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------
More information about the reviews
mailing list