[m-rev.] for post-commit review: cons_table redesign
Zoltan Somogyi
zs at csse.unimelb.edu.au
Fri Sep 2 12:38:54 AEST 2011
Improve the representation of the constructor table.
This diff speeds up tools/speedtest by about 1.5%.
compiler/hlds_data.m:
Change the representation of the inner constructor table, the one
that contains the definitions of all the hlds_cons_defns for
constructors with a given name. This used to be a map from cons_ids
to lists of hlds_cons_defns, since an unqualified cons_id could match
more than one cons_defn. However, this required each hlds_cons_defn
to be stored several times, and in several situations we then had
to process the duplicates.
The new representation uses a list in which each hlds_cons_defn
is present just once. (Since each list contains only the definitions
of cons_ids with the same name, these lists should be very short.)
Each hlds_cons_defn is associated both with the fully qualified
cons_id, and all the other cons_ids that can refer to it. Those others
may be partially qualified, or they may contain a dummy type_ctor.
Do searches first by the fully qualified cons_id, and search using
the others only if the search on the fully qualified cons_ids fails.
This should not happen after post-typecheck.
compiler/add_type.m:
If a hlds_cons_defn has the same name and arity as another
hlds_cons_defn for the same type, do not add it to the cons_table
under ANY cons_id. The fact that we used to do this was strange,
since this could affect the future behavior only of compiler passes
that (due to the duplicate-cons-id error) we would never get to.
Specify the type-correct version of the cons_id as the main cons_id
when inserting a hlds_cons_defn into the cons_table.
compiler/type_util.m:
Minor speedups.
compiler/prog_type.m:
Document *why* the changes to type_util should be minor speedups.
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/add_type.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/add_type.m,v
retrieving revision 1.45
diff -u -b -r1.45 add_type.m
--- compiler/add_type.m 22 Aug 2011 04:23:13 -0000 1.45
+++ compiler/add_type.m 1 Sep 2011 06:30:47 -0000
@@ -691,10 +691,7 @@
ConsDefn = hlds_cons_defn(TypeCtor, TVarSet, TypeParams, KindMap,
ExistQVars, Constraints, Args, Context),
-
- some [!OtherConsIds] (
- MainConsId = QualifiedConsIdB,
- !:OtherConsIds = [],
+ get_partial_qualifiers(TypeCtorModuleName, PQInfo, PartialQuals),
% Check that there is at most one definition of a given cons_id
% in each type.
@@ -714,11 +711,14 @@
Spec = error_spec(severity_error, phase_parse_tree_to_hlds, [Msg]),
!:Specs = [Spec | !.Specs]
;
- !:OtherConsIds = [QualifiedConsIdA | !.OtherConsIds]
- ),
+ some [!OtherConsIds] (
+ % Schedule the addition of the fully-qualified cons_id
+ % into the cons_table.
+ MainConsId = QualifiedConsIdA,
+ !:OtherConsIds = [QualifiedConsIdB],
- % Add the unqualified version of the cons_id to the cons_table,
- % if appropriate.
+ % Schedule the addition of the unqualified version of the cons_id
+ % to the cons_table, if appropriate.
(
NeedQual = may_be_unqualified,
!:OtherConsIds =
@@ -727,17 +727,16 @@
NeedQual = must_be_qualified
),
- % Add partially qualified versions of the cons_id.
- get_partial_qualifiers(TypeCtorModuleName, PQInfo, PartialQuals),
+ % Schedule the partially qualified versions of the cons_id.
list.foldl(add_ctor_to_list(TypeCtor, BaseName, Arity),
PartialQuals, !OtherConsIds),
+ % Do the scheduled additions.
insert_into_cons_table(MainConsId, !.OtherConsIds, ConsDefn,
!Ctors)
+ )
),
- % Insert the fully-qualified version of this cons_id into the cons_table.
-
FieldNames = list.map(func(C) = C ^ arg_field_name, Args),
FirstField = 1,
add_ctor_field_names(FieldNames, NeedQual, PartialQuals, TypeCtor,
Index: compiler/hlds_data.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/hlds_data.m,v
retrieving revision 1.140
diff -u -b -r1.140 hlds_data.m
--- compiler/hlds_data.m 22 Aug 2011 04:23:13 -0000 1.140
+++ compiler/hlds_data.m 1 Sep 2011 09:05:52 -0000
@@ -103,7 +103,7 @@
cons_id::in, hlds_cons_defn::out) is det.
:- pred get_all_cons_defns(cons_table::in,
- assoc_list(cons_id, list(hlds_cons_defn))::out) is det.
+ assoc_list(cons_id, hlds_cons_defn)::out) is det.
:- pred return_other_arities(cons_table::in, sym_name::in, int::in,
list(int)::out) is det.
@@ -116,87 +116,133 @@
:- implementation.
+ % Maps the raw, unqualified name of a functor to information about
+ % all the functors with that name.
:- type cons_table == map(string, inner_cons_table).
-:- type inner_cons_table == map(cons_id, list(hlds_cons_defn)).
+
+ % Every visible constructor will have exactly one entry in the list,
+ % and this entry lists all the cons_ids by which that constructor
+ % may be known. The cons_ids listed for a given constructor may give
+ % fully, partially or not-at-all qualified versions of the symbol name,
+ % they must agree on the arity, and may give the actual type_ctor
+ % or the standard dummy type_ctor. The main cons_id must give the
+ % fully qualified symname and the right type_ctor.
+ %
+ % The order of the list is not meaningful.
+:- type inner_cons_table == list(inner_cons_entry).
+:- type inner_cons_entry
+ ---> inner_cons_entry(
+ ice_fully_qual_cons_id :: cons_id,
+ ice_other_cons_ids :: list(cons_id),
+ ice_cons_defn :: hlds_cons_defn
+ ).
init_cons_table = map.init.
insert_into_cons_table(MainConsId, OtherConsIds, ConsDefn, !ConsTable) :-
( MainConsId = cons(MainSymName, _, _) ->
MainName = unqualify_name(MainSymName),
- ( map.search(!.ConsTable, MainName, InnerConsTable0) ->
- insert_into_inner_cons_table(MainName, [MainConsId | OtherConsIds],
- ConsDefn, InnerConsTable0, InnerConsTable),
- map.det_update(MainName, InnerConsTable, !ConsTable)
- ;
- insert_into_inner_cons_table(MainName, [MainConsId | OtherConsIds],
- ConsDefn, map.init, InnerConsTable),
- map.det_insert(MainName, InnerConsTable, !ConsTable)
+ Entry = inner_cons_entry(MainConsId, OtherConsIds, ConsDefn),
+ ( map.search(!.ConsTable, MainName, InnerConsEntries0) ->
+ InnerConsEntries = [Entry | InnerConsEntries0],
+ map.det_update(MainName, InnerConsEntries, !ConsTable)
+ ;
+ InnerConsEntries = [Entry],
+ map.det_insert(MainName, InnerConsEntries, !ConsTable)
)
;
unexpected($module, $pred, "MainConsId is not cons")
).
-:- pred insert_into_inner_cons_table(string::in, list(cons_id)::in,
- hlds_cons_defn::in, inner_cons_table::in, inner_cons_table::out) is det.
-
-insert_into_inner_cons_table(_MainName, [], _ConsDefn, !InnerConsTable).
-insert_into_inner_cons_table(MainName, [ConsId | ConsIds], ConsDefn,
- !InnerConsTable) :-
- ( ConsId = cons(SymName, _, _) ->
- Name = unqualify_name(SymName),
- ( Name = MainName ->
- multi_map.set(ConsId, ConsDefn, !InnerConsTable)
- ;
- unexpected($module, $pred, "SymName mismatch")
- )
- ;
- unexpected($module, $pred, "ConsId is not cons")
- ),
- insert_into_inner_cons_table(MainName, ConsIds, ConsDefn, !InnerConsTable).
-
search_cons_table(ConsTable, ConsId, ConsDefns) :-
ConsId = cons(SymName, _, _),
Name = unqualify_name(SymName),
map.search(ConsTable, Name, InnerConsTable),
- map.search(InnerConsTable, ConsId, ConsDefns).
+
+ % After post-typecheck, all calls should specify the main cons_id
+ % of the searched-for (single) constructor definition. Searching
+ % the main cons_ids is sufficient for such calls, and since there are
+ % many fewer main cons_ids than other cons_ids, it is fast as well.
+ %
+ % I (zs) don't think replacing a list with a different structure would
+ % help, since these lists should be very short.
+
+ ( search_inner_main_cons_ids(InnerConsTable, ConsId, MainConsDefn) ->
+ ConsDefns = [MainConsDefn]
+ ;
+ % Before and during typecheck, we may need to look up constructors
+ % using cons_ids that may not be even partially module qualified,
+ % and which will contain a dummy type_ctor. That is why we search
+ % the other cons_ids as well.
+ %
+ % After post-typecheck, we should get here only if there is a bug
+ % in the compiler, since
+ %
+ % - at that time, all cons_ids should be module-qualified and should
+ % have non-dummy type-ctors,
+ %
+ % - this means that searches that find what they are looking for
+ % will take the then-branch above, and
+ %
+ % - there should be no searches that fail, because mention of
+ % an unknown cons_id in the program is a type error, which means
+ % the compiler should never get to the passes following
+ % post-typecheck.
+
+ search_inner_other_cons_ids(InnerConsTable, ConsId, ConsDefns),
+ % Do not return empty lists; let the call fail in that case.
+ ConsDefns = [_ | _]
+ ).
+
+:- pred search_inner_main_cons_ids(list(inner_cons_entry)::in, cons_id::in,
+ hlds_cons_defn::out) is semidet.
+
+search_inner_main_cons_ids([Entry | Entries], ConsId, ConsDefn) :-
+ ( ConsId = Entry ^ ice_fully_qual_cons_id ->
+ ConsDefn = Entry ^ ice_cons_defn
+ ;
+ search_inner_main_cons_ids(Entries, ConsId, ConsDefn)
+ ).
+
+:- pred search_inner_other_cons_ids(list(inner_cons_entry)::in, cons_id::in,
+ list(hlds_cons_defn)::out) is det.
+
+search_inner_other_cons_ids([], _ConsId, []).
+search_inner_other_cons_ids([Entry | Entries], ConsId, !:ConsDefns) :-
+ search_inner_other_cons_ids(Entries, ConsId, !:ConsDefns),
+ ( list.member(ConsId, Entry ^ ice_other_cons_ids) ->
+ !:ConsDefns = [Entry ^ ice_cons_defn | !.ConsDefns]
+ ;
+ true
+ ).
search_cons_table_of_type_ctor(ConsTable, TypeCtor, ConsId, ConsDefn) :-
ConsId = cons(SymName, _, _),
Name = unqualify_name(SymName),
map.search(ConsTable, Name, InnerConsTable),
- map.search(InnerConsTable, ConsId, AllConsDefns),
- search_cons_defns_for_type_ctor(TypeCtor, AllConsDefns, ConsDefn).
+ search_inner_cons_ids_type_ctor(InnerConsTable, TypeCtor, ConsId,
+ ConsDefn).
-:- pred search_cons_defns_for_type_ctor(type_ctor::in,
- list(hlds_cons_defn)::in, hlds_cons_defn::out) is semidet.
+:- pred search_inner_cons_ids_type_ctor(list(inner_cons_entry)::in,
+ type_ctor::in, cons_id::in, hlds_cons_defn::out) is semidet.
-search_cons_defns_for_type_ctor(TypeCtor, [HeadConsDefn | TailConsDefns],
+search_inner_cons_ids_type_ctor([Entry | Entries], TypeCtor, ConsId,
ConsDefn) :-
- ( HeadConsDefn ^ cons_type_ctor = TypeCtor ->
- verify_cons_defns_for_type_ctor(TypeCtor, HeadConsDefn, TailConsDefns,
- ConsDefn)
- ;
- search_cons_defns_for_type_ctor(TypeCtor, TailConsDefns, ConsDefn)
- ).
-
-:- pred verify_cons_defns_for_type_ctor(type_ctor::in, hlds_cons_defn::in,
- list(hlds_cons_defn)::in, hlds_cons_defn::out) is semidet.
-
-verify_cons_defns_for_type_ctor(_TypeCtor, FirstConsDefn, [], FirstConsDefn).
-verify_cons_defns_for_type_ctor(TypeCtor, FirstConsDefn,
- [HeadConsDefn | TailConsDefns], ConsDefn) :-
- ( HeadConsDefn ^ cons_type_ctor = TypeCtor ->
- ( HeadConsDefn = FirstConsDefn ->
- verify_cons_defns_for_type_ctor(TypeCtor, FirstConsDefn,
- TailConsDefns, ConsDefn)
- ;
- unexpected($module, $pred,
- "different cons_defns for same cons_id in same type")
+ EntryConsDefn = Entry ^ ice_cons_defn,
+ (
+ % If a type has two functors with the same name but different arities,
+ % then it is possible for the TypeCtor test to succeed and the ConsId
+ % tests to fail (due to the arity mismatch). In such cases, we need
+ % to search the rest of the list.
+
+ EntryConsDefn ^ cons_type_ctor = TypeCtor,
+ ( ConsId = Entry ^ ice_fully_qual_cons_id
+ ; list.member(ConsId, Entry ^ ice_other_cons_ids)
)
+ ->
+ ConsDefn = EntryConsDefn
;
- verify_cons_defns_for_type_ctor(TypeCtor, FirstConsDefn,
- TailConsDefns, ConsDefn)
+ search_inner_cons_ids_type_ctor(Entries, TypeCtor, ConsId, ConsDefn)
).
lookup_cons_table_of_type_ctor(ConsTable, TypeCtor, ConsId, ConsDefn) :-
@@ -213,25 +259,62 @@
map.foldl(accumulate_all_inner_cons_defns, ConsTable, [], AllConsDefns).
:- pred accumulate_all_inner_cons_defns(string::in, inner_cons_table::in,
- assoc_list(cons_id, list(hlds_cons_defn))::in,
- assoc_list(cons_id, list(hlds_cons_defn))::out) is det.
+ assoc_list(cons_id, hlds_cons_defn)::in,
+ assoc_list(cons_id, hlds_cons_defn)::out) is det.
accumulate_all_inner_cons_defns(_Name, InnerConsTable, !AllConsDefns) :-
- map.to_assoc_list(InnerConsTable, InnerConsList),
+ list.map(project_inner_cons_entry, InnerConsTable, InnerConsList),
!:AllConsDefns = InnerConsList ++ !.AllConsDefns.
+:- pred project_inner_cons_entry(inner_cons_entry::in,
+ pair(cons_id, hlds_cons_defn)::out) is det.
+
+project_inner_cons_entry(Entry, Pair) :-
+ Entry = inner_cons_entry(MainConsId, _OtherConsIds, ConsDefn),
+ Pair = MainConsId - ConsDefn.
+
return_other_arities(ConsTable, SymName, Arity, OtherArities) :-
Name = unqualify_name(SymName),
( map.search(ConsTable, Name, InnerConsTable) ->
- solutions.solutions(
- (pred(N::out) is nondet :-
- map.member(InnerConsTable, cons(SymName, N, _), _),
- N \= Arity
- ), OtherArities)
+ return_other_arities_inner(InnerConsTable, SymName, Arity,
+ [], OtherArities0),
+ list.sort_and_remove_dups(OtherArities0, OtherArities)
;
OtherArities = []
).
+:- pred return_other_arities_inner(list(inner_cons_entry)::in,
+ sym_name::in, int::in, list(int)::in, list(int)::out) is det.
+
+return_other_arities_inner([], _, _, !OtherArities).
+return_other_arities_inner([Entry | Entries], SymName, Arity, !OtherArities) :-
+ MainConsId = Entry ^ ice_fully_qual_cons_id,
+ OtherConsIds = Entry ^ ice_other_cons_ids,
+ return_other_arities_inner_cons_ids([MainConsId | OtherConsIds],
+ SymName, Arity, !OtherArities),
+ return_other_arities_inner(Entries, SymName, Arity, !OtherArities).
+
+:- pred return_other_arities_inner_cons_ids(list(cons_id)::in,
+ sym_name::in, int::in, list(int)::in, list(int)::out) is det.
+
+return_other_arities_inner_cons_ids([], _, _, !OtherArities).
+return_other_arities_inner_cons_ids([ConsId | ConsIds], SymName, Arity,
+ !OtherArities) :-
+ ( ConsId = cons(ThisSymName, ThisArity, _) ->
+ (
+ ThisSymName = SymName,
+ ThisArity \= Arity
+ ->
+ !:OtherArities = [ThisArity | !.OtherArities]
+ ;
+ true
+ )
+ ;
+ unexpected($module, $pred, "ConsId is not cons")
+ ),
+ return_other_arities_inner_cons_ids(ConsIds, SymName, Arity,
+ !OtherArities).
+
replace_cons_defns_in_cons_table(Replace, !ConsTable) :-
map.map_values_only(replace_cons_defns_in_inner_cons_table(Replace),
!ConsTable).
@@ -241,15 +324,17 @@
inner_cons_table::in, inner_cons_table::out) is det.
replace_cons_defns_in_inner_cons_table(Replace, !InnerConsTable) :-
- map.map_values_only(replace_cons_defns_in_cons_defns(Replace),
+ list.map(replace_cons_defns_in_inner_cons_entry(Replace),
!InnerConsTable).
-:- pred replace_cons_defns_in_cons_defns(
+:- pred replace_cons_defns_in_inner_cons_entry(
pred(hlds_cons_defn, hlds_cons_defn)::in(pred(in, out) is det),
- list(hlds_cons_defn)::in, list(hlds_cons_defn)::out) is det.
+ inner_cons_entry::in, inner_cons_entry::out) is det.
-replace_cons_defns_in_cons_defns(Replace, !ConsDefns) :-
- list.map(Replace, !ConsDefns).
+replace_cons_defns_in_inner_cons_entry(Replace, !Entry) :-
+ ConsDefn0 = !.Entry ^ ice_cons_defn,
+ Replace(ConsDefn0, ConsDefn),
+ !Entry ^ ice_cons_defn := ConsDefn.
cons_table_optimize(!ConsTable) :-
map.optimize(!ConsTable).
Index: compiler/prog_type.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/prog_type.m,v
retrieving revision 1.56
diff -u -b -r1.56 prog_type.m
--- compiler/prog_type.m 21 Jul 2011 06:58:26 -0000 1.56
+++ compiler/prog_type.m 1 Sep 2011 09:28:54 -0000
@@ -540,9 +540,11 @@
).
type_to_ctor(Type, TypeCtor) :-
+ % This should be subject to unused argument elimination.
type_to_ctor_and_args(Type, TypeCtor, _Args).
type_to_ctor_det(Type, TypeCtor) :-
+ % This should be subject to unused argument elimination.
type_to_ctor_and_args_det(Type, TypeCtor, _Args).
type_ctor_is_higher_order(TypeCtor, Purity, PredOrFunc, EvalMethod) :-
Index: compiler/type_util.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/type_util.m,v
retrieving revision 1.211
diff -u -b -r1.211 type_util.m
--- compiler/type_util.m 31 Aug 2011 07:59:35 -0000 1.211
+++ compiler/type_util.m 1 Sep 2011 09:20:09 -0000
@@ -930,7 +930,7 @@
%-----------------------------------------------------------------------------%
switch_type_num_functors(ModuleInfo, Type, NumFunctors) :-
- type_to_ctor_and_args(Type, TypeCtor, _),
+ type_to_ctor(Type, TypeCtor),
( TypeCtor = type_ctor(unqualified("character"), 0) ->
% XXX The following code uses the source machine's character size,
% not the target's, so it won't work if cross-compiling to a machine
@@ -1051,13 +1051,13 @@
ExistQVars, Constraints, Args, _Context),
ArgTypes = list.map(func(C) = C ^ arg_type, Args),
prog_type.var_list_to_type_list(KindMap, TypeParams, TypeCtorArgs),
- type_to_ctor_and_args(VarType, TypeCtor, _),
+ type_to_ctor(VarType, TypeCtor),
construct_type(TypeCtor, TypeCtorArgs, RetType),
CtorDefn = ctor_defn(TypeVarSet, ExistQVars, KindMap, Constraints,
ArgTypes, RetType).
is_existq_cons(ModuleInfo, VarType, ConsId, ConsDefn) :-
- type_to_ctor_and_args(VarType, TypeCtor, _),
+ type_to_ctor(VarType, TypeCtor),
get_cons_defn(ModuleInfo, TypeCtor, ConsId, ConsDefn),
ConsDefn ^ cons_exist_tvars = [_ | _].
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_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 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/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