[m-rev.] diff: eliminate unused const structs

Zoltan Somogyi zs at unimelb.edu.au
Sat Jun 9 14:13:27 AEST 2012


compiler/dead_proc_elim.m:
	Eliminate const structs that are not referenced in the rest of the
	HLDS.

compiler/const_struct.m:
	Provide the facilities that make that possible.

Zoltan.

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/extra
cvs diff: Diffing boehm_gc/include
cvs diff: Diffing boehm_gc/include/extra
cvs diff: Diffing boehm_gc/include/private
cvs diff: Diffing boehm_gc/libatomic_ops
cvs diff: Diffing boehm_gc/libatomic_ops/doc
cvs diff: Diffing boehm_gc/libatomic_ops/src
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/armcc
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/gcc
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/hpc
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/ibmc
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/icc
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/msftc
cvs diff: Diffing boehm_gc/libatomic_ops/src/atomic_ops/sysdeps/sunc
cvs diff: Diffing boehm_gc/libatomic_ops/tests
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/tests
cvs diff: Diffing boehm_gc/m4
cvs diff: Diffing boehm_gc/tests
cvs diff: Diffing browser
cvs diff: Diffing bytecode
cvs diff: Diffing compiler
Index: compiler/const_struct.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/const_struct.m,v
retrieving revision 1.1
diff -u -b -r1.1 const_struct.m
--- compiler/const_struct.m	8 Jun 2012 15:36:54 -0000	1.1
+++ compiler/const_struct.m	9 Jun 2012 04:00:45 -0000
@@ -26,11 +26,25 @@
 :- import_module map.
 
 :- type const_struct
-    --->    const_struct(cons_id, list(const_struct_arg), mer_type, mer_inst).
+    --->    const_struct(
+                % The constant structured term: the data constructor,
+                % and its arguments.
+                cs_cons_id      :: cons_id,
+                cs_args         :: list(const_struct_arg),
+
+                % The type and inst of the term.
+                cs_term_type    :: mer_type,
+                cs_term_int     :: mer_inst
+            ).
 
 :- type const_struct_arg
     --->    csa_const_struct(int)
+            % The argument is a reference to another constant structure.
+            % The argument gives the id of that structure.
+
     ;       csa_constant(cons_id, mer_type).
+            % The argument is an arity-zero cons_id. The second argument
+            % gives its type.
 
 :- type const_struct_db.
 
@@ -83,6 +97,11 @@
 :- pred insert_constant_instance(const_instance_id::in, int::in,
     const_struct_db::in, const_struct_db::out) is det.
 
+    % Mark the constant structure with the given number as logically deleted.
+    %
+:- pred delete_const_struct(int::in,
+    const_struct_db::in, const_struct_db::out) is det.
+
     % Get the list of constant structures to generate.
     % If the assoc list contains N elements, the keys are guaranteed to be
     % the integers 0 .. N-1 in ascending order.
@@ -132,7 +151,7 @@
         ),
         Enabled = no
     ),
-    Db = const_struct_db(Enabled, 0, map.init, map.init, [], map.init).
+    Db = const_struct_db(Enabled, 0, map.init, map.init, map.init).
 
 lookup_insert_const_struct(ConstStruct, ConstNum, !Db) :-
     const_struct_db_get_struct_map(!.Db, StructMap0),
@@ -157,11 +176,7 @@
 
             const_struct_db_get_num_map(!.Db, NumMap0),
             map.det_insert(ConstNum, ConstStruct, NumMap0, NumMap),
-            const_struct_db_set_num_map(NumMap, !Db),
-
-            const_struct_db_get_rev_structs(!.Db, RevStructs0),
-            RevStructs = [ConstNum - ConstStruct | RevStructs0],
-            const_struct_db_set_rev_structs(RevStructs, !Db)
+            const_struct_db_set_num_map(NumMap, !Db)
         )
     ).
 
@@ -169,10 +184,6 @@
     const_struct_db_get_num_map(Db, NumMap),
     map.lookup(NumMap, ConstNum, ConstStruct).
 
-const_struct_db_get_structs(Db, Structs) :-
-    const_struct_db_get_rev_structs(Db, RevStructs),
-    list.reverse(RevStructs, Structs).
-
 search_for_constant_instance(Db, InstanceId, ConstNum) :-
     const_struct_db_get_instance_map(Db, InstanceMap),
     map.search(InstanceMap, InstanceId, ConstNum).
