[m-rev.] for review: generalize the specialization of compare/3 predicates

Zoltan Somogyi zs at cs.mu.OZ.AU
Mon Jan 21 18:12:07 AEDT 2002


For anyone to review.

We have two ways to generate comparison predicates for du types. Suppose the
type has n function symbols. The quadratic method has n^2 clauses, one for each
combination of the bindings of the two arguments. The linear method creates an
index predicate for the type, calls it on each argument, and returns
immediately if the index values indicate a difference. If the index values
say the two arguments are bound to the same function symbol, the linear method
then has n cases, each comparing the arguments of a function symbol.

The quadratic method can be expected to be faster since it avoids function
calls and does fewer tests on the function symbol bound to each argument.
For small values of n, it can also be smaller, mainly due to the absence
of the index predicate. This change allows the user to select the use of
the quadratic method for all types whose value of n is up to a given limit,
whereas before there was a hardcoded limit on the limit, requiring n <= 3.

My benchmark results so far show that we should be using the quadratic method
for all n <= 9, but I do not have benchmark results yet for n >= 10. When I do,
I will modify the default value of --compare-specialization, the option
that gives the limit up to which we use the quadratic method.

compiler/unify_proc.m:
	Generalize the code that generates comparison procedures that
	explicitly compare each function symbol with every other, to
	handle types with any number of function symbols. Rename some
	predicates to make clearer the distinction between these predicates,
	which generate comparison predicates whose size is quadratic in the
	the number of function symbols in the type, from the predicates
	which generate comparison predicates whose size is linear in the
	the number of function symbols in the type.

compiler/handle_options.m:
	Delete the code that limited the exploited value of the
	--compare-specialization option, since the change to unify_proc.m
	has removed the cause of the limitation.

The benchmark results show mostly timing noise until --compare-specialization
reaches 9; it seems a frequently compared type has that arity. I don't know
which type that is.

