[m-rev.] for post-commit review: mode_info speed up

Zoltan Somogyi zs at csse.unimelb.edu.au
Tue Aug 14 11:51:42 AEST 2007


There are no real algorithmic changes in the diff, just doing the same thing
slightly differently.

Zoltan.

Improve the performance of the compiler by making sure that the mode_info
structure contains only its most frequently updated and/or accessed fields
and that these fit into an eight-word memory cell, moving the rest of the
fields to the mode_sub_info structure. This improves performance on our
standard benchmark from 20.60 seconds to 19.06 seconds, an improvement of 7%.

compiler/mode_info.m:
	Make the change described above.

	Several fields of mode_sub_info were bools. Replace these with
	single-purpose types, to make them harder to mix up, especially
	during initialization.

	Similarly, replace the type of the field used for checking parallel
	conjunctions with a specialized type instead of a pair.

	Rename some predicates for greater consistency with the rest of the
	compiler.

	Rename field names to avoid ambiguities.

	Use the access predicates instead of field access syntax to access the
	fields of mode_info and mode_sub_info, to make any similar changes
	easier in the future, and also to make statistics about frequency
	of field accesses easier to gather.

compiler/modecheck_call.m:
compiler/modecheck_unify.m:
compiler/modes.m:
	Conform to the changes in mode_info.

compiler/modes.m:
compiler/unique_modes.m:
	Do not execute the (save, set to known value, restore) sequence
	for the "duplicated for switch" feature unless necessary. This
	avoids a bunch of accesses and updates to the mode_sub_info.

	In both cases, this required moving some code that would otherwise
	have had to be duplicated into an inlined predicate.
	
	In unique_modes.m, rename a predicate to allow its name to be used
	for the new inlined predicate.

compiler/Mercury.options:
	Change the inlining limit to allow those predicates to be inlined.

cvs diff: Diffing .
cvs diff: Diffing analysis
cvs diff: Diffing bindist
cvs diff: Diffing boehm_gc
cvs diff: Diffing boehm_gc/Mac_files
cvs diff: Diffing boehm_gc/cord
cvs diff: Diffing boehm_gc/cord/private
cvs diff: Diffing boehm_gc/doc
cvs diff: Diffing boehm_gc/include
cvs diff: Diffing boehm_gc/include/private
cvs diff: Diffing boehm_gc/libatomic_ops-1.2
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/doc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/gcc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/hpc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/ibmc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/icc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/msftc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/src/atomic_ops/sysdeps/sunc
cvs diff: Diffing boehm_gc/libatomic_ops-1.2/tests
cvs diff: Diffing boehm_gc/tests
cvs diff: Diffing boehm_gc/windows-untested
cvs diff: Diffing boehm_gc/windows-untested/vc60
cvs diff: Diffing boehm_gc/windows-untested/vc70
cvs diff: Diffing boehm_gc/windows-untested/vc71
cvs diff: Diffing browser
cvs diff: Diffing bytecode
cvs diff: Diffing compiler
Index: compiler/Mercury.options
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/Mercury.options,v
retrieving revision 1.31
diff -u -b -r1.31 Mercury.options
--- compiler/Mercury.options	20 Jul 2007 01:22:00 -0000	1.31
+++ compiler/Mercury.options	13 Aug 2007 03:50:13 -0000
@@ -26,6 +26,9 @@
 MGNUCFLAGS-make.module_target = --no-ansi
 MGNUCFLAGS-make.program_target = --no-ansi
 
+MCFLAGS-check_hlds.modes = --inline-vars-threshold 10000
+MCFLAGS-check_hlds.unique_modes = --inline-vars-threshold 10000
+
 MCFLAGS-libs.process_util = --no-ansi-c
 MCFLAGS-make.module_dep_file = --no-ansi-c
 MCFLAGS-make.module_target = --no-ansi-c
Index: compiler/mode_errors.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/mode_errors.m,v
retrieving revision 1.118
diff -u -b -r1.118 mode_errors.m
--- compiler/mode_errors.m	7 Aug 2007 07:09:59 -0000	1.118
+++ compiler/mode_errors.m	13 Aug 2007 06:08:02 -0000
@@ -662,8 +662,8 @@
         CalleeModeErrors = [First | _],
         First = mode_error_info(_, CalleeModeError,
             CalleeContext, CalleeModeContext),
-        mode_info_set_predid(CalleePredId, !ModeInfo),
-        mode_info_set_procid(CalleeProcId, !ModeInfo),
+        mode_info_set_pred_id(CalleePredId, !ModeInfo),
+        mode_info_set_proc_id(CalleeProcId, !ModeInfo),
         mode_info_set_context(CalleeContext, !ModeInfo),
         mode_info_set_mode_context(CalleeModeContext, !ModeInfo),
         CalleeModeErrorSpec = mode_error_to_spec(!.ModeInfo, CalleeModeError),
@@ -1006,8 +1006,8 @@
 mode_info_context_preamble(ModeInfo) = Pieces :-
     mode_info_get_module_info(ModeInfo, ModuleInfo),
     mode_info_get_context(ModeInfo, Context),
-    mode_info_get_predid(ModeInfo, PredId),
-    mode_info_get_procid(ModeInfo, ProcId),
+    mode_info_get_pred_id(ModeInfo, PredId),
+    mode_info_get_proc_id(ModeInfo, ProcId),
     module_info_pred_proc_info(ModuleInfo, PredId, ProcId,
         PredInfo, ProcInfo),
     PredOrFunc = pred_info_is_pred_or_func(PredInfo),
Index: compiler/mode_info.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/mode_info.m,v
retrieving revision 1.94
diff -u -b -r1.94 mode_info.m
--- compiler/mode_info.m	17 May 2007 03:52:46 -0000	1.94
+++ compiler/mode_info.m	13 Aug 2007 06:50:18 -0000
@@ -36,7 +36,6 @@
 :- import_module bool.
 :- import_module list.
 :- import_module maybe.
-:- import_module pair.
 :- import_module set.
 
 %-----------------------------------------------------------------------------%
@@ -108,14 +107,50 @@
     proc_id::in, prog_context::in, set(prog_var)::in, instmap::in,
     how_to_check_goal::in, may_change_called_proc::in, mode_info::out) is det.
 
+:- type need_to_requantify
+    --->    need_to_requantify
+    ;       do_not_need_to_requantify.
+
+    % The mode_info contains a flag indicating whether initialisation calls,
+    % converting a solver variable from `free' to `any', may be inserted
+    % during mode analysis.
+:- type may_init_solver_vars
+    --->    may_init_solver_vars
+    ;       may_not_init_solver_vars.
+
+:- type in_promise_purity_scope
+    --->    in_promise_purity_scope
+    ;       not_in_promise_purity_scope.
+
+:- type in_from_ground_term
+    --->    in_from_ground_term
+    ;       not_in_from_ground_term.
+
+:- type in_dupl_for_switch
+    --->    in_dupl_for_switch
+    ;       not_in_dupl_for_switch.
+
+    % We use a stack of pairs of sets of variables used to mode-check
+    % parallel conjunctions. The first set is the nonlocals of the
+    % parallel conjunction. The second set is a subset of the
+    % first, and is the set of variables that have been [further]
+    % bound inside the current parallel conjunct. The stack
+    % is for the correct handling of nested parallel conjunctions.
+:- type par_conj_mode_check_stack == list(par_conj_mode_check).
+:- type par_conj_mode_check
+    --->    par_conj_mode_check(
+                par_conj_nonlocals  :: set(prog_var),
+                par_conj_bound      :: set(prog_var)
+            ).
+
 %-----------------------------------------------------------------------------%
 
 :- pred mode_info_get_module_info(mode_info::in, module_info::out) is det.
 :- pred mode_info_get_preds(mode_info::in, pred_table::out) is det.
 :- pred mode_info_get_modes(mode_info::in, mode_table::out) is det.
 :- pred mode_info_get_insts(mode_info::in, inst_table::out) is det.
-:- pred mode_info_get_predid(mode_info::in, pred_id::out) is det.
-:- pred mode_info_get_procid(mode_info::in, proc_id::out) is det.
+:- pred mode_info_get_pred_id(mode_info::in, pred_id::out) is det.
+:- pred mode_info_get_proc_id(mode_info::in, proc_id::out) is det.
 :- pred mode_info_get_debug_modes(mode_info::in, maybe(debug_flags)::out)
     is det.
 :- pred mode_info_get_context(mode_info::in, prog_context::out) is det.
@@ -125,8 +160,10 @@
 :- pred mode_info_get_errors(mode_info::in, list(mode_error_info)::out) is det.
 :- pred mode_info_get_warnings(mode_info::in, list(mode_warning_info)::out)
     is det.
-:- pred mode_info_get_need_to_requantify(mode_info::in, bool::out) is det.
-:- pred mode_info_get_in_promise_purity_scope(mode_info::in, bool::out) is det.
+:- pred mode_info_get_need_to_requantify(mode_info::in,
+    need_to_requantify::out) is det.
+:- pred mode_info_get_in_promise_purity_scope(mode_info::in,
+    in_promise_purity_scope::out) is det.
 :- pred mode_info_get_num_errors(mode_info::in, int::out) is det.
 :- pred mode_info_get_liveness(mode_info::in, set(prog_var)::out) is det.
 :- pred mode_info_get_varset(mode_info::in, prog_varset::out) is det.
@@ -139,23 +176,28 @@
 :- pred mode_info_get_last_checkpoint_insts(mode_info::in, instmap::out)
     is det.
 :- pred mode_info_get_parallel_vars(mode_info::in,
-    list(pair(set(prog_var)))::out) is det.
+    par_conj_mode_check_stack::out) is det.
 :- pred mode_info_get_changed_flag(mode_info::in, bool::out) is det.
 :- pred mode_info_get_how_to_check(mode_info::in,
     how_to_check_goal::out) is det.
 :- pred mode_info_get_may_change_called_proc(mode_info::in,
     may_change_called_proc::out) is det.
 :- pred mode_info_get_initial_instmap(mode_info::in, instmap::out) is det.