@@ -182,6 +193,19 @@
     map.det_insert(InstanceId, ConstNum, InstanceMap0, InstanceMap),
     const_struct_db_set_instance_map(InstanceMap, !Db).
 
+delete_const_struct(ConstNum, !Db) :-
+    const_struct_db_get_num_map(!.Db, NumMap0),
+    map.det_remove(ConstNum, ConstStruct, NumMap0, NumMap),
+    const_struct_db_set_num_map(NumMap, !Db),
+
+    const_struct_db_get_struct_map(!.Db, StructMap0),
+    map.det_remove(ConstStruct, _ConstNum, StructMap0, StructMap),
+    const_struct_db_set_struct_map(StructMap, !Db).
+
+const_struct_db_get_structs(Db, Structs) :-
+    const_struct_db_get_num_map(Db, NumMap),
+    map.to_assoc_list(NumMap, Structs).
+
 %-----------------------------------------------------------------------------%
 
 :- type const_struct_db
@@ -190,7 +214,6 @@
                 csdb_next_num       :: int,
                 csdb_struct_map     :: map(const_struct, int),
                 csdb_num_map        :: map(int, const_struct),
-                csdb_rev_structs    :: assoc_list(int, const_struct),
                 csdb_instance_map   :: const_instance_map
             ).
 
@@ -199,8 +222,6 @@
     map(const_struct, int)::out) is det.
 :- pred const_struct_db_get_num_map(const_struct_db::in,
     map(int, const_struct)::out) is det.
-:- pred const_struct_db_get_rev_structs(const_struct_db::in,
-    assoc_list(int, const_struct)::out) is det.
 :- pred const_struct_db_get_instance_map(const_struct_db::in,
     const_instance_map::out) is det.
 
@@ -208,7 +229,6 @@
 const_struct_db_get_next_num(Db, Db ^ csdb_next_num).
 const_struct_db_get_struct_map(Db, Db ^ csdb_struct_map).
 const_struct_db_get_num_map(Db, Db ^ csdb_num_map).
-const_struct_db_get_rev_structs(Db, Db ^ csdb_rev_structs).
 const_struct_db_get_instance_map(Db, Db ^ csdb_instance_map).
 
 :- pred const_struct_db_set_next_num(int::in,
@@ -217,8 +237,6 @@
     const_struct_db::in, const_struct_db::out) is det.
 :- pred const_struct_db_set_num_map(map(int, const_struct)::in,
     const_struct_db::in, const_struct_db::out) is det.
-:- pred const_struct_db_set_rev_structs(assoc_list(int, const_struct)::in,
-    const_struct_db::in, const_struct_db::out) is det.
 :- pred const_struct_db_set_instance_map(const_instance_map::in,
     const_struct_db::in, const_struct_db::out) is det.
 
@@ -228,8 +246,6 @@
     !Db ^ csdb_struct_map := StructMap.
 const_struct_db_set_num_map(NumMap, !Db) :-
     !Db ^ csdb_num_map := NumMap.
-const_struct_db_set_rev_structs(RevStructs, !Db) :-
-    !Db ^ csdb_rev_structs := RevStructs.
 const_struct_db_set_instance_map(InstanceMap, !Db) :-
     !Db ^ csdb_instance_map := InstanceMap.
 
Index: compiler/dead_proc_elim.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/dead_proc_elim.m,v
retrieving revision 1.145
diff -u -b -r1.145 dead_proc_elim.m
--- compiler/dead_proc_elim.m	8 Jun 2012 15:36:54 -0000	1.145
+++ compiler/dead_proc_elim.m	9 Jun 2012 04:00:45 -0000
@@ -36,8 +36,9 @@
     --->    elim_opt_imported
     ;       do_not_elim_opt_imported.
 
-    % Eliminate dead procedures. If the first argument is `elim_opt_imported',
-    % also eliminate any opt_imported procedures.
+    % Eliminate dead procedures and/or constant structures.
+    % If the first argument is `elim_opt_imported', also eliminate
+    % any opt_imported procedures.
     %
     % The last argument will be a list of warnings about any user-defined
     % procedures that are dead, but the caller is free to ignore this list.