EXTRA_MCFLAGS = -O2 --compare-specialization 0
GRADE = asm_fast.gc
mercury_compile.01 average of 8 with ignore=0     17.72
mercury_compile.01 average of 8 with ignore=1     17.58
mercury_compile.01 average of 8 with ignore=2     17.57
EXTRA_MCFLAGS = -O2 --compare-specialization 1
GRADE = asm_fast.gc
mercury_compile.02 average of 8 with ignore=0     17.82
mercury_compile.02 average of 8 with ignore=1     17.62
mercury_compile.02 average of 8 with ignore=2     17.62
EXTRA_MCFLAGS = -O2 --compare-specialization 2
GRADE = asm_fast.gc
mercury_compile.03 average of 8 with ignore=0     17.67
mercury_compile.03 average of 8 with ignore=1     17.43
mercury_compile.03 average of 8 with ignore=2     17.43
EXTRA_MCFLAGS = -O2 --compare-specialization 3
GRADE = asm_fast.gc
mercury_compile.04 average of 8 with ignore=0     17.70
mercury_compile.04 average of 8 with ignore=1     17.48
mercury_compile.04 average of 8 with ignore=2     17.48
EXTRA_MCFLAGS = -O2 --compare-specialization 4
GRADE = asm_fast.gc
mercury_compile.05 average of 8 with ignore=0     17.80
mercury_compile.05 average of 8 with ignore=1     17.59
mercury_compile.05 average of 8 with ignore=2     17.59
EXTRA_MCFLAGS = -O2 --compare-specialization 5
GRADE = asm_fast.gc
mercury_compile.06 average of 8 with ignore=0     17.72
mercury_compile.06 average of 8 with ignore=1     17.50
mercury_compile.06 average of 8 with ignore=2     17.50
EXTRA_MCFLAGS = -O2 --compare-specialization 6
GRADE = asm_fast.gc
mercury_compile.07 average of 8 with ignore=0     17.76
mercury_compile.07 average of 8 with ignore=1     17.52
mercury_compile.07 average of 8 with ignore=2     17.51
EXTRA_MCFLAGS = -O2 --compare-specialization 7
GRADE = asm_fast.gc
mercury_compile.08 average of 8 with ignore=0     17.80
mercury_compile.08 average of 8 with ignore=1     17.58
mercury_compile.08 average of 8 with ignore=2     17.58
EXTRA_MCFLAGS = -O2 --compare-specialization 8
GRADE = asm_fast.gc
mercury_compile.09 average of 8 with ignore=0     17.79
mercury_compile.09 average of 8 with ignore=1     17.58
mercury_compile.09 average of 8 with ignore=2     17.58
EXTRA_MCFLAGS = -O2 --compare-specialization 9
GRADE = asm_fast.gc
mercury_compile.10 average of 8 with ignore=0     17.53
mercury_compile.10 average of 8 with ignore=1     17.30
mercury_compile.10 average of 8 with ignore=2     17.30
EXTRA_MCFLAGS = -O2 --compare-specialization 0
GRADE = hlc.gc
mercury_compile.11 average of 8 with ignore=0     21.43
mercury_compile.11 average of 8 with ignore=1     21.25
mercury_compile.11 average of 8 with ignore=2     21.25
EXTRA_MCFLAGS = -O2 --compare-specialization 1
GRADE = hlc.gc
mercury_compile.12 average of 8 with ignore=0     21.45
mercury_compile.12 average of 8 with ignore=1     21.28
mercury_compile.12 average of 8 with ignore=2     21.28
EXTRA_MCFLAGS = -O2 --compare-specialization 2
GRADE = hlc.gc
mercury_compile.13 average of 8 with ignore=0     21.46
mercury_compile.13 average of 8 with ignore=1     21.29
mercury_compile.13 average of 8 with ignore=2     21.29
EXTRA_MCFLAGS = -O2 --compare-specialization 3
GRADE = hlc.gc
mercury_compile.14 average of 8 with ignore=0     21.32
mercury_compile.14 average of 8 with ignore=1     21.15
mercury_compile.14 average of 8 with ignore=2     21.15
EXTRA_MCFLAGS = -O2 --compare-specialization 4
GRADE = hlc.gc
mercury_compile.15 average of 8 with ignore=0     21.32
mercury_compile.15 average of 8 with ignore=1     21.15
mercury_compile.15 average of 8 with ignore=2     21.15
EXTRA_MCFLAGS = -O2 --compare-specialization 5
GRADE = hlc.gc
mercury_compile.16 average of 8 with ignore=0     21.37
mercury_compile.16 average of 8 with ignore=1     21.19
mercury_compile.16 average of 8 with ignore=2     21.18
EXTRA_MCFLAGS = -O2 --compare-specialization 6
GRADE = hlc.gc
mercury_compile.17 average of 8 with ignore=0     21.36
mercury_compile.17 average of 8 with ignore=1     21.19
mercury_compile.17 average of 8 with ignore=2     21.19
EXTRA_MCFLAGS = -O2 --compare-specialization 7
GRADE = hlc.gc
mercury_compile.18 average of 8 with ignore=0     21.39
mercury_compile.18 average of 8 with ignore=1     21.21
mercury_compile.18 average of 8 with ignore=2     21.20
EXTRA_MCFLAGS = -O2 --compare-specialization 8
GRADE = hlc.gc
mercury_compile.19 average of 8 with ignore=0     21.36
mercury_compile.19 average of 8 with ignore=1     21.18
mercury_compile.19 average of 8 with ignore=2     21.18
EXTRA_MCFLAGS = -O2 --compare-specialization 9
GRADE = hlc.gc
mercury_compile.20 average of 8 with ignore=0     21.16
mercury_compile.20 average of 8 with ignore=1     20.98
mercury_compile.20 average of 8 with ignore=2     20.97

Output of the size command. The first column is the interesting one, giving
executable code size. The versions are in the same order as above; the first
ten being asm_fast.gc, the last ten being hlc.gc. With asm_fast.gc, there is
a steady reduction in code size; with hlc.gc, the reduction reverses very
slightly as we go from --compare-specialization 7 to 8 to 9.

