[m-dev.] for review: recognise associativity assertions
Peter Ross
petdr at cs.mu.OZ.AU
Mon Dec 20 14:54:13 AEDT 1999
Fergus,
Is it alright to check this code in?
On 09-Dec-1999, Peter Ross <petdr at cs.mu.OZ.AU> wrote:
> On 09-Dec-1999, Fergus Henderson <fjh at cs.mu.OZ.AU> wrote:
> > On 17-Nov-1999, Peter Ross <petdr at cs.mu.OZ.AU> wrote:
> > > Recognise associativity assertions, and use them to introduce
> > > accumulators.
> > ...
> > > mercury/compiler/accumulator.m:
> > > Rather than failing if a call is associative and nothing is known
> > > about the effect of rearranging the argument order, report a
> > > suppressible warning.
> >
> > Hmm, interesting...
> >
> > What can the user do if for one warning, they want to not just
> > suppress the warning but also prevent the argument rearrangement,
> > while for another warning, they want to just supress the warning?
> >
> Place the two predicates in separate files. It is an all or nothing at
> the moment.
>
> > > +++ accumulator.m 1999/11/17 03:53:30
> > > @@ -222,8 +230,46 @@
> > > []
> > > ),
> > >
> > > - { ProcInfo = ProcInfo1 },
> > > - { ModuleInfo = ModuleInfo1 }
> > > + globals__io_lookup_bool_option(inhibit_accumulator_warnings,
> > > + InhibitWarnings),
> > > + (
> > > + ( { Warnings = [] } ; { InhibitWarnings = yes } )
> > > + ->
> > > + { ModuleInfo = ModuleInfo1 }
> > > + ;
> > > + { error_util__describe_one_pred_name(ModuleInfo1,
> > > + PredId, PredName) },
> > > + { pred_info_context(PredInfo, Context) },
> > > +
> > > + error_util__write_error_pieces(Context, 0,
> > > + [words("In the"), words(PredName)]),
> >
> > Probably you should delete the word "the" their, for consistency
> > with error messages from other parts of the compiler.
> >
> Ok.
>
> > > + { proc_info_varset(ProcInfo, VarSet) },
> > > + accumulator__warnings(Warnings, VarSet, ModuleInfo1),
> > > +
> > > + error_util__write_error_pieces(Context, 2,
> > > + [
> > > + words("Please ensure that these"),
> > > + words("argument rearrangements"),
> > > + words("do not introduce"),
> > > + words("performance problems."),
> > > + words("These warnings can"),
> > > + words("be suppressed by"),
> > > + words("--inhibit-accumulator-warnings.")
> >
> > Put the option name inside `single quotes'.
> >
> Done.
>
> > > +:- pred accumulator__warning(warning::in, prog_varset::in, module_info::in,
> > > + prog_context::out, list(format_component)::out) is det.
> > > +
> > > +accumulator__warning(w(Context, PredId, VarA, VarB), VarSet, ModuleInfo,
> > > + Context, Formats) :-
> > > + error_util__describe_one_pred_name(ModuleInfo, PredId, PredStr),
> > > + varset__lookup_name(VarSet, VarA, VarAStr),
> > > + varset__lookup_name(VarSet, VarB, VarBStr),
> > > + Formats = [words("warning: The"), words(PredStr),
> > > + words("has had the location of the variables"),
> > > + words(VarAStr), words("and"), words(VarBStr),
> > > + words("swapped to allow accumulator introduction.")
> > > + ].
> >
> > I think you should probably replace "The" with "the call to".
> >
> > I can anticipate that this warning will confuse a lot of users,
> > so you should definitely include a verbose expanation that is
> > enabled by --verbose-errors.
> >
>
> How about:
> If a predicate has been declared associative via a promise
> declaration, the compiler is required to rearrange the order of that
> call to the predicates arguments if it makes the containing
> predicate tail recursive. If this changes the performance
> characteristics of the call to the predicate, use
> `--no-accumulator-introduction' to turn the optimization off, or
> `--inhibit-accumulator-warnings' to turn ignore the warnings.
>
> > It would be a good idea to have a test case in tests/warnings
> > to test this warning.
> >
> Will do when this code is checked in.
>
> > > +assertion__is_associativity_assertion(AssertId, Module, CallVars,
> > > + AssociativeVars) :-
> > > + assertion__goal(AssertId, Module, Goal - GoalInfo),
> > > + equivalent(Goal - GoalInfo, P, Q),
> > > +
> > > + goal_info_get_nonlocals(GoalInfo, UniversiallyQuantifiedVars),
> > > +
> > > + P = some(_, _, conj(PCalls) - _) - _PGoalInfo,
> > > + Q = some(_, _, conj(QCalls) - _) - _QGoalInfo,
> > > +
> > > + AssociativeVars = promise_only_solution(associative(PCalls, QCalls,
> > > + UniversiallyQuantifiedVars, CallVars)).
> >
> > I think the code here should have a comment explaining why the
> > call to promise_only_solution is needed and why it is guaranteed
> > to only have one solution (if, indeed, it is -- from a brief perusal
> > of the code it wasn't immediately clear to me that that was the case).
> >
> There should be only one or zero solutions. The call to list__perm
> ensures this, as the pairs are not symmetric.
>
> list__perm(Pairs, [(A - AB) - (B - A), (B - C) - (C - BC),
> (AB - ABC) - (BC - ABC)]),
>
> Pete
> --------------------------------------------------------------------------
> mercury-developers mailing list
> Post messages to: mercury-developers at cs.mu.oz.au
> Administrative Queries: owner-mercury-developers at cs.mu.oz.au
> Subscriptions: mercury-developers-request at cs.mu.oz.au
> --------------------------------------------------------------------------
----
Peter Ross
PhD Student University of Melbourne
http://www.cs.mu.oz.au/~petdr/
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions: mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------
More information about the developers
mailing list