@@ -50,7 +51,8 @@
 :- type entity
     --->    entity_proc(pred_id, proc_id)
     ;       entity_table_struct(pred_id, proc_id)
-    ;       entity_type_ctor(module_name, string, int).
+    ;       entity_type_ctor(module_name, string, int)
+    ;       entity_const_struct(int).
 
 :- type maybe_needed
     --->    not_eliminable
@@ -104,7 +106,8 @@
 
 %-----------------------------------------------------------------------------%
 
-% We deal with two kinds of entities, procedures and type_ctor_info structures.
+% We deal with three kinds of entities, procedures, type_ctor_info structures
+% and constant structures.
 %
 % The algorithm has three main data structures:
 %
@@ -123,8 +126,9 @@
 % definition to find all mention of other entities. Their ids are then
 % put into both the needed map and the queue.
 %
-% The final pass of the algorithm deletes from the HLDS any procedure
-% or type_ctor_info structure whose id is not in the needed map.
+% The final pass of the algorithm deletes from the HLDS any procedure,
+% type_ctor_info structure or constant structure whose id is not in the
+% needed map.
 
 :- type entity_queue    ==  queue(entity).
 :- type examined_set    ==  set_tree234(entity).
@@ -168,11 +172,7 @@
 
     module_info_get_class_table(!.ModuleInfo, Classes),
     module_info_get_instance_table(!.ModuleInfo, Instances),
-    dead_proc_initialize_class_methods(Classes, Instances, !Queue, !Needed),
-
-    module_info_get_const_struct_db(!.ModuleInfo, ConstStructDb),
-    const_struct_db_get_structs(ConstStructDb, ConstStructs),
-    dead_proc_initialize_const_structs(ConstStructs, !Queue, !Needed).
+    dead_proc_initialize_class_methods(Classes, Instances, !Queue, !Needed).
 
     % Add all normally exported procedures within the listed predicates
     % to the queue and map.
@@ -313,46 +313,6 @@
     queue.put(Entity, !Queue),
     map.set(Entity, not_eliminable, !Needed).
 
-:- pred dead_proc_initialize_const_structs(assoc_list(int, const_struct)::in,
-    entity_queue::in, entity_queue::out, needed_map::in, needed_map::out)
-    is det.
-
-dead_proc_initialize_const_structs([], !Queue, !Needed).
-dead_proc_initialize_const_structs([_ - ConstStruct | ConstStructs],
-        !Queue, !Needed) :-
-    ConstStruct = const_struct(ConsId, Args, _, _),
-    ( ConsId = type_ctor_info_const(Module, TypeName, Arity) ->
-        Entity = entity_type_ctor(Module, TypeName, Arity),
-        queue.put(Entity, !Queue),
-        map.set(Entity, not_eliminable, !Needed)
-    ;
-        true
-    ),
-    dead_proc_initialize_const_struct_args(Args, !Queue, !Needed),
-    dead_proc_initialize_const_structs(ConstStructs, !Queue, !Needed).
-
-:- pred dead_proc_initialize_const_struct_args(list(const_struct_arg)::in,
-    entity_queue::in, entity_queue::out, needed_map::in, needed_map::out)
-    is det.
-
-dead_proc_initialize_const_struct_args([], !Queue, !Needed).
-dead_proc_initialize_const_struct_args([Arg | Args], !Queue, !Needed) :-
-    (
-        Arg = csa_const_struct(_)
-        % Do nothing. Any processing takes place when
-        % dead_proc_initialize_const_structs looks at the referenced structure.
-    ;
-        Arg = csa_constant(ConsId, _),
-        ( ConsId = type_ctor_info_const(Module, TypeName, Arity) ->
-            Entity = entity_type_ctor(Module, TypeName, Arity),
-            queue.put(Entity, !Queue),
-            map.set(Entity, not_eliminable, !Needed)
-        ;
-            true
-        )
-    ),
-    dead_proc_initialize_const_struct_args(Args, !Queue, !Needed).
-
 %-----------------------------------------------------------------------------%
 
 :- pred dead_proc_examine(entity_queue::in, examined_set::in,
@@ -377,6 +337,10 @@
                 Entity = entity_type_ctor(Module, Type, Arity),
                 dead_proc_examine_type_ctor_info(Module, Type, Arity,
                     ModuleInfo, !Queue, !Needed)
+            ;
+                Entity = entity_const_struct(ConstNum),
+                dead_proc_examine_const_struct(ModuleInfo, ConstNum,
+                    !Queue, !Needed)
             ),
             dead_proc_examine(!.Queue, !.Examined, ModuleInfo, !Needed)
         )
