Commit Graph

3 Commits

Author SHA1 Message Date
Zoltan Somogyi
c5fc9a929d Print the contexts of later disjuncts ...
compiler/det_report.m:
    ... when a "declared det, inferred multi" kind of determinism error
    is caused by the (probably unexpected, possibly hard-to-see) presence
    of a disjunction.

    Change the wording to refer to "disjuncts" instead of "clauses";
    while in Mercury, all clauses in multi-clause definitions are implicitly
    also disjuncts, not all disjuncts are whole clauses.

tests/invalid/bug496.err_exp:
tests/invalid/det_errors.err_exp:
tests/invalid/not_a_switch.err_exp:
tests/invalid/require_scopes.err_exp:
tests/invalid/switch_arm_multi_not_det.err_exp:
    Expect the updated form of the error message.
2022-12-04 23:33:37 +11:00
Zoltan Somogyi
209c546a77 Explain the components of determinism error msgs.
compiler/det_report.m:
    When we report that a predicate does not satisfy the requirements
    of its determinism declaration, we follow that statement with a list
    of statements about pieces of code that all contribute to that mismatch.
    However, a thread on m-users last month showed that some users did not
    make that connection. So add an explicit statement to that effect.

tests/invalid/bug150.err_exp:
tests/invalid/bug496.err_exp:
tests/invalid/det_atomic_goal_msgs.err_exp:
tests/invalid/det_errors.err_exp:
tests/invalid/magicbox.err_exp:
tests/invalid/not_a_switch.err_exp:
tests/invalid/try_detism.err_exp:
tests/invalid/user_field_access_decl_override.err_exp:
    Expect updated error messages.
2021-08-27 21:57:01 +10:00
Zoltan Somogyi
036b97ff7d Emit a reminder about a limitation of cse_detection when needed.
Common subexpression elimination (cse) declines to do its job of transforming

    (
        X = f(A1, ..., An),
        goal A
    ;
        X = f(B1, ..., Bn),
        goal B
    )

into

    X = f(X1, ..., Xn),
    (
        A1 = X1, ..., An = Xn,
        goal A
    ;
        B1 = X1, ..., Bn = Xn,
        goal B
    )

when the insts of some of X's arguments are at least partially unique,
because mode analysis cannot track uniqueness through the extra unifications
that this transformation introduces. When this happens, and the procedure
this code is in does not match its declared determinism, generate a message
that gives this fact as a possible reason for that determinism mismatch.

This fixes Mantis bug #496 to the extent that we *can* fix it
without rewriting the whole of mode analysis.

compiler/hlds_pred.m:
    Provide a slot in the proc_info for recording whether cse has declined
    to pull a common unification out of a branched control structure because
    of this concern, and if so, at what locations in the source code.

    An unrelated change: move a slot used only by constraint-based mode
    analysis, which is never enabled, from the proc_info to the proc_sub_info.
    This should improve both speed and memory consumption, though very
    slightly.

compiler/cse_detection.m:
    Record each such location in this slot.

    Doing this requires a change in approach. Previously, we did not try
    to pull a unification out of any branch of a branched control structure
    if it involved (partially or wholly) unique arguments. However, doing
    this in just one branch cannot possibly affect the output of cse detection,
    since it pulls a unification out of a branch only if can pull the same
    unification out of all the other branches as well.

    Our new approach is to transform branched control structures regardless
    of uniqueness, and then *undo* the transformation (simply by discarding
    its result) if it involves unique arguments. It is such undoing that we
    record in the proc_info.

compiler/switch_detection.m:
    Conform to the new approach.

compiler/hlds_out_pred.m:
    Print the contents of the new slot in HLDS dumps.

compiler/det_report.m:
    If the actual determinism of a procedure, as computed by determinism
    analysis, does not match its declared determinism, *and* if the proc_info's
    new slot says that cse declined to pull some common unifications
    out of a branched control structure, then mention that fact, and
    the usual fix, as a possible explanation of the determinism problem.

tests/invalid/bug496.{m,err_exp}:
    The Mantis test case.

tests/invalid/Mmakefile:
    Enable the new test case.
2020-02-07 11:56:54 +11:00