6378003	 102404	  70680	6551087	 63f62f	compspec.01
6357347	 102404	  70680	6530431	 63a57f	compspec.02
6339443	 102404	  70680	6512527	 635f8f	compspec.03
6327283	 102404	  70680	6500367	 63300f	compspec.04
6320931	 103332	  70680	6494943	 631adf	compspec.05
6318627	 104004	  70680	6493311	 63147f	compspec.06
6318035	 104420	  70680	6493135	 6313cf	compspec.07
6317491	 105028	  70680	6493199	 63140f	compspec.08
6316131	 106052	  70680	6492863	 6312bf	compspec.09
6312883	 108452	  70680	6492015	 630f6f	compspec.10
4387462	   3864	  70776	4462102	 441616	compspec.11
4381190	   3864	  70776	4455830	 43fd96	compspec.12
4370246	   3864	  70776	4444886	 43d2d6	compspec.13
4363206	   3864	  70776	4437846	 43b756	compspec.14
4360630	   3864	  70776	4435270	 43ad46	compspec.15
4359318	   3864	  70776	4433958	 43a826	compspec.16
4359014	   3864	  70776	4433654	 43a6f6	compspec.17
4358726	   3864	  70776	4433366	 43a5d6	compspec.18
4359142	   3864	  70776	4433782	 43a776	compspec.19
4360022	   3864	  70776	4434662	 43aae6	compspec.20

Zoltan.

cvs diff: Diffing .
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/tests
cvs diff: Diffing browser
cvs diff: Diffing bytecode
cvs diff: Diffing compiler
Index: compiler/handle_options.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/handle_options.m,v
retrieving revision 1.125
diff -u -b -r1.125 handle_options.m
--- compiler/handle_options.m	2002/01/11 07:44:29	1.125
+++ compiler/handle_options.m	2002/01/20 03:30:04
@@ -460,15 +460,6 @@
 	% --split-c-files implies --procs-per-c-function 1
 	option_implies(split_c_files, procs_per_c_function, int(1)),
 
-	% make_hlds contains an optimization which requires the value of the
-	% compare_specialization option to accurately specify the max number
-	% of constructors in a type whose comparison procedure is specialized
-	% and which therefore don't need index functions.
-	globals__io_lookup_int_option(compare_specialization, CompareSpec0),
-	{ int__min(unify_proc__max_exploited_compare_spec_value,
-		CompareSpec0, CompareSpec) },
-	globals__io_set_option(compare_specialization, int(CompareSpec)),
-
 	% Minimal model tabling is not compatible with trailing;
 	% see the comment in runtime/mercury_tabling.c.
 
Index: compiler/unify_proc.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/unify_proc.m,v
retrieving revision 1.100
diff -u -b -r1.100 unify_proc.m
--- compiler/unify_proc.m	2002/01/18 04:00:50	1.100
+++ compiler/unify_proc.m	2002/01/20 03:29:00
@@ -117,12 +117,6 @@
 	hlds_type_body::in, prog_context::in, module_info::in,
 	clauses_info::out) is det.
 
-	% This number gives the maximum number of constructors in a type
-	% whose compare procedure can be specialized, and whose compare
-	% procedure therefore does need an index procedure on that type.
-
-:- func unify_proc__max_exploited_compare_spec_value = int.
-
 %-----------------------------------------------------------------------------%
 %-----------------------------------------------------------------------------%
 
@@ -1069,52 +1063,32 @@
 				Ctor, Res, H1, H2,
 				Context, Clauses)
 		;
-			unify_proc__generate_du_general_compare_clauses(Type,
+			unify_proc__generate_du_linear_compare_clauses(Type,
 				Ctors, Res, H1, H2, Context, Clauses)
 		)
 	;
-		{ Ctors = [Ctor1, Ctor2] },
+		{ Ctors = [_, _ | _] },
 		unify_proc__info_get_module_info(ModuleInfo),
 		{ module_info_globals(ModuleInfo, Globals) },
 		{ globals__lookup_int_option(Globals, compare_specialization,
 			CompareSpec) },