@@ -418,12 +382,6 @@
             Refs)
     ).
 
-:- pred maybe_add_ref(maybe(pred_proc_id)::in,
-    list(pred_proc_id)::in, list(pred_proc_id)::out) is det.
-
-maybe_add_ref(no, Refs, Refs).
-maybe_add_ref(yes(Ref), Refs, [Ref | Refs]).
-
 :- pred dead_proc_examine_refs(list(pred_proc_id)::in,
     entity_queue::in, entity_queue::out, needed_map::in, needed_map::out)
     is det.
@@ -438,12 +396,53 @@
 
 %-----------------------------------------------------------------------------%
 
+:- pred dead_proc_examine_const_struct(module_info::in, int::in,
+    entity_queue::in, entity_queue::out, needed_map::in, needed_map::out)
+    is det.
+
+dead_proc_examine_const_struct(ModuleInfo, ConstNum, !Queue, !Needed) :-
+    module_info_get_const_struct_db(ModuleInfo, ConstStructDb),
+    lookup_const_struct_num(ConstStructDb, ConstNum, ConstStruct),
+    ConstStruct = const_struct(ConsId, Args, _, _),
+    ( ConsId = type_ctor_info_const(Module, TypeName, Arity) ->
+        Entity = entity_type_ctor(Module, TypeName, Arity),
+        queue.put(Entity, !Queue),
+        map.set(Entity, not_eliminable, !Needed)
+    ;
+        true
+    ),
+    dead_proc_examine_const_struct_args(Args, !Queue, !Needed).
+
+:- pred dead_proc_examine_const_struct_args(list(const_struct_arg)::in,
+    entity_queue::in, entity_queue::out, needed_map::in, needed_map::out)
+    is det.
+
+dead_proc_examine_const_struct_args([], !Queue, !Needed).
+dead_proc_examine_const_struct_args([Arg | Args], !Queue, !Needed) :-
+    (
+        Arg = csa_const_struct(ConstNum),
+        Entity = entity_const_struct(ConstNum),
+        queue.put(Entity, !Queue),
+        map.set(Entity, not_eliminable, !Needed)
+    ;
+        Arg = csa_constant(ConsId, _),
+        ( ConsId = type_ctor_info_const(Module, TypeName, Arity) ->
+            Entity = entity_type_ctor(Module, TypeName, Arity),
+            queue.put(Entity, !Queue),
+            map.set(Entity, not_eliminable, !Needed)
+        ;
+            true
+        )
+    ),
+    dead_proc_examine_const_struct_args(Args, !Queue, !Needed).
+
+%-----------------------------------------------------------------------------%
+
 :- pred dead_proc_examine_proc(pred_proc_id::in, module_info::in,
     entity_queue::in, entity_queue::out, needed_map::in, needed_map::out)
     is det.
 
-dead_proc_examine_proc(proc(PredId, ProcId), ModuleInfo,
-        !Queue, !Needed) :-
+dead_proc_examine_proc(proc(PredId, ProcId), ModuleInfo, !Queue, !Needed) :-
     (
         module_info_get_preds(ModuleInfo, PredTable),
         map.lookup(PredTable, PredId, PredInfo),
@@ -557,7 +556,7 @@
                 io.write_int(proc_id_to_int(ProcId), !IO),
                 io.nl(!IO)
             ),
-            % If it's reachable and recursive, then we can't eliminate it
+            % If it is reachable and recursive, then we cannot eliminate it
             % or inline it.
             NewNotation = not_eliminable,
             map.set(Entity, NewNotation, !Needed)
@@ -593,7 +592,7 @@
                 io.nl(!IO)
             ),
             NewNotation = maybe_eliminable(1),