-:- pred mode_info_get_in_from_ground_term(mode_info::in, bool::out) is det.
-:- pred mode_info_get_in_dupl_for_switch(mode_info::in, bool::out) is det.
+:- pred mode_info_get_checking_extra_goals(mode_info::in, bool::out) is det.
+:- pred mode_info_get_may_init_solver_vars(mode_info::in,
+    may_init_solver_vars::out) is det.
+:- pred mode_info_get_in_from_ground_term(mode_info::in,
+    in_from_ground_term::out) is det.
+:- pred mode_info_get_in_dupl_for_switch(mode_info::in,
+    in_dupl_for_switch::out) is det.
 
 %-----------------------------------------------------------------------------%
 
 :- pred mode_info_set_module_info(module_info::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_predid(pred_id::in,
+:- pred mode_info_set_pred_id(pred_id::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_procid(proc_id::in,
+:- pred mode_info_set_proc_id(proc_id::in,
     mode_info::in, mode_info::out) is det.
 :- pred mode_info_set_context(prog_context::in,
     mode_info::in, mode_info::out) is det.
@@ -175,9 +217,9 @@
     mode_info::in, mode_info::out) is det.
 :- pred mode_info_set_warnings(list(mode_warning_info)::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_need_to_requantify(bool::in,
+:- pred mode_info_set_need_to_requantify(need_to_requantify::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_in_promise_purity_scope(bool::in,
+:- pred mode_info_set_in_promise_purity_scope(in_promise_purity_scope::in,
     mode_info::in, mode_info::out) is det.
 :- pred mode_info_add_live_vars(set(prog_var)::in,
     mode_info::in, mode_info::out) is det.
@@ -195,7 +237,7 @@
     mode_info::in, mode_info::out) is det.
 :- pred mode_info_set_last_checkpoint_insts(instmap::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_parallel_vars(list(pair(set(prog_var)))::in,
+:- pred mode_info_set_parallel_vars(par_conj_mode_check_stack::in,
     mode_info::in, mode_info::out) is det.
 :- pred mode_info_set_changed_flag(bool::in,
     mode_info::in, mode_info::out) is det.
@@ -205,9 +247,11 @@
     mode_info::in, mode_info::out) is det.
 :- pred mode_info_set_checking_extra_goals(bool::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_in_from_ground_term(bool::in,
+:- pred mode_info_set_may_init_solver_vars(may_init_solver_vars::in,
     mode_info::in, mode_info::out) is det.
-:- pred mode_info_set_in_dupl_for_switch(bool::in,
+:- pred mode_info_set_in_from_ground_term(in_from_ground_term::in,
+    mode_info::in, mode_info::out) is det.
+:- pred mode_info_set_in_dupl_for_switch(in_dupl_for_switch::in,
     mode_info::in, mode_info::out) is det.
 
 %-----------------------------------------------------------------------------%
@@ -262,18 +306,7 @@
 
 %-----------------------------------------------------------------------------%
 
-    % The mode_info contains a flag indicating whether initialisation calls,
-    % converting a solver variable from `free' to `any', may be inserted
-    % during mode analysis.
-    %
-:- pred mode_info_may_initialise_solver_vars(mode_info::in)
-    is semidet.
-
-:- pred mode_info_get_may_initialise_solver_vars(bool::out, mode_info::in)
-    is det.
-
-:- pred mode_info_set_may_initialise_solver_vars(bool::in,
-    mode_info::in, mode_info::out) is det.
+:- pred mode_info_may_init_solver_vars(mode_info::in) is semidet.
 
 %-----------------------------------------------------------------------------%
 %-----------------------------------------------------------------------------%
@@ -290,6 +323,7 @@
 
 :- import_module int.
 :- import_module map.
+:- import_module pair.
 :- import_module string.
 :- import_module svbag.
 :- import_module term.
@@ -297,11 +331,53 @@
 
 :- type mode_sub_info
     --->    mode_sub_info(
+                % The pred we are checking.
+                msi_pred_id                 :: pred_id,
+
                 % The mode which we are checking.
-                procid                  :: proc_id,
+                msi_proc_id                 :: proc_id,
 
                 % The variables in the current proc.
-                varset                  :: prog_varset,
+                msi_varset                  :: prog_varset,
+
+                % The types of the variables.
+                msi_vartypes                :: vartypes,
+
+                % Is mode debugging of this procedure enabled? If yes,
+                % is verbose mode debugging enabled, is minimal mode debugging
+                % enabled, and is statistics printing enabled?
+                msi_debug                   :: maybe(debug_flags),
+
+                % The "locked" variables, i.e. variables which cannot be
+                % further instantiated inside a negated context.
+                msi_locked_vars             :: locked_vars,
+
+                % The live variables, i.e. those variables which may be
+                % referenced again on forward execution or after shallow
+                % backtracking. (By shallow backtracking, I mean semidet
+                % backtracking in a negation, if-then-else, or semidet
+                % disjunction within the current predicate.)
+                msi_live_vars               :: bag(prog_var),
+
+                msi_instvarset              :: inst_varset,
+
+                % A stack of pairs of sets of variables used to mode-check
+                % parallel conjunctions. The first set is the nonlocals of the
+                % parallel conjunction. The second set is a subset of the
+                % first, and is the set of variables that have been [further]
+                % bound inside the current parallel conjunct - the stack
+                % is for the correct handling of nested parallel conjunctions.
+                msi_par_conj                :: par_conj_mode_check_stack,
+
+                msi_how_to_check            :: how_to_check_goal,
+
+                % Is mode analysis allowed to change which procedure is called?
+                msi_may_change_called_proc  :: may_change_called_proc,
+
+                % `yes' if calls to the initialisation predicates for solver
+                % vars can be inserted during mode analysis in order to make
+                % goals schedulable.
+                msi_may_init_solver_vars    :: may_init_solver_vars,
 
                 % This field is used by the checkpoint code when debug_modes
                 % is on. It has the instmap that was current at the last mode
@@ -310,86 +386,67 @@
                 % checkpoint. This field will always contain an unreachable
                 % instmap if debug_modes is off, since its information is not
                 % needed then.
-                last_checkpoint_insts   :: instmap,
+                msi_last_checkpoint_insts   :: instmap,
 
                 % Changed flag: if `yes', then we may need to repeat
                 % mode inference.
-                changed_flag            :: bool,
+                msi_changed_flag            :: bool,
 
                 % Are we rechecking a goal after introducing unifications
                 % for complicated sub-unifications or an implied mode? If so,
                 % redoing the mode check should not introduce more extra
                 % unifications.
-                checking_extra_goals    :: bool,
+                msi_checking_extra_goals    :: bool,
 
                 % The initial instmap of the procedure body. Used to decide
                 % whether a unification that cannot fail could be influenced
                 % by an argument mode that enforces a subtype.
-                initial_instmap         :: instmap,
+                msi_initial_instmap         :: instmap,
 
                 % The mode warnings found.
-                warnings                :: list(mode_warning_info),
+                msi_warnings                :: list(mode_warning_info),
 
                 % Set to `yes' if we need to requantify the procedure body
                 % after mode analysis finishes.
-                need_to_requantify      :: bool,
+                msi_need_to_requantify      :: need_to_requantify,
 
                 % Set to `yes' if we are in a promise_<purity> scope.
                 % This information is needed to check that potentially impure
                 % uses of inst any non-locals in negated contexts are properly
                 % acknowledged by the programmer.
-                in_promise_purity_scope :: bool,
+                msi_in_promise_purity_scope :: in_promise_purity_scope,
 
                 % Set to `yes' if we are in a from_ground_term scope.
                 % This information allows us to optimize some aspects of
                 % mode analysis.
-                in_from_ground_term     :: bool,
+                msi_in_from_ground_term     :: in_from_ground_term,
 
                 % Set to `yes' if we are inside a goal with a
                 % duplicate_for_switch feature.
-                in_dupl_for_switch      :: bool
+                msi_in_dupl_for_switch      :: in_dupl_for_switch
             ).
 
+    % Please try to keep the size of this structure down to eight fields.
+    % Even one more field will cause the Boehm allocator to round up the size
+    % of each memory cell to 16 words.
 :- type mode_info
     --->    mode_info(
-                module_info             :: module_info,
-
-                % The pred we are checking.
-                predid                  :: pred_id,
-
-                % The types of the variables.
-                var_types               :: vartypes,
-
-                % Is mode debugging of this procedure enabled? If yes,
-                % is verbose mode debugging enabled, is minimal mode debugging
-                % enabled, and is statistics printing enabled?
-                debug                   :: maybe(debug_flags),
-
-                % The line number of the subgoal we are currently checking.
-                context                 :: prog_context,
-
-                % A description of where in the goal the error occurred.
-                mode_context            :: mode_context,
+                mi_module_info              :: module_info,
 
                 % The current instantiatedness of the variables.
-                instmap                 :: instmap,
-
-                % The "locked" variables, i.e. variables which cannot be
-                % further instantiated inside a negated context.
-                locked_vars             :: locked_vars,
+                mi_instmap                  :: instmap,
 
                 % Info about delayed goals.
-                delay_info              :: delay_info,
+                mi_delay_info               :: delay_info,
 
                 % The mode errors found.
-                errors                  :: list(mode_error_info),
+                mi_errors                   :: list(mode_error_info),
 
-                % The live variables, i.e. those variables which may be
-                % referenced again on forward execution or after shallow
-                % backtracking. (By shallow backtracking, I mean semidet
-                % backtracking in a negation, if-then-else, or semidet
-                % disjunction within the current predicate.)
-                live_vars               :: bag(prog_var),
+                % A description of where in the goal the error occurred.
+                mi_mode_context             :: mode_context,
+
+                % The line number of the subgoal we are currently checking.
+                mi_context                  :: prog_context,
 
                 % The nondet-live variables, i.e. those variables which may be
                 % referenced again after deep backtracking TO THE CURRENT
@@ -400,35 +457,14 @@
                 % to a point EARLIER THAN the current execution point, since
                 % those variables will *already* have been marked as
                 % mostly_unique rather than unique.)
-                nondet_live_vars        :: bag(prog_var),
-
-                instvarset              :: inst_varset,
-
-                % A stack of pairs of sets of variables used to mode-check
-                % parallel conjunctions. The first set is the nonlocals of the
-                % parallel conjunction. The second set is a subset of the
-                % first, and is the set of variables that have been [further]
-                % bound inside the current parallel conjunct - the stack
-                % is for the correct handling of nested parallel conjunctions.
-                parallel_vars           :: list(pair(set(prog_var),
-                                            set(prog_var))),
+                mi_nondet_live_vars         :: bag(prog_var),
 
-                how_to_check            :: how_to_check_goal,
-
-                % Is mode analysis allowed to change which procedure is called?
-                may_change_called_proc  :: may_change_called_proc,
-
-                % `yes' if calls to the initialisation predicates for solver
-                % vars can be inserted during mode analysis in order to make
-                % goals schedulable.
-                may_initialise_solver_vars :: bool,
-
-                mode_sub_info           :: mode_sub_info
+                mi_sub_info                 :: mode_sub_info
             ).
 
 %-----------------------------------------------------------------------------%
 
-mode_info_init(ModuleInfo, PredId, ProcId, Context, LiveVars, InstMapping0,
+mode_info_init(ModuleInfo, PredId, ProcId, Context, LiveVars, InstMap0,
         HowToCheck, MayChangeProc, ModeInfo) :-
     module_info_get_globals(ModuleInfo, Globals),
     globals.lookup_bool_option(Globals, debug_modes, DebugModes),
@@ -449,131 +485,149 @@
         Debug = no
     ),
 
-    instmap.init_unreachable(Unreachable),
-    mode_context_init(ModeContext),
-    LockedVars = [],
-    delay_info_init(DelayInfo),
-    ErrorList = [],
-    WarningList = [],
-    module_info_preds(ModuleInfo, Preds),
-    map.lookup(Preds, PredId, PredInfo),
-    pred_info_get_procedures(PredInfo, Procs),
-    map.lookup(Procs, ProcId, ProcInfo),
+    module_info_proc_info(ModuleInfo, PredId, ProcId, ProcInfo),
     proc_info_get_varset(ProcInfo, VarSet),
     proc_info_get_vartypes(ProcInfo, VarTypes),
     proc_info_get_inst_varset(ProcInfo, InstVarSet),
 
     bag.from_set(LiveVars, LiveVarsBag),
-    bag.from_set(LiveVars, NondetLiveVarsBag),
+    instmap.init_unreachable(LastCheckpointInstMap),
+    LockedVars = [],
+    ParallelVars = [],
+    WarningList = [],
 
     Changed = no,
     CheckingExtraGoals = no,
-    MayInitSolverVars = yes,
-    NeedToRequantify = no,
-    InNegatedContext = no,
-
-    ModeSubInfo = mode_sub_info(ProcId, VarSet, Unreachable,
-        Changed, CheckingExtraGoals, InstMapping0, WarningList,
-        NeedToRequantify, InNegatedContext, no, no),
-
-    ModeInfo = mode_info(ModuleInfo, PredId, VarTypes, Debug,
-        Context, ModeContext, InstMapping0, LockedVars, DelayInfo,
-        ErrorList, LiveVarsBag, NondetLiveVarsBag, InstVarSet, [],
-        HowToCheck, MayChangeProc, MayInitSolverVars, ModeSubInfo).
+    MayInitSolverVars = may_init_solver_vars,
+    NeedToRequantify = do_not_need_to_requantify,
+    InPromisePurityScope = not_in_promise_purity_scope,
+    InFromGroundTerm = not_in_from_ground_term,
+    InDuplForSwitch = not_in_dupl_for_switch,
+
+    ModeSubInfo = mode_sub_info(PredId, ProcId, VarSet, VarTypes, Debug,
+        LockedVars, LiveVarsBag, InstVarSet, ParallelVars, HowToCheck,
+        MayChangeProc, MayInitSolverVars, LastCheckpointInstMap, Changed,
+        CheckingExtraGoals, InstMap0, WarningList, NeedToRequantify,
+        InPromisePurityScope, InFromGroundTerm, InDuplForSwitch),
+
+    mode_context_init(ModeContext),
+    delay_info_init(DelayInfo),
+    ErrorList = [],
+    bag.from_set(LiveVars, NondetLiveVarsBag),
+
+    ModeInfo = mode_info(ModuleInfo, InstMap0, DelayInfo, ErrorList,
+        ModeContext, Context, NondetLiveVarsBag, ModeSubInfo).
 
 %-----------------------------------------------------------------------------%
 
-mode_info_get_module_info(MI, MI ^ module_info).
-mode_info_get_predid(MI, MI ^ predid).
-mode_info_get_procid(MI, MI ^ mode_sub_info ^ procid).
-mode_info_get_debug_modes(MI, MI ^ debug).
-mode_info_get_varset(MI, MI ^ mode_sub_info ^ varset).
-mode_info_get_var_types(MI, MI ^ var_types).
-mode_info_get_context(MI, MI ^ context).
-mode_info_get_mode_context(MI, MI ^ mode_context).
-mode_info_get_instmap(MI, MI ^ instmap).
-mode_info_get_instvarset(ModeInfo, ModeInfo ^ instvarset).
-mode_info_get_locked_vars(MI, MI ^ locked_vars).
-mode_info_get_errors(MI, MI ^ errors).
-mode_info_get_warnings(MI, MI ^ mode_sub_info ^ warnings).
-mode_info_get_need_to_requantify(MI, MI ^ mode_sub_info ^ need_to_requantify).
+mode_info_get_module_info(MI, MI ^ mi_module_info).
+mode_info_get_pred_id(MI, MI ^ mi_sub_info ^ msi_pred_id).
+mode_info_get_proc_id(MI, MI ^ mi_sub_info ^ msi_proc_id).
+mode_info_get_debug_modes(MI, MI ^ mi_sub_info ^ msi_debug).
+mode_info_get_varset(MI, MI ^ mi_sub_info ^ msi_varset).
+mode_info_get_var_types(MI, MI ^ mi_sub_info ^ msi_vartypes).
+mode_info_get_context(MI, MI ^ mi_context).
+mode_info_get_mode_context(MI, MI ^ mi_mode_context).
+mode_info_get_instmap(MI, MI ^ mi_instmap).
+mode_info_get_instvarset(ModeInfo, ModeInfo ^ mi_sub_info ^ msi_instvarset).
+mode_info_get_locked_vars(MI, MI ^ mi_sub_info ^ msi_locked_vars).
+mode_info_get_errors(MI, MI ^ mi_errors).
+mode_info_get_warnings(MI, MI ^ mi_sub_info ^ msi_warnings).
+mode_info_get_need_to_requantify(MI,
+    MI ^ mi_sub_info ^ msi_need_to_requantify).
 mode_info_get_in_promise_purity_scope(MI,
-    MI ^ mode_sub_info ^ in_promise_purity_scope).
-mode_info_get_delay_info(MI, MI ^ delay_info).
-mode_info_get_live_vars(MI, MI ^ live_vars).
-mode_info_get_nondet_live_vars(MI, MI ^ nondet_live_vars).
+    MI ^ mi_sub_info ^ msi_in_promise_purity_scope).
+mode_info_get_delay_info(MI, MI ^ mi_delay_info).
+mode_info_get_live_vars(MI, MI ^ mi_sub_info ^ msi_live_vars).
+mode_info_get_nondet_live_vars(MI, MI ^ mi_nondet_live_vars).
 mode_info_get_last_checkpoint_insts(MI,
-    MI ^ mode_sub_info ^ last_checkpoint_insts).
-mode_info_get_parallel_vars(MI, MI ^  parallel_vars).
-mode_info_get_changed_flag(MI, MI ^ mode_sub_info ^ changed_flag).
-mode_info_get_how_to_check(MI, MI ^ how_to_check).
-mode_info_get_may_change_called_proc(MI, MI ^ may_change_called_proc).
-mode_info_get_initial_instmap(MI, MI ^ mode_sub_info ^ initial_instmap).
+    MI ^ mi_sub_info ^ msi_last_checkpoint_insts).
+mode_info_get_parallel_vars(MI, MI ^  mi_sub_info ^ msi_par_conj).
+mode_info_get_changed_flag(MI, MI ^ mi_sub_info ^ msi_changed_flag).
+mode_info_get_how_to_check(MI, MI ^ mi_sub_info ^ msi_how_to_check).
+mode_info_get_may_change_called_proc(MI,
+    MI ^ mi_sub_info ^ msi_may_change_called_proc).
+mode_info_get_may_init_solver_vars(MI,
+    MI ^ mi_sub_info ^ msi_may_init_solver_vars).
+mode_info_get_initial_instmap(MI, MI ^ mi_sub_info ^ msi_initial_instmap).
+mode_info_get_checking_extra_goals(MI,
+    MI ^ mi_sub_info ^ msi_checking_extra_goals).
 mode_info_get_in_from_ground_term(MI,
-    MI ^ mode_sub_info ^ in_from_ground_term).
+    MI ^ mi_sub_info ^ msi_in_from_ground_term).
 mode_info_get_in_dupl_for_switch(MI,
-    MI ^ mode_sub_info ^ in_dupl_for_switch).
+    MI ^ mi_sub_info ^ msi_in_dupl_for_switch).
 
-mode_info_set_module_info(ModuleInfo, MI, MI ^ module_info := ModuleInfo).
-mode_info_set_predid(PredId, MI, MI ^ predid := PredId).
-mode_info_set_procid(ProcId, MI, MI ^ mode_sub_info ^ procid := ProcId).
-mode_info_set_varset(VarSet, MI, MI ^ mode_sub_info ^ varset := VarSet).
-mode_info_set_var_types(VTypes, MI, MI ^ var_types := VTypes).
-mode_info_set_context(Context, MI, MI ^ context := Context).
-mode_info_set_mode_context(ModeContext, MI, MI ^ mode_context := ModeContext).
-mode_info_set_locked_vars(LockedVars, MI, MI ^ locked_vars := LockedVars).
-mode_info_set_errors(Errors, MI, MI ^ errors := Errors).
+mode_info_set_module_info(ModuleInfo, MI, MI ^ mi_module_info := ModuleInfo).
+mode_info_set_pred_id(PredId, MI, MI ^ mi_sub_info ^ msi_pred_id := PredId).
+mode_info_set_proc_id(ProcId, MI, MI ^ mi_sub_info ^ msi_proc_id := ProcId).
+mode_info_set_varset(VarSet, MI, MI ^ mi_sub_info ^ msi_varset := VarSet).
+mode_info_set_var_types(VarTypes, MI,
+    MI ^ mi_sub_info ^ msi_vartypes := VarTypes).
+mode_info_set_context(Context, MI, MI ^ mi_context := Context).
+mode_info_set_mode_context(ModeContext,
+    MI, MI ^ mi_mode_context := ModeContext).
+mode_info_set_locked_vars(LockedVars, MI,
+    MI ^ mi_sub_info ^ msi_locked_vars := LockedVars).
+mode_info_set_errors(Errors, MI, MI ^ mi_errors := Errors).
 mode_info_set_warnings(Warnings, MI,
-    MI ^ mode_sub_info ^ warnings := Warnings).
+    MI ^ mi_sub_info ^ msi_warnings := Warnings).
 mode_info_set_need_to_requantify(NTRQ, MI,
-    MI ^ mode_sub_info ^ need_to_requantify := NTRQ).
+    MI ^ mi_sub_info ^ msi_need_to_requantify := NTRQ).
 mode_info_set_in_promise_purity_scope(INC, MI,
-    MI ^ mode_sub_info ^ in_promise_purity_scope := INC).
-mode_info_set_delay_info(DelayInfo, MI, MI ^ delay_info := DelayInfo).
-mode_info_set_live_vars(LiveVarsList, MI, MI ^ live_vars := LiveVarsList).
+    MI ^ mi_sub_info ^ msi_in_promise_purity_scope := INC).
+mode_info_set_delay_info(DelayInfo, MI, MI ^ mi_delay_info := DelayInfo).
+mode_info_set_live_vars(LiveVarsList, MI,
+    MI ^ mi_sub_info ^ msi_live_vars := LiveVarsList).
 mode_info_set_nondet_live_vars(NondetLiveVars, MI,
-    MI ^ nondet_live_vars := NondetLiveVars).
+    MI ^ mi_nondet_live_vars := NondetLiveVars).
 mode_info_set_last_checkpoint_insts(LastCheckpointInsts, MI,
-    MI ^ mode_sub_info ^ last_checkpoint_insts := LastCheckpointInsts).
-mode_info_set_parallel_vars(PVars, MI, MI ^ parallel_vars := PVars).
+    MI ^ mi_sub_info ^ msi_last_checkpoint_insts := LastCheckpointInsts).
+mode_info_set_parallel_vars(PVars, MI,
+    MI ^ mi_sub_info ^ msi_par_conj := PVars).
 mode_info_set_changed_flag(Changed, MI,
-    MI ^ mode_sub_info ^ changed_flag := Changed).
-mode_info_set_how_to_check(How, MI, MI ^ how_to_check := How).
+    MI ^ mi_sub_info ^ msi_changed_flag := Changed).
+mode_info_set_how_to_check(How, MI,
+    MI ^ mi_sub_info ^ msi_how_to_check := How).
 mode_info_set_may_change_called_proc(MayChange, MI,
-    MI ^ may_change_called_proc := MayChange).
+    MI ^ mi_sub_info ^ msi_may_change_called_proc := MayChange).
+mode_info_set_may_init_solver_vars(MayInit, MI,
+    MI ^ mi_sub_info ^ msi_may_init_solver_vars := MayInit).
 mode_info_set_in_from_ground_term(FGI, MI,
-    MI ^ mode_sub_info ^ in_from_ground_term := FGI).
+    MI ^ mi_sub_info ^ msi_in_from_ground_term := FGI).
 mode_info_set_in_dupl_for_switch(INFS, MI,
-    MI ^ mode_sub_info ^ in_dupl_for_switch := INFS).
+    MI ^ mi_sub_info ^ msi_in_dupl_for_switch := INFS).
 
 %-----------------------------------------------------------------------------%
 
 mode_info_get_preds(ModeInfo, Preds) :-
-    module_info_preds(ModeInfo ^ module_info, Preds).
+    mode_info_get_module_info(ModeInfo, ModuleInfo),
+    module_info_preds(ModuleInfo, Preds).
 
 mode_info_get_modes(ModeInfo, Modes) :-
-    module_info_get_mode_table(ModeInfo ^ module_info, Modes).
+    mode_info_get_module_info(ModeInfo, ModuleInfo),
+    module_info_get_mode_table(ModuleInfo, Modes).
 
 mode_info_get_insts(ModeInfo, Insts) :-
-    module_info_get_inst_table(ModeInfo ^ module_info, Insts).
+    mode_info_get_module_info(ModeInfo, ModuleInfo),
+    module_info_get_inst_table(ModuleInfo, Insts).
 
 mode_info_set_call_context(call_context_unify(UnifyContext), !MI) :-
     mode_info_set_mode_context(mode_context_unify(UnifyContext, left), !MI).
 mode_info_set_call_context(call_context_call(CallId), !MI) :-
     mode_info_set_mode_context(mode_context_call(CallId, 0), !MI).
 
-mode_info_set_call_arg_context(ArgNum, ModeInfo0, ModeInfo) :-
-    mode_info_get_mode_context(ModeInfo0, ModeContext0),
+mode_info_set_call_arg_context(ArgNum, !ModeInfo) :-
+    mode_info_get_mode_context(!.ModeInfo, ModeContext0),
     (
         ModeContext0 = mode_context_call(CallId, _),
         mode_info_set_mode_context(mode_context_call(CallId, ArgNum),
-            ModeInfo0, ModeInfo)
+            !ModeInfo)
     ;
         ModeContext0 = mode_context_unify(_UnifyContext, _Side),
         % This only happens when checking that the typeinfo variables
         % for polymorphic complicated unifications are ground.
         % For that case, we don't care about the ArgNum.
-        ModeInfo = ModeInfo0
+        true
     ;
         ModeContext0 = mode_context_uninitialized,
         unexpected(this_file, "mode_info_set_call_arg_context uninitialized")
@@ -585,15 +639,15 @@
 %-----------------------------------------------------------------------------%
 
 mode_info_set_instmap(InstMap, !MI) :-
-    InstMap0 = !.MI ^ instmap,
-    !:MI = !.MI ^ instmap := InstMap,
+    mode_info_get_instmap(!.MI, InstMap0),
+    !MI ^ mi_instmap := InstMap,
     (
         instmap.is_unreachable(InstMap),
         instmap.is_reachable(InstMap0)
     ->
-        DelayInfo0 = !.MI ^ delay_info,
+        mode_info_get_delay_info(!.MI, DelayInfo0),
         delay_info_bind_all_vars(DelayInfo0, DelayInfo),
-        !:MI = !.MI ^ delay_info := DelayInfo
+        mode_info_set_delay_info(DelayInfo, !MI)
     ;
         true
     ).
@@ -601,7 +655,8 @@
 %-----------------------------------------------------------------------------%
 
 mode_info_get_num_errors(ModeInfo, NumErrors) :-
-    list.length(ModeInfo^errors, NumErrors).
+    mode_info_get_errors(ModeInfo, Errors),
+    list.length(Errors, NumErrors).
 
 %-----------------------------------------------------------------------------%
 
@@ -614,29 +669,30 @@
     % nondet-live vars.
 
 mode_info_add_live_vars(NewLiveVars, !MI) :-
-    LiveVars0 = !.MI ^ live_vars,
-    NondetLiveVars0 = !.MI ^ nondet_live_vars,
+    mode_info_get_live_vars(!.MI, LiveVars0),
+    mode_info_get_nondet_live_vars(!.MI, NondetLiveVars0),
     svbag.insert_set(NewLiveVars, LiveVars0, LiveVars),
     svbag.insert_set(NewLiveVars, NondetLiveVars0, NondetLiveVars),
-    !:MI = !.MI ^ live_vars := LiveVars,
-    !:MI = !.MI ^ nondet_live_vars := NondetLiveVars.
+    mode_info_set_live_vars(LiveVars, !MI),
+    mode_info_set_nondet_live_vars(NondetLiveVars, !MI).
 
     % Remove a set of vars from the bag of live vars and
     % the bag of nondet-live vars.
 
 mode_info_remove_live_vars(OldLiveVars, !MI) :-
-    LiveVars0 = !.MI ^ live_vars,
-    NondetLiveVars0 = !.MI ^ nondet_live_vars,
+    mode_info_get_live_vars(!.MI, LiveVars0),
+    mode_info_get_nondet_live_vars(!.MI, NondetLiveVars0),
     svbag.det_remove_set(OldLiveVars, LiveVars0, LiveVars),
     svbag.det_remove_set(OldLiveVars, NondetLiveVars0, NondetLiveVars),
-    !:MI = !.MI ^ live_vars := LiveVars,
-    !:MI = !.MI ^ nondet_live_vars := NondetLiveVars,
+    mode_info_set_live_vars(LiveVars, !MI),
+    mode_info_set_nondet_live_vars(NondetLiveVars, !MI),
+
         % When a variable becomes dead, we may be able to wake up a goal
-        % which is waiting on that variable
+    % which is waiting on that variable.
     set.to_sorted_list(OldLiveVars, VarList),
-    DelayInfo0 = !.MI ^ delay_info,
+    mode_info_get_delay_info(!.MI, DelayInfo0),
     delay_info_bind_var_list(VarList, DelayInfo0, DelayInfo),
-    !:MI = !.MI ^ delay_info := DelayInfo.
+    mode_info_set_delay_info(DelayInfo, !MI).
 
 mode_info_var_list_is_live(_, [], []).
 mode_info_var_list_is_live(ModeInfo, [Var | Vars], [Live | Lives]) :-
@@ -646,21 +702,24 @@
     % Check whether a variable is live or not
 
 mode_info_var_is_live(ModeInfo, Var, Result) :-
-    ( bag.contains(ModeInfo ^ live_vars, Var) ->
+    mode_info_get_live_vars(ModeInfo, LiveVars0),
+    ( bag.contains(LiveVars0, Var) ->
         Result = is_live
     ;
         Result = is_dead
     ).
 
 mode_info_var_is_nondet_live(ModeInfo, Var, Result) :-
-    ( bag.contains(ModeInfo ^ nondet_live_vars, Var) ->
+    mode_info_get_nondet_live_vars(ModeInfo, NondetLiveVars0),
+    ( bag.contains(NondetLiveVars0, Var) ->
         Result = is_live
     ;
         Result = is_dead
     ).
 
 mode_info_get_liveness(ModeInfo, LiveVars) :-
-    bag.to_list_without_duplicates(ModeInfo ^ live_vars, SortedList),
+    mode_info_get_live_vars(ModeInfo, LiveVarsBag),
+    bag.to_list_without_duplicates(LiveVarsBag, SortedList),
     set.sorted_list_to_set(SortedList, LiveVars).
 
 %-----------------------------------------------------------------------------%
@@ -710,18 +769,17 @@
     ).
 
 mode_info_set_checking_extra_goals(Checking, !MI) :-
+    mode_info_get_checking_extra_goals(!.MI, Checking0),
     (
-        yes = !.MI ^ mode_sub_info ^ checking_extra_goals,
+        Checking0 = yes,
         Checking = yes
     ->
-        % This should never happen - once the extra goals are
-        % introduced, rechecking the goal should not introduce
-        % more extra goals.
+        % This should never happen - once the extra goals are introduced,
+        % rechecking the goal should not introduce more extra goals.
         unexpected(this_file, 
-            "mode analysis: rechecking extra goals " ++
-            "adds more extra goals")
+            "mode analysis: rechecking extra goals adds more extra goals")
     ;
-        !:MI = !.MI ^ mode_sub_info ^ checking_extra_goals := Checking
+        !MI ^ mi_sub_info ^ msi_checking_extra_goals := Checking
     ).
 
 %-----------------------------------------------------------------------------%
@@ -756,18 +814,13 @@
     mode_info_set_warnings(Warnings, !ModeInfo).
 
 mode_info_need_to_requantify(!ModeInfo) :-
-    mode_info_set_need_to_requantify(yes, !ModeInfo).
+    mode_info_set_need_to_requantify(need_to_requantify, !ModeInfo).
 
 %-----------------------------------------------------------------------------%
 
-mode_info_may_initialise_solver_vars(ModeInfo) :-
-    ModeInfo ^ may_initialise_solver_vars = yes.
-
-mode_info_get_may_initialise_solver_vars(MayInit, !.ModeInfo) :-
-    MayInit = !.ModeInfo ^ may_initialise_solver_vars.
-
-mode_info_set_may_initialise_solver_vars(MayInit, !ModeInfo) :-
-    !:ModeInfo = !.ModeInfo ^ may_initialise_solver_vars := MayInit.
+mode_info_may_init_solver_vars(ModeInfo) :-
+    mode_info_get_may_init_solver_vars(ModeInfo, MayInitSolverVars),
+    MayInitSolverVars = may_init_solver_vars.
 
 %-----------------------------------------------------------------------------%
 
Index: compiler/modecheck_call.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/modecheck_call.m,v
retrieving revision 1.79
diff -u -b -r1.79 modecheck_call.m
--- compiler/modecheck_call.m	17 May 2007 03:52:46 -0000	1.79
+++ compiler/modecheck_call.m	13 Aug 2007 06:20:02 -0000
@@ -407,13 +407,12 @@
 
 modecheck_end_of_call(ProcInfo, Purity, ProcArgModes, ArgVars0, ArgOffset,
         InstVarSub, ArgVars, ExtraGoals, !ModeInfo) :-
-    mode_info_get_may_initialise_solver_vars(MayInitSolverVars,
-        !.ModeInfo),
+    mode_info_get_may_init_solver_vars(!.ModeInfo, MayInitSolverVars),
 
     % Since we can't reschedule impure goals, we must allow the initialisation
     % of free solver type args if necessary in impure calls.
     ( Purity = purity_impure ->
-        mode_info_set_may_initialise_solver_vars(yes, !ModeInfo)
+        mode_info_set_may_init_solver_vars(may_init_solver_vars, !ModeInfo)
     ;
         true
     ),
@@ -433,7 +432,7 @@
     ;
         NeverSucceeds = no
     ),
-    mode_info_set_may_initialise_solver_vars(MayInitSolverVars, !ModeInfo).
+    mode_info_set_may_init_solver_vars(MayInitSolverVars, !ModeInfo).
 
 :- pred insert_new_mode(pred_id::in, list(prog_var)::in,
     maybe(determinism)::in, proc_id::out,
Index: compiler/modecheck_unify.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/modecheck_unify.m,v
retrieving revision 1.117
diff -u -b -r1.117 modecheck_unify.m
--- compiler/modecheck_unify.m	7 Aug 2007 07:10:00 -0000	1.117
+++ compiler/modecheck_unify.m	13 Aug 2007 06:12:40 -0000
@@ -130,7 +130,7 @@
     % insert initialisation calls at this point, then do so to allow
     % scheduling of the unification.
     (
-        mode_info_may_initialise_solver_vars(!.ModeInfo),
+        mode_info_may_init_solver_vars(!.ModeInfo),
         InstOfX0   = free,
         InstOfY0   = free,
         VarType    = VarTypes^elem(X),
@@ -523,7 +523,7 @@
         ArgVars0 = [_ | _],
         HowToCheckGoal = check_modes,
         inst_match.inst_is_free(ModuleInfo0, InstOfX),
-        mode_info_may_initialise_solver_vars(!.ModeInfo),
+        mode_info_may_init_solver_vars(!.ModeInfo),
         instmap.lookup_vars(ArgVars0, InstMap0, InstArgs0),
         all_arg_vars_are_non_free_or_solver_vars(ArgVars0, InstArgs0,
             VarTypes, ModuleInfo0, ArgVarsToInit)
@@ -624,7 +624,7 @@
         UnifyArgInsts = list.map(func(I) = yes(I), InstOfXArgs),
         mode_info_get_in_from_ground_term(!.ModeInfo, InFromGroundTerm),
         (
-            InFromGroundTerm = yes
+            InFromGroundTerm = in_from_ground_term
             % In the goals that result from the transformation of a unification
             % of a variable with a ground term, the variables on the right hand
             % sides of the construct unifications are all local to the scope
@@ -637,7 +637,7 @@
             % are N intermediate variables, the complexity of updating their
             % insts would be quadratic.
         ;
-            InFromGroundTerm = no,
+            InFromGroundTerm = not_in_from_ground_term,
             bind_args(Inst, ArgVars, UnifyArgInsts, !ModeInfo)
         )
     ;
@@ -687,16 +687,14 @@
             WarnCannotSucceed, !IO),
         (
             WarnCannotSucceed = yes,
-            mode_info_get_in_dupl_for_switch(!.ModeInfo, InDupForSwitch),
+            mode_info_get_in_dupl_for_switch(!.ModeInfo, InDuplForSwitch),
             (
-                InDupForSwitch = yes
-                %
+                InDuplForSwitch = in_dupl_for_switch
                 % Suppress the warning, since the unification may succeed
                 % in another copy of this duplicated switch arm.
-                %
             ;
-                InDupForSwitch = no,
-                mode_info_get_predid(!.ModeInfo, PredId),
+                InDuplForSwitch = not_in_dupl_for_switch,
+                mode_info_get_pred_id(!.ModeInfo, PredId),
                 mode_info_get_module_info(!.ModeInfo, ModuleInfo),
                 module_info_pred_info(ModuleInfo, PredId, PredInfo),
                 pred_info_get_origin(PredInfo, Origin),
@@ -870,8 +868,8 @@
     % since it is needed by polymorphism.unification_typeinfos.
 
     mode_info_get_module_info(ModeInfo, ModuleInfo),
-    mode_info_get_predid(ModeInfo, PredId),
-    mode_info_get_procid(ModeInfo, ProcId),
+    mode_info_get_pred_id(ModeInfo, PredId),
+    mode_info_get_proc_id(ModeInfo, ProcId),
     module_info_pred_proc_info(ModuleInfo, PredId, ProcId,
         _PredInfo, ProcInfo),
     proc_info_get_rtti_varmaps(ProcInfo, RttiVarMaps),
@@ -990,7 +988,7 @@
             WarnCannotSucceed = yes,
             mode_get_insts(ModuleInfo0, ModeOfX, InstOfX, _),
             mode_get_insts(ModuleInfo0, ModeOfY, InstOfY, _),
-            mode_info_get_predid(!.ModeInfo, PredId),
+            mode_info_get_pred_id(!.ModeInfo, PredId),
             module_info_pred_info(ModuleInfo, PredId, PredInfo),
             pred_info_get_origin(PredInfo, Origin),
             should_report_mode_warning_for_pred_origin(Origin, ReportWarning),
@@ -1106,7 +1104,7 @@
         % until runtime so that it only occurs if the compiler-generated
         % predicate gets called. not_reached is considered bound, so the
         % error message would be spurious if the instmap is unreachable.
-        mode_info_get_predid(!.ModeInfo, PredId),
+        mode_info_get_pred_id(!.ModeInfo, PredId),
         module_info_pred_info(ModuleInfo3, PredId, PredInfo),
         mode_info_get_instmap(!.ModeInfo, InstMap0),
         (
Index: compiler/modes.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/modes.m,v
retrieving revision 1.359
diff -u -b -r1.359 modes.m
--- compiler/modes.m	7 Aug 2007 07:10:00 -0000	1.359
+++ compiler/modes.m	13 Aug 2007 06:29:38 -0000
@@ -968,9 +968,9 @@
         proc_info_set_vartypes(VarTypes, !ProcInfo),
         proc_info_set_argmodes(ArgModes, !ProcInfo),
         (
-            NeedToRequantify = no
+            NeedToRequantify = do_not_need_to_requantify
         ;
-            NeedToRequantify = yes,
+            NeedToRequantify = need_to_requantify,
             requantify_proc(!ProcInfo)
         )
     ).
@@ -1123,12 +1123,9 @@
         % Make sure we set the final insts of any variables which
         % we assumed were dead to `clobbered'.
 
-        mode_info_get_preds(!.ModeInfo, Preds),
-        mode_info_get_predid(!.ModeInfo, PredId),
-        map.lookup(Preds, PredId, PredInfo),
-        pred_info_get_procedures(PredInfo, Procs),
-        mode_info_get_procid(!.ModeInfo, ProcId),
-        map.lookup(Procs, ProcId, ProcInfo),
+        mode_info_get_pred_id(!.ModeInfo, PredId),
+        mode_info_get_proc_id(!.ModeInfo, ProcId),
+        module_info_proc_info(ModuleInfo, PredId, ProcId, ProcInfo),
         proc_info_arglives(ProcInfo, ModuleInfo, ArgLives),
         maybe_clobber_insts(VarFinalInsts2, ArgLives, FinalInsts),
         check_final_insts(HeadVars, FinalInsts0, FinalInsts, InferModes, 1,
@@ -1245,8 +1242,8 @@
 %-----------------------------------------------------------------------------%
 %-----------------------------------------------------------------------------%
 
-modecheck_goal(hlds_goal(GoalExpr0, GoalInfo0), hlds_goal(GoalExpr, GoalInfo),
-        !ModeInfo, !IO) :-
+modecheck_goal(Goal0, Goal, !ModeInfo, !IO) :-
+    Goal0 = hlds_goal(GoalExpr0, GoalInfo0),
     % Note: any changes here may need to be duplicated in unique_modes.m.
 
     % Store the current context in the mode_info.
@@ -1257,20 +1254,28 @@
     ;
         mode_info_set_context(Context, !ModeInfo)
     ),
-    mode_info_get_in_dupl_for_switch(!.ModeInfo, InDuplForSwitch),
     ( goal_info_has_feature(GoalInfo0, feature_duplicated_for_switch) ->
-        mode_info_set_in_dupl_for_switch(yes, !ModeInfo)
+        mode_info_get_in_dupl_for_switch(!.ModeInfo, InDuplForSwitch),
+        mode_info_set_in_dupl_for_switch(in_dupl_for_switch, !ModeInfo),
+        modecheck_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO),
+        mode_info_set_in_dupl_for_switch(InDuplForSwitch, !ModeInfo)
     ;
-        true
-    ),
+        modecheck_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO)
+    ).
 
+:- pred modecheck_goal_2(hlds_goal_expr::in, hlds_goal_info::in,
+    hlds_goal::out, mode_info::in, mode_info::out, io::di, io::uo) is det.
+
+:- pragma inline(modecheck_goal_2/7).
+
+modecheck_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO) :-
     % Modecheck the goal, and then store the changes in instantiation
     % of the vars in the delta_instmap in the goal's goal_info.
     mode_info_get_instmap(!.ModeInfo, InstMap0),
     modecheck_goal_expr(GoalExpr0, GoalInfo0, GoalExpr, !ModeInfo, !IO),
     compute_goal_instmap_delta(InstMap0, GoalExpr, GoalInfo0, GoalInfo,
         !ModeInfo),
-    mode_info_set_in_dupl_for_switch(InDuplForSwitch, !ModeInfo).
+    Goal = hlds_goal(GoalExpr, GoalInfo).
 
 compute_goal_instmap_delta(InstMap0, GoalExpr, !GoalInfo, !ModeInfo) :-
     ( GoalExpr = conj(_, []) ->
@@ -1374,14 +1379,16 @@
         !ModeInfo),
     GoalExpr = if_then_else(Vars, Cond, Then, Else),
     mode_info_get_instmap(!.ModeInfo, InstMap),
-    ( mode_info_get_in_promise_purity_scope(!.ModeInfo, no) ->
+    mode_info_get_in_promise_purity_scope(!.ModeInfo, InPromisePurityScope),
+    (
+        InPromisePurityScope = not_in_promise_purity_scope,
         CondNonLocals0 = goal_get_nonlocals(Cond),
         CondNonLocals =
             set.to_sorted_list(CondNonLocals0 `intersect` NonLocals),
         check_no_inst_any_vars(if_then_else, CondNonLocals,
             InstMap0, InstMap, !ModeInfo)
     ;
-        true
+        InPromisePurityScope = in_promise_purity_scope
     ),
     mode_checkpoint(exit, "if-then-else", !ModeInfo, !IO).
 
@@ -1407,13 +1414,15 @@
     mode_info_set_live_vars(LiveVars0, !ModeInfo),
     mode_info_unlock_vars(var_lock_negation, NonLocals, !ModeInfo),
     mode_info_set_instmap(InstMap0, !ModeInfo),
-    ( mode_info_get_in_promise_purity_scope(!.ModeInfo, no) ->
+    mode_info_get_in_promise_purity_scope(!.ModeInfo, InPromisePurityScope),
+    (
+        InPromisePurityScope = not_in_promise_purity_scope,
         NegNonLocals = goal_info_get_nonlocals(GoalInfo0),
         instmap.init_unreachable(Unreachable),
         check_no_inst_any_vars(negation, set.to_sorted_list(NegNonLocals),
             InstMap0, Unreachable, !ModeInfo)
     ;
-        true
+        InPromisePurityScope = in_promise_purity_scope
     ),
     mode_checkpoint(exit, "not", !ModeInfo, !IO).
 
@@ -1472,7 +1481,7 @@
             list.reverse([UnifyTermGoal | UnifyArgGoals], RevConj),
             RevSubGoal0 = hlds_goal(conj(plain_conj, RevConj), SubGoalInfo),
             mode_info_get_in_from_ground_term(!.ModeInfo, WasInFromGroundTerm),
-            mode_info_set_in_from_ground_term(yes, !ModeInfo),
+            mode_info_set_in_from_ground_term(in_from_ground_term, !ModeInfo),
             mode_checkpoint(enter, "ground scope", !ModeInfo, !IO),
             modecheck_goal(RevSubGoal0, SubGoal, !ModeInfo, !IO),
             mode_checkpoint(exit, "ground scope", !ModeInfo, !IO),
@@ -1489,7 +1498,8 @@
     ;
         Reason = promise_purity(_Implicit, _Purity),
         mode_info_get_in_promise_purity_scope(!.ModeInfo, InPPScope),
-        mode_info_set_in_promise_purity_scope(yes, !ModeInfo),
+        mode_info_set_in_promise_purity_scope(in_promise_purity_scope,
+            !ModeInfo),
         mode_checkpoint(enter, "scope", !ModeInfo, !IO),
         modecheck_goal(SubGoal0, SubGoal, !ModeInfo, !IO),
         mode_checkpoint(exit, "scope", !ModeInfo, !IO),
@@ -1513,7 +1523,7 @@
         Args0, Args, GoalInfo0, ExtraGoals, !ModeInfo),
 
     mode_info_get_module_info(!.ModeInfo, ModuleInfo),
-    mode_info_get_predid(!.ModeInfo, CallerPredId),
+    mode_info_get_pred_id(!.ModeInfo, CallerPredId),
     Builtin = builtin_state(ModuleInfo, CallerPredId, PredId, ProcId),
     Call = plain_call(PredId, ProcId, Args, Builtin, Context, PredName),
     handle_extra_goals(Call, ExtraGoals, GoalInfo0, Args0, Args,
@@ -1957,7 +1967,7 @@
     mode_info_get_errors(!.ModeInfo, OldErrors),
     mode_info_set_errors([], !ModeInfo),
 
-    mode_info_get_may_initialise_solver_vars(MayInitEntryValue, !.ModeInfo),
+    mode_info_get_may_init_solver_vars(!.ModeInfo, OldMayInit),
 
     mode_info_get_delay_info(!.ModeInfo, DelayInfo0),
     delay_info_enter_conj(DelayInfo0, DelayInfo1),
@@ -1968,7 +1978,7 @@
 
     % Try to schedule goals without inserting any solver initialisation calls
     % by setting the mode_info flag may_initialise_solver_vars to no.
-    mode_info_set_may_initialise_solver_vars(no, !ModeInfo),
+    mode_info_set_may_init_solver_vars(may_not_init_solver_vars, !ModeInfo),
 
     modecheck_conj_list_2(ConjType, Goals0, Goals1,
         [], RevImpurityErrors0, !ModeInfo, !IO),
@@ -2017,7 +2027,7 @@
         )
     ),
         % Restore the value of the may_initialise_solver_vars flag.
-    mode_info_set_may_initialise_solver_vars(MayInitEntryValue, !ModeInfo).
+    mode_info_set_may_init_solver_vars(OldMayInit, !ModeInfo).
 
 mode_info_add_goals_live_vars(_ConjType, [], !ModeInfo).
 mode_info_add_goals_live_vars(ConjType, [Goal | Goals], !ModeInfo) :-
@@ -2575,10 +2585,14 @@
         delay_info_enter_conj(DelayInfo0, DelayInfo1),
         mode_info_set_delay_info(DelayInfo1, !ModeInfo),
 
-        mode_info_set_may_initialise_solver_vars(yes, !ModeInfo),
+        mode_info_get_may_init_solver_vars(!.ModeInfo, OldMayInit),
+        expect(unify(OldMayInit, may_not_init_solver_vars), this_file,
+            "modecheck_delayed_goals_eager: may init solver vars"),
+        mode_info_set_may_init_solver_vars(may_init_solver_vars, !ModeInfo),
         modecheck_conj_list_2(ConjType, Goals0, Goals1, !ImpurityErrors,
             !ModeInfo, !IO),
-        mode_info_set_may_initialise_solver_vars(no, !ModeInfo),
+        mode_info_set_may_init_solver_vars(may_not_init_solver_vars,
+            !ModeInfo),
 
         mode_info_get_delay_info(!.ModeInfo, DelayInfo2),
         delay_info_leave_conj(DelayInfo2, DelayedGoals1, DelayInfo3),
@@ -2623,7 +2637,7 @@
     delay_info_leave_conj(DelayInfo0, DelayedGoals0, DelayInfo1),
     mode_info_set_delay_info(DelayInfo1, !ModeInfo),
     mode_info_get_module_info(!.ModeInfo, ModuleInfo),
-    mode_info_get_predid(!.ModeInfo, PredId),
+    mode_info_get_pred_id(!.ModeInfo, PredId),
     module_info_pred_info(ModuleInfo, PredId, PredInfo),
     pred_info_get_clauses_info(PredInfo, ClausesInfo),
     clauses_info_get_headvar_list(ClausesInfo, HeadVars),
@@ -3078,10 +3092,10 @@
     (
         PVars0 = []
     ;
-        PVars0 = [NonLocals - Bound0 | PVars1],
+        PVars0 = [par_conj_mode_check(NonLocals, Bound0) | PVars1],
         ( set.member(Var0, NonLocals) ->
             set.insert(Bound0, Var0, Bound),
-            PVars = [NonLocals - Bound | PVars1]
+            PVars = [par_conj_mode_check(NonLocals, Bound) | PVars1]
         ;
             PVars = PVars0
         ),
@@ -3142,7 +3156,7 @@
         (
             mode_info_get_errors(!.ModeInfo, ModeErrors),
             ModeErrors = [],
-            mode_info_may_initialise_solver_vars(!.ModeInfo),
+            mode_info_may_init_solver_vars(!.ModeInfo),
             type_util.type_is_solver_type(ModuleInfo0, VarType)
         ->
             % Create code to initialize the variable to inst `any',
@@ -3231,8 +3245,8 @@
 
     % Get the relevant information for the procedure we are transforming
     % (i.e., the caller).
-    mode_info_get_predid(!.ModeInfo, PredId),
-    mode_info_get_procid(!.ModeInfo, ProcId),
+    mode_info_get_pred_id(!.ModeInfo, PredId),
+    mode_info_get_proc_id(!.ModeInfo, ProcId),
     module_info_pred_proc_info(ModuleInfo0, PredId, ProcId, PredInfo0,
         ProcInfo0),
     pred_info_get_typevarset(PredInfo0, TVarSet),
Index: compiler/unique_modes.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/unique_modes.m,v
retrieving revision 1.122
diff -u -b -r1.122 unique_modes.m
--- compiler/unique_modes.m	7 Aug 2007 07:10:09 -0000	1.122
+++ compiler/unique_modes.m	13 Aug 2007 06:09:25 -0000
@@ -126,13 +126,21 @@
     ;
         mode_info_set_context(Context, !ModeInfo)
     ),
-    mode_info_get_in_dupl_for_switch(!.ModeInfo, InDuplForSwitch),
     ( goal_info_has_feature(GoalInfo0, feature_duplicated_for_switch) ->
-        mode_info_set_in_dupl_for_switch(yes, !ModeInfo)
+        mode_info_get_in_dupl_for_switch(!.ModeInfo, InDuplForSwitch),
+        mode_info_set_in_dupl_for_switch(in_dupl_for_switch, !ModeInfo),
+        unique_modes_check_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO),
+        mode_info_set_in_dupl_for_switch(InDuplForSwitch, !ModeInfo)
     ;
-        true
-    ),
+        unique_modes_check_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO)
+    ).
+
+:- pred unique_modes_check_goal_2(hlds_goal_expr::in, hlds_goal_info::in,
+    hlds_goal::out, mode_info::in, mode_info::out, io::di, io::uo) is det.
 
+:- pragma inline(unique_modes_check_goal_2/7).
+
+unique_modes_check_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO) :-
     mode_info_get_instmap(!.ModeInfo, InstMap0),
     % Grab the original bag of nondet-live vars.
     mode_info_get_nondet_live_vars(!.ModeInfo, NondetLiveVars0),
@@ -146,7 +154,8 @@
         mode_info_set_nondet_live_vars(bag.init, !ModeInfo)
     ),
 
-    unique_modes_check_goal_2(GoalExpr0, GoalInfo0, GoalExpr, !ModeInfo, !IO),
+    unique_modes_check_goal_expr(GoalExpr0, GoalInfo0, GoalExpr,
+        !ModeInfo, !IO),
     % Restore the original bag of nondet-live vars.
     mode_info_set_nondet_live_vars(NondetLiveVars0, !ModeInfo),
 
@@ -154,8 +163,7 @@
     % and save that instmap_delta in the goal_info.
     compute_goal_instmap_delta(InstMap0, GoalExpr, GoalInfo0, GoalInfo,
         !ModeInfo),
-    Goal = hlds_goal(GoalExpr, GoalInfo),
-    mode_info_set_in_dupl_for_switch(InDuplForSwitch, !ModeInfo).
+    Goal = hlds_goal(GoalExpr, GoalInfo).
 
 make_all_nondet_live_vars_mostly_uniq(ModeInfo0, ModeInfo) :-
     mode_info_get_instmap(ModeInfo0, FullInstMap0),
@@ -250,11 +258,11 @@
         true
     ).
 
-:- pred unique_modes_check_goal_2(hlds_goal_expr::in, hlds_goal_info::in,
+:- pred unique_modes_check_goal_expr(hlds_goal_expr::in, hlds_goal_info::in,
     hlds_goal_expr::out, mode_info::in, mode_info::out,
     io::di, io::uo) is det.
 
-unique_modes_check_goal_2(conj(ConjType, List0), _GoalInfo0,
+unique_modes_check_goal_expr(conj(ConjType, List0), _GoalInfo0,
         conj(ConjType, List), !ModeInfo, !IO) :-
     mode_checkpoint(enter, "*conj", !ModeInfo, !IO),
     (
@@ -268,7 +276,7 @@
     ),
     mode_checkpoint(exit, "*conj", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(disj(List0), GoalInfo0, disj(List), !ModeInfo,
+unique_modes_check_goal_expr(disj(List0), GoalInfo0, disj(List), !ModeInfo,
         !IO) :-
     mode_checkpoint(enter, "disj", !ModeInfo, !IO),
     (
@@ -307,7 +315,7 @@
     ),
     mode_checkpoint(exit, "disj", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(if_then_else(Vars, Cond0, Then0, Else0), GoalInfo0,
+unique_modes_check_goal_expr(if_then_else(Vars, Cond0, Then0, Else0), GoalInfo0,
         Goal, !ModeInfo, !IO) :-
     mode_checkpoint(enter, "if-then-else", !ModeInfo, !IO),
     NonLocals = goal_info_get_nonlocals(GoalInfo0),
@@ -375,7 +383,7 @@
     Goal = if_then_else(Vars, Cond, Then, Else),
     mode_checkpoint(exit, "if-then-else", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(negation(SubGoal0), GoalInfo0, negation(SubGoal),
+unique_modes_check_goal_expr(negation(SubGoal0), GoalInfo0, negation(SubGoal),
         !ModeInfo, !IO) :-
     mode_checkpoint(enter, "not", !ModeInfo, !IO),
     mode_info_get_instmap(!.ModeInfo, InstMap0),
@@ -404,12 +412,12 @@
     mode_info_set_instmap(InstMap0, !ModeInfo),
     mode_checkpoint(exit, "not", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(scope(Reason, SubGoal0), _, scope(Reason, SubGoal),
+unique_modes_check_goal_expr(scope(Reason, SubGoal0), _, scope(Reason, SubGoal),
         !ModeInfo, !IO) :-
     mode_checkpoint(enter, "scope", !ModeInfo, !IO),
     ( Reason = from_ground_term(_) ->
         mode_info_get_in_from_ground_term(!.ModeInfo, WasInFromGroundTerm),
-        mode_info_set_in_from_ground_term(yes, !ModeInfo),
+        mode_info_set_in_from_ground_term(in_from_ground_term, !ModeInfo),
         unique_modes_check_goal(SubGoal0, SubGoal, !ModeInfo, !IO),
         mode_info_set_in_from_ground_term(WasInFromGroundTerm, !ModeInfo)
     ;
@@ -417,7 +425,7 @@
     ),
     mode_checkpoint(exit, "scope", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(generic_call(GenericCall, Args, Modes, Det),
+unique_modes_check_goal_expr(generic_call(GenericCall, Args, Modes, Det),
         _GoalInfo0, Goal, !ModeInfo, !IO) :-
     mode_checkpoint(enter, "generic_call", !ModeInfo, !IO),
     hlds_goal.generic_call_id(GenericCall, CallId),
@@ -449,7 +457,7 @@
     mode_info_unset_call_context(!ModeInfo),
     mode_checkpoint(exit, "generic_call", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO) :-
+unique_modes_check_goal_expr(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO) :-
     GoalExpr0 = plain_call(PredId, ProcId0, Args, Builtin, CallContext,
         PredName),
     PredNameString = sym_name_to_string(PredName),
@@ -464,7 +472,7 @@
     mode_info_unset_call_context(!ModeInfo),
     mode_checkpoint(exit, "call", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(unify(LHS0, RHS0, _, UnifyInfo0, UnifyContext),
+unique_modes_check_goal_expr(unify(LHS0, RHS0, _, UnifyInfo0, UnifyContext),
         GoalInfo0, Goal, !ModeInfo, !IO) :-
     mode_checkpoint(enter, "unify", !ModeInfo, !IO),
     mode_info_set_call_context(call_context_unify(UnifyContext), !ModeInfo),
@@ -473,7 +481,7 @@
     mode_info_unset_call_context(!ModeInfo),
     mode_checkpoint(exit, "unify", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(switch(Var, CanFail, Cases0), GoalInfo0,
+unique_modes_check_goal_expr(switch(Var, CanFail, Cases0), GoalInfo0,
         switch(Var, CanFail, Cases), !ModeInfo, !IO) :-
     mode_checkpoint(enter, "switch", !ModeInfo, !IO),
     (
@@ -490,7 +498,7 @@
     ),
     mode_checkpoint(exit, "switch", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO) :-
+unique_modes_check_goal_expr(GoalExpr0, GoalInfo0, Goal, !ModeInfo, !IO) :-
     GoalExpr0 = call_foreign_proc(Attributes, PredId, ProcId0, Args, ExtraArgs,
         MaybeTraceRuntimeCond, PragmaCode),
     % To modecheck a pragma_c_code, we just modecheck the proc for
@@ -507,9 +515,9 @@
     mode_info_unset_call_context(!ModeInfo),
     mode_checkpoint(exit, "foreign_proc", !ModeInfo, !IO).
 
-unique_modes_check_goal_2(shorthand(_), _, _, !ModeInfo, !IO) :-
+unique_modes_check_goal_expr(shorthand(_), _, _, !ModeInfo, !IO) :-
     % These should have been expanded out by now.
-    unexpected(this_file, "unique_modes_check_goal_2: unexpected shorthand").
+    unexpected(this_file, "unique_modes_check_goal_expr: unexpected shorthand").
 
 :- pred unique_modes_check_call(pred_id::in, proc_id::in, list(prog_var)::in,
     hlds_goal_info::in, proc_id::out, mode_info::in, mode_info::out) is det.
cvs diff: Diffing compiler/notes
cvs diff: Diffing debian
cvs diff: Diffing debian/patches
cvs diff: Diffing deep_profiler
cvs diff: Diffing deep_profiler/notes
cvs diff: Diffing doc
cvs diff: Diffing extras
cvs diff: Diffing extras/base64
cvs diff: Diffing extras/cgi
cvs diff: Diffing extras/complex_numbers
cvs diff: Diffing extras/complex_numbers/samples
cvs diff: Diffing extras/complex_numbers/tests
cvs diff: Diffing extras/concurrency
cvs diff: Diffing extras/curs
cvs diff: Diffing extras/curs/samples
cvs diff: Diffing extras/curses
cvs diff: Diffing extras/curses/sample
cvs diff: Diffing extras/dynamic_linking
cvs diff: Diffing extras/error
cvs diff: Diffing extras/fixed
cvs diff: Diffing extras/gator
cvs diff: Diffing extras/gator/generations
cvs diff: Diffing extras/gator/generations/1
cvs diff: Diffing extras/graphics
cvs diff: Diffing extras/graphics/easyx
cvs diff: Diffing extras/graphics/easyx/samples
cvs diff: Diffing extras/graphics/mercury_allegro
cvs diff: Diffing extras/graphics/mercury_allegro/examples
cvs diff: Diffing extras/graphics/mercury_allegro/samples
cvs diff: Diffing extras/graphics/mercury_allegro/samples/demo
cvs diff: Diffing extras/graphics/mercury_allegro/samples/mandel
cvs diff: Diffing extras/graphics/mercury_allegro/samples/pendulum2
cvs diff: Diffing extras/graphics/mercury_allegro/samples/speed
cvs diff: Diffing extras/graphics/mercury_glut
cvs diff: Diffing extras/graphics/mercury_opengl
cvs diff: Diffing extras/graphics/mercury_tcltk
cvs diff: Diffing extras/graphics/samples
cvs diff: Diffing extras/graphics/samples/calc
cvs diff: Diffing extras/graphics/samples/gears
cvs diff: Diffing extras/graphics/samples/maze
cvs diff: Diffing extras/graphics/samples/pent
cvs diff: Diffing extras/lazy_evaluation
cvs diff: Diffing extras/lex
cvs diff: Diffing extras/lex/samples
cvs diff: Diffing extras/lex/tests
cvs diff: Diffing extras/log4m
cvs diff: Diffing extras/logged_output
cvs diff: Diffing extras/moose
cvs diff: Diffing extras/moose/samples
cvs diff: Diffing extras/moose/tests
cvs diff: Diffing extras/mopenssl
cvs diff: Diffing extras/morphine
cvs diff: Diffing extras/morphine/non-regression-tests
cvs diff: Diffing extras/morphine/scripts
cvs diff: Diffing extras/morphine/source
cvs diff: Diffing extras/net
cvs diff: Diffing extras/odbc
cvs diff: Diffing extras/posix
cvs diff: Diffing extras/posix/samples
cvs diff: Diffing extras/quickcheck
cvs diff: Diffing extras/quickcheck/tutes
cvs diff: Diffing extras/references
cvs diff: Diffing extras/references/samples
cvs diff: Diffing extras/references/tests
cvs diff: Diffing extras/solver_types
cvs diff: Diffing extras/solver_types/library
cvs diff: Diffing extras/trailed_update
cvs diff: Diffing extras/trailed_update/samples
cvs diff: Diffing extras/trailed_update/tests
cvs diff: Diffing extras/windows_installer_generator
cvs diff: Diffing extras/windows_installer_generator/sample
cvs diff: Diffing extras/windows_installer_generator/sample/images
cvs diff: Diffing extras/xml
cvs diff: Diffing extras/xml/samples
cvs diff: Diffing extras/xml_stylesheets
cvs diff: Diffing java
cvs diff: Diffing java/runtime
cvs diff: Diffing library
cvs diff: Diffing mdbcomp
cvs diff: Diffing profiler
cvs diff: Diffing robdd
cvs diff: Diffing runtime
cvs diff: Diffing runtime/GETOPT
cvs diff: Diffing runtime/machdeps
cvs diff: Diffing samples
cvs diff: Diffing samples/c_interface
cvs diff: Diffing samples/c_interface/c_calls_mercury
cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/c_interface/mercury_calls_c
cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/c_interface/standalone_c
cvs diff: Diffing samples/diff
cvs diff: Diffing samples/muz
cvs diff: Diffing samples/rot13
cvs diff: Diffing samples/solutions
cvs diff: Diffing samples/solver_types
cvs diff: Diffing samples/tests
cvs diff: Diffing samples/tests/c_interface
cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
cvs diff: Diffing samples/tests/diff
cvs diff: Diffing samples/tests/muz
cvs diff: Diffing samples/tests/rot13
cvs diff: Diffing samples/tests/solutions
cvs diff: Diffing samples/tests/toplevel
cvs diff: Diffing scripts
cvs diff: Diffing slice
cvs diff: Diffing tests
cvs diff: Diffing tests/benchmarks
cvs diff: Diffing tests/debugger
cvs diff: Diffing tests/debugger/declarative
cvs diff: Diffing tests/dppd
cvs diff: Diffing tests/general
cvs diff: Diffing tests/general/accumulator
cvs diff: Diffing tests/general/string_format
cvs diff: Diffing tests/general/structure_reuse
cvs diff: Diffing tests/grade_subdirs
cvs diff: Diffing tests/hard_coded
cvs diff: Diffing tests/hard_coded/exceptions
cvs diff: Diffing tests/hard_coded/purity
cvs diff: Diffing tests/hard_coded/sub-modules
cvs diff: Diffing tests/hard_coded/typeclasses
cvs diff: Diffing tests/invalid
cvs diff: Diffing tests/invalid/purity
cvs diff: Diffing tests/misc_tests
cvs diff: Diffing tests/mmc_make
cvs diff: Diffing tests/mmc_make/lib
cvs diff: Diffing tests/par_conj
cvs diff: Diffing tests/recompilation
cvs diff: Diffing tests/tabling
cvs diff: Diffing tests/term
cvs diff: Diffing tests/trailing
cvs diff: Diffing tests/valid
cvs diff: Diffing tests/warnings
cvs diff: Diffing tools
cvs diff: Diffing trace
cvs diff: Diffing util
cvs diff: Diffing vim
cvs diff: Diffing vim/after
cvs diff: Diffing vim/ftplugin
cvs diff: Diffing vim/syntax
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list