-		( { CompareSpec >= 2 } ->
-			unify_proc__generate_du_two_compare_clauses(
-				Ctor1, Ctor2, Res, H1, H2,
-				Context, Clauses)
-		;
-			unify_proc__generate_du_general_compare_clauses(Type,
+		{ list__length(Ctors, NumCtors) },
+		( { CompareSpec >= NumCtors } ->
+			unify_proc__generate_du_quad_compare_clauses(
 				Ctors, Res, H1, H2, Context, Clauses)
-		)
-	;
-		{ Ctors = [Ctor1, Ctor2, Ctor3] },
-		unify_proc__info_get_module_info(ModuleInfo),
-		{ module_info_globals(ModuleInfo, Globals) },
-		{ globals__lookup_int_option(Globals, compare_specialization,
-			CompareSpec) },
-		( { CompareSpec >= 3 } ->
-			unify_proc__generate_du_three_compare_clauses(
-				Ctor1, Ctor2, Ctor3, Res, H1, H2,
-				Context, Clauses)
 		;
-			unify_proc__generate_du_general_compare_clauses(Type,
+			unify_proc__generate_du_linear_compare_clauses(Type,
 				Ctors, Res, H1, H2, Context, Clauses)
 		)
-	;
-		{ Ctors = [_, _, _, _ | _] },
-		unify_proc__generate_du_general_compare_clauses(Type,
-			Ctors, Res, H1, H2, Context, Clauses)
 	).
 
-unify_proc__max_exploited_compare_spec_value = 3.
-
 %-----------------------------------------------------------------------------%
 
 %	For a du type with one function symbol, such as 
 %
 %		:- type foo ---> f(a, b, c)
 %
-%   	we want to generate code
+%   	the "quadratic" code we want to generate is
 %
 %		compare(Res, X, Y) :-
 %			X = f(X1, X2, X3), Y = f(Y1, Y2, Y3),
@@ -1138,11 +1112,11 @@
 
 %-----------------------------------------------------------------------------%
 
-%	For a du type with two or three function symbols, such as 
+%	For a du type with N function symbols for N > 1, such as 
 %
 %		:- type foo ---> f(a) ; g(a, b, c)
 %
-%   	we want to generate code such as
+%   	the quadratic code we want to generate is
 %
 %		compare(Res, X, Y) :-
 %			(
@@ -1168,66 +1142,67 @@
 %					compare(R, X3, Y3)
 %				)
 %			).
-
-:- pred unify_proc__generate_du_two_compare_clauses(
-	constructor::in, constructor::in, prog_var::in, prog_var::in,
-	prog_var::in, prog_context::in, list(clause)::out,
-	unify_proc_info::in, unify_proc_info::out) is det.
 
-unify_proc__generate_du_two_compare_clauses(Ctor1, Ctor2, R, X, Y,
-		Context, Clauses) -->
-	unify_proc__generate_compare_case(Ctor1, R, X, Y, Context, Case11),
-	unify_proc__generate_compare_case(Ctor2, R, X, Y, Context, Case22),
-	unify_proc__generate_asymmetric_compare_case(Ctor1, Ctor2, "<",
-		R, X, Y, Context, Case12),
-	unify_proc__generate_asymmetric_compare_case(Ctor2, Ctor1, ">",
-		R, X, Y, Context, Case21),
+:- pred unify_proc__generate_du_quad_compare_clauses(list(constructor)::in,
+	prog_var::in, prog_var::in, prog_var::in, prog_context::in,
+	list(clause)::out, unify_proc_info::in, unify_proc_info::out) is det.
 
+unify_proc__generate_du_quad_compare_clauses(Ctors, R, X, Y, Context,
+		Clauses) -->
+	unify_proc__generate_du_quad_compare_clauses_1(Ctors, Ctors, R, X, Y,
+		Context, [], Cases),
 	{ goal_info_init(GoalInfo0) },
 	{ goal_info_set_context(GoalInfo0, Context, GoalInfo) },
 	{ map__init(Empty) },
-	{ Goal = disj([Case11, Case12, Case21, Case22], Empty) - GoalInfo },
+	{ Goal = disj(Cases, Empty) - GoalInfo },
 	{ HeadVars = [R, X, Y] },
 	unify_proc__quantify_clauses_body(HeadVars, Goal, Context, Clauses).
 
-:- pred unify_proc__generate_du_three_compare_clauses(
-	constructor::in, constructor::in, constructor::in,
+:- pred unify_proc__generate_du_quad_compare_clauses_1(
+	list(constructor)::in, list(constructor)::in,
 	prog_var::in, prog_var::in, prog_var::in, prog_context::in,
-	list(clause)::out, unify_proc_info::in, unify_proc_info::out) is det.
+	list(hlds_goal)::in, list(hlds_goal)::out,
+	unify_proc_info::in, unify_proc_info::out) is det.
 
-unify_proc__generate_du_three_compare_clauses(Ctor1, Ctor2, Ctor3, R, X, Y,
-		Context, Clauses) -->
-	unify_proc__generate_compare_case(Ctor1, R, X, Y, Context, Case11),
-	unify_proc__generate_compare_case(Ctor2, R, X, Y, Context, Case22),
-	unify_proc__generate_compare_case(Ctor3, R, X, Y, Context, Case33),
-	unify_proc__generate_asymmetric_compare_case(Ctor1, Ctor2, "<",
-		R, X, Y, Context, Case12),
-	unify_proc__generate_asymmetric_compare_case(Ctor1, Ctor3, "<",
-		R, X, Y, Context, Case13),
-	unify_proc__generate_asymmetric_compare_case(Ctor2, Ctor3, "<",
-		R, X, Y, Context, Case23),
-	unify_proc__generate_asymmetric_compare_case(Ctor2, Ctor1, ">",
-		R, X, Y, Context, Case21),
-	unify_proc__generate_asymmetric_compare_case(Ctor3, Ctor1, ">",
-		R, X, Y, Context, Case31),
-	unify_proc__generate_asymmetric_compare_case(Ctor3, Ctor2, ">",
-		R, X, Y, Context, Case32),
+unify_proc__generate_du_quad_compare_clauses_1([],
+		_RightCtors, _R, _X, _Y, _Context, Cases, Cases) --> [].
+unify_proc__generate_du_quad_compare_clauses_1([LeftCtor | LeftCtors],
+		RightCtors, R, X, Y, Context, Cases0, Cases) -->
+	unify_proc__generate_du_quad_compare_clauses_2(LeftCtor, RightCtors,
+		">", R, X, Y, Context, Cases0, Cases1),
+	unify_proc__generate_du_quad_compare_clauses_1(LeftCtors, RightCtors,
+		R, X, Y, Context, Cases1, Cases).
 
-	{ goal_info_init(GoalInfo0) },
-	{ goal_info_set_context(GoalInfo0, Context, GoalInfo) },
-	{ map__init(Empty) },
-	{ Goal = disj([Case11, Case12, Case13, Case21, Case22, Case23,
-		Case31, Case32, Case33], Empty) - GoalInfo },
-	{ HeadVars = [R, X, Y] },
-	unify_proc__quantify_clauses_body(HeadVars, Goal, Context, Clauses).
+:- pred unify_proc__generate_du_quad_compare_clauses_2(
+	constructor::in, list(constructor)::in, string::in,
+	prog_var::in, prog_var::in, prog_var::in, prog_context::in,
+	list(hlds_goal)::in, list(hlds_goal)::out,
+	unify_proc_info::in, unify_proc_info::out) is det.
 
+unify_proc__generate_du_quad_compare_clauses_2(_LeftCtor,
+		[], _Cmp, _R, _X, _Y, _Context, Cases, Cases) --> [].
+unify_proc__generate_du_quad_compare_clauses_2(LeftCtor,
+		[RightCtor | RightCtors], Cmp0, R, X, Y, Context,
+		Cases0, Cases) -->
+	( { LeftCtor = RightCtor } ->
+		unify_proc__generate_compare_case(LeftCtor, R, X, Y, Context,
+			Case),
+		{ Cmp1 = "<" }
+	;
+		unify_proc__generate_asymmetric_compare_case(LeftCtor,
+			RightCtor, Cmp0, R, X, Y, Context, Case),
+		{ Cmp1 = Cmp0 }
+	),
+	unify_proc__generate_du_quad_compare_clauses_2(LeftCtor, RightCtors,
+		Cmp1, R, X, Y, Context, [Case | Cases0], Cases).
+
 %-----------------------------------------------------------------------------%
 
-%	For a du type with four or more function symbols, such as 
+%	For a du type, such as 
 %
 %		:- type foo ---> f ; g(a) ; h(b, foo).
 %
-%   	we want to generate code
+%   	the linear code we want to generate is
 %
 %		compare(Res, X, Y) :-
 %			__Index__(X, X_Index),	% Call_X_Index
@@ -1259,25 +1234,25 @@
 %				compare_error 	% Abort
 %			).
 