-            map.set(Entity, NewNotation, !Needed)
+            map.det_insert(Entity, NewNotation, !Needed)
         )
     ;
         GoalExpr = call_foreign_proc(_, PredId, ProcId, _, _, _, _),
@@ -643,6 +642,13 @@
                 queue.put(Entity, !Queue),
                 map.set(Entity, not_eliminable, !Needed)
             ;
+                ( ConsId = type_info_const(ConstNum)
+                ; ConsId = typeclass_info_const(ConstNum)
+                ),
+                Entity = entity_const_struct(ConstNum),
+                queue.put(Entity, !Queue),
+                map.set(Entity, not_eliminable, !Needed)
+            ;
                 ( ConsId = cons(_, _, _)
                 ; ConsId = tuple_cons(_)
                 ; ConsId = int_const(_)
@@ -653,8 +659,6 @@
                 ; ConsId = base_typeclass_info_const(_, _, _, _)
                 ; ConsId = type_info_cell_constructor(_)
                 ; ConsId = typeclass_info_cell_constructor
-                ; ConsId = type_info_const(_)
-                ; ConsId = typeclass_info_const(_)
                 ; ConsId = deep_profiling_proc_layout(_)
                 ; ConsId = table_io_decl(_)
                 )
@@ -665,7 +669,8 @@
             ; Unification = assign(_, _)
             ; Unification = simple_test(_, _)
             )
-            % Do nothing.
+            % Do nothing. These kinds of unifications cannot include
+            % the kinds of cons_ids that we are looking for.
         ;
             Unification = complicated_unify(_, _, _),
             % These should have been replaced with calls by now.
@@ -692,7 +697,7 @@
                 % in this table may be eliminated.
                 proc_elim_pred_table    :: pred_table,
 
-                % Has anything changed.
+                % Has anything changed that could affect dependency_info.
                 proc_elim_changed       :: bool,
 
                 % A list of warning messages.
@@ -708,7 +713,6 @@
 dead_proc_eliminate(ElimOptImported, !.Needed, !ModuleInfo, Specs) :-
     module_info_get_valid_predids(PredIds, !ModuleInfo),
     module_info_get_preds(!.ModuleInfo, PredTable0),
-
     Changed0 = no,
     ProcElimInfo0 = proc_elim_info(!.Needed, !.ModuleInfo, PredTable0,
         Changed0, []),
@@ -716,8 +720,8 @@
         ProcElimInfo0, ProcElimInfo),
     ProcElimInfo = proc_elim_info(!:Needed, !:ModuleInfo, PredTable,
         Changed, Specs),
-
     module_info_set_preds(PredTable, !ModuleInfo),
+
     module_info_get_type_ctor_gen_infos(!.ModuleInfo, TypeCtorGenInfos0),
     dead_proc_eliminate_type_ctor_infos(TypeCtorGenInfos0, !.Needed,
         TypeCtorGenInfos),
@@ -728,6 +732,12 @@
     % only in C code embedded in compiler-generated foreign_procs, and
     % therefore we might accidentally create dangling references.
 
+    module_info_get_const_struct_db(!.ModuleInfo, ConstStructDb0),
+    const_struct_db_get_structs(ConstStructDb0, ConstNumStructs0),
+    dead_proc_eliminate_const_structs(ConstNumStructs0, !.Needed,
+        ConstStructDb0, ConstStructDb),
+    module_info_set_const_struct_db(ConstStructDb, !ModuleInfo),
+
     (
         Changed = yes,
         % The dependency graph will still contain references to the eliminated
@@ -919,6 +929,21 @@
         TypeCtorGenInfos = TypeCtorGenInfos1
     ).
 
+:- pred dead_proc_eliminate_const_structs(assoc_list(int, const_struct)::in,
+    needed_map::in, const_struct_db::in, const_struct_db::out) is det.
+
+dead_proc_eliminate_const_structs([], _Needed, !ConstStructDb).
+dead_proc_eliminate_const_structs([ConstNum - _ | ConstNumStructs], Needed,
+        !ConstStructDb) :-
+    Entity = entity_const_struct(ConstNum),
+    ( map.search(Needed, Entity, _) ->
+        true
+    ;
+        delete_const_struct(ConstNum, !ConstStructDb)
+    ),
+    dead_proc_eliminate_const_structs(ConstNumStructs, Needed,
+        !ConstStructDb).
+
 %-----------------------------------------------------------------------------%
 %-----------------------------------------------------------------------------%
 