-:- pred unify_proc__generate_du_general_compare_clauses((type)::in,
+:- pred unify_proc__generate_du_linear_compare_clauses((type)::in,
 	list(constructor)::in, prog_var::in, prog_var::in, prog_var::in,
 	prog_context::in, list(clause)::out,
 	unify_proc_info::in, unify_proc_info::out) is det.
 
-unify_proc__generate_du_general_compare_clauses(Type, Ctors, Res, X, Y,
+unify_proc__generate_du_linear_compare_clauses(Type, Ctors, Res, X, Y,
 		Context, [Clause]) -->
-	unify_proc__generate_du_compare_clauses_2(Type, Ctors, Res,
+	unify_proc__generate_du_linear_compare_clauses_2(Type, Ctors, Res,
 		X, Y, Context, Goal),
 	{ HeadVars = [Res, X, Y] },
 	unify_proc__quantify_clause_body(HeadVars, Goal, Context, Clause).
 
-:- pred unify_proc__generate_du_compare_clauses_2((type)::in,
+:- pred unify_proc__generate_du_linear_compare_clauses_2((type)::in,
 	list(constructor)::in, prog_var::in, prog_var::in, prog_var::in,
 	prog_context::in, hlds_goal::out,
 	unify_proc_info::in, unify_proc_info::out) is det.
 
-unify_proc__generate_du_compare_clauses_2(Type, Ctors, Res, X, Y, Context,
-		Goal) -->
+unify_proc__generate_du_linear_compare_clauses_2(Type, Ctors, Res, X, Y,
+		Context, Goal) -->
 	{ IntType = int_type },
 	{ mercury_public_builtin_module(MercuryBuiltin) },
 	{ construct_type(qualified(MercuryBuiltin, "comparison_result") - 0,
@@ -1338,6 +1313,7 @@
 %		:- type foo ---> f ; g(a) ; h(b, foo).
 %
 %   	we want to generate code
+%
 %		(
 %			X = f,		% UnifyX_Goal
 %			Y = f,		% UnifyY_Goal
cvs diff: Diffing compiler/notes
cvs diff: Diffing debian
cvs diff: Diffing deep_profiler
cvs diff: Diffing deep_profiler/notes
cvs diff: Diffing doc
cvs diff: Diffing extras
cvs diff: Diffing extras/aditi
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/graphics
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/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/logged_output
cvs diff: Diffing extras/moose
cvs diff: Diffing extras/moose/samples
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/odbc
cvs diff: Diffing extras/posix
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/stream
cvs diff: Diffing extras/trailed_update
cvs diff: Diffing extras/trailed_update/samples
cvs diff: Diffing extras/trailed_update/tests
cvs diff: Diffing extras/xml
cvs diff: Diffing extras/xml/samples
cvs diff: Diffing java
cvs diff: Diffing library
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/diff
cvs diff: Diffing samples/muz
cvs diff: Diffing samples/rot13
cvs diff: Diffing samples/solutions
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 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/structure_reuse
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/recompilation
cvs diff: Diffing tests/tabling
cvs diff: Diffing tests/term
cvs diff: Diffing tests/valid
cvs diff: Diffing tests/warnings
cvs diff: Diffing tools
cvs diff: Diffing trace
cvs diff: Diffing util
--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list