@@ -1004,11 +1029,12 @@
     queue(pred_id)::out, set_tree234(pred_id)::in, set_tree234(pred_id)::out)
     is det.
 
-dead_pred_elim_add_entity(entity_type_ctor(_, _, _), !Queue, !Preds).
-dead_pred_elim_add_entity(entity_table_struct(_, _), !Queue, !Preds).
 dead_pred_elim_add_entity(entity_proc(PredId, _), !Queue, !Preds) :-
     queue.put(PredId, !Queue),
     set_tree234.insert(PredId, !Preds).
+dead_pred_elim_add_entity(entity_table_struct(_, _), !Queue, !Preds).
+dead_pred_elim_add_entity(entity_type_ctor(_, _, _), !Queue, !Preds).
+dead_pred_elim_add_entity(entity_const_struct(_), !Queue, !Preds).
 
 :- pred dead_pred_elim_initialize(pred_id::in,
     pred_elim_info::in, pred_elim_info::out) is det.
cvs diff: Diffing compiler/notes
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/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_cairo
cvs diff: Diffing extras/graphics/mercury_cairo/samples
cvs diff: Diffing extras/graphics/mercury_cairo/samples/data
cvs diff: Diffing extras/graphics/mercury_cairo/tutorial
cvs diff: Diffing extras/graphics/mercury_glfw
cvs diff: Diffing extras/graphics/mercury_glfw/samples
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/monte
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 m4
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/appengine
cvs diff: Diffing samples/appengine/war
cvs diff: Diffing samples/appengine/war/WEB-INF
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/concurrency
cvs diff: Diffing samples/concurrency/dining_philosophers
cvs diff: Diffing samples/concurrency/midimon
cvs diff: Diffing samples/diff
cvs diff: Diffing samples/java_interface
cvs diff: Diffing samples/java_interface/java_calls_mercury
cvs diff: Diffing samples/java_interface/mercury_calls_java
cvs diff: Diffing samples/lazy_list
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 ssdb
cvs diff: Diffing tests
cvs diff: Diffing tests/analysis
cvs diff: Diffing tests/analysis/ctgc
cvs diff: Diffing tests/analysis/excp
cvs diff: Diffing tests/analysis/ext
cvs diff: Diffing tests/analysis/sharing
cvs diff: Diffing tests/analysis/table
cvs diff: Diffing tests/analysis/trail
cvs diff: Diffing tests/analysis/unused_args
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/feedback
cvs diff: Diffing tests/feedback/mandelbrot
cvs diff: Diffing tests/feedback/mmc
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/stm
cvs diff: Diffing tests/stm/orig
cvs diff: Diffing tests/stm/orig/stm-compiler
cvs diff: Diffing tests/stm/orig/stm-compiler/test1
cvs diff: Diffing tests/stm/orig/stm-compiler/test10
cvs diff: Diffing tests/stm/orig/stm-compiler/test2
cvs diff: Diffing tests/stm/orig/stm-compiler/test3
cvs diff: Diffing tests/stm/orig/stm-compiler/test4
cvs diff: Diffing tests/stm/orig/stm-compiler/test5
cvs diff: Diffing tests/stm/orig/stm-compiler/test6
cvs diff: Diffing tests/stm/orig/stm-compiler/test7
cvs diff: Diffing tests/stm/orig/stm-compiler/test8
cvs diff: Diffing tests/stm/orig/stm-compiler/test9
cvs diff: Diffing tests/stm/orig/stm-compiler-par
cvs diff: Diffing tests/stm/orig/stm-compiler-par/bm1
cvs diff: Diffing tests/stm/orig/stm-compiler-par/bm2
cvs diff: Diffing tests/stm/orig/stm-compiler-par/stmqueue
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test1
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test10
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test11
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test2
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test3
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test4
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test5
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test6
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test7
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test8
cvs diff: Diffing tests/stm/orig/stm-compiler-par/test9
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test1
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test2
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test3
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test4
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test5
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test6
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test7
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test8
cvs diff: Diffing tests/stm/orig/stm-compiler-par-asm_fast/test9
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