[m-rev.] For post-commit review: Loop control transformation, source-to-source component

Zoltan Somogyi zs at csse.unimelb.edu.au
Tue Sep 27 16:21:42 AEST 2011


On 27-Sep-2011, Paul Bone <pbone at csse.unimelb.edu.au> wrote:
> I'm committing this now so that Zoltan can begin to review it while I work on
> the code generator component.

The first part of my post-commit review of Paul's loop control diff,
covering everything except the transformation.

Paul, can you please attend to the new XXXs?

Zoltan.

compiler/goal_util.m:
	Remove the new expand_plain_conj predicate Paul just added,
	since it exactly duplicates the existing goal_to_conj_list.

compiler/par_loop_control.m:
	Conform to the above.

runtime/mercury_par_builtin.h:
	Fix a bug introduced by Paul's diff: the extendable array MUST be
	the last slot in the MR_LoopControl structure.

	Fix some of the documentation and the formatting.

runtime/mercury_par_builtin.c:
	Fix some of the documentation and the formatting.

	Add some XXXs.

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/goal_util.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/goal_util.m,v
retrieving revision 1.191
diff -u -b -r1.191 goal_util.m
--- compiler/goal_util.m	27 Sep 2011 00:49:24 -0000	1.191
+++ compiler/goal_util.m	27 Sep 2011 04:47:25 -0000
@@ -278,13 +278,6 @@
 :- pred create_conj(hlds_goal::in, hlds_goal::in, conj_type::in,
     hlds_goal::out) is det.
 
-    % expand_plain_conj(Goal, Goals).
-    %
-    % If Goal represents a plain conjunction then Goals are its conjuncts,
-    % otherwise Goals is a singleton list containing Goal.
-    %
-:- pred expand_plain_conj(hlds_goal::in, list(hlds_goal)::out) is det.
-
     % can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
     %   InstmapBeforeGoal1, Goal1, InstmapBeforeGoal2, Goal2).
     %
@@ -1486,16 +1479,6 @@
 
 %-----------------------------------------------------------------------------%
 
-expand_plain_conj(Goal, Conjs) :-
-    Goal = hlds_goal(GoalExpr, _),
-    ( GoalExpr = conj(plain_conj, ConjsPrime) ->
-        Conjs = ConjsPrime
-    ;
-        Conjs = [Goal]
-    ).
-
-%-----------------------------------------------------------------------------%
-
 can_reorder_goals_old(ModuleInfo, VarTypes, FullyStrict,
         InstmapBeforeEarlierGoal, EarlierGoal,
         InstmapBeforeLaterGoal, LaterGoal) :-
Index: compiler/par_loop_control.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/par_loop_control.m,v
retrieving revision 1.1
diff -u -b -r1.1 par_loop_control.m
--- compiler/par_loop_control.m	27 Sep 2011 05:05:03 -0000	1.1
+++ compiler/par_loop_control.m	27 Sep 2011 05:15:16 -0000
@@ -777,7 +777,7 @@
         !VarTypes) :-
     % Re-write the recursive call in the last conjunct.
     goal_rewrite_recursive_call(Info, LastConj0, LastConj, _),
-    expand_plain_conj(LastConj, LastConjGoals),
+    goal_to_conj_list(LastConj, LastConjGoals),
 
     % Process the remaining conjuncts, building up the nested set of ITEs from
     % inside to outside.
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
Index: runtime/mercury_par_builtin.c
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_par_builtin.c,v
retrieving revision 1.4
diff -u -b -r1.4 mercury_par_builtin.c
--- runtime/mercury_par_builtin.c	27 Sep 2011 00:49:27 -0000	1.4
+++ runtime/mercury_par_builtin.c	27 Sep 2011 06:13:29 -0000
@@ -43,7 +43,7 @@
 MR_LoopControl *
 MR_lc_create(unsigned num_workers)
 {
-    MR_LoopControl* lc;
+    MR_LoopControl  *lc;
     unsigned        i;
 
     lc = MR_GC_malloc(sizeof(MR_LoopControl) +
@@ -52,8 +52,10 @@
     for (i = 0; i < num_workers; i++) {
         /*
         ** We allocate contexts as necessary, so that we never allocate a
-        ** context we don't use.  Also by delaying the allocation of contexts
+        ** context we don't use. Also, by delaying the allocation of contexts,
         ** all but the first may execute in parallel with one-another.
+        ** XXX I (zs) do not understand how the first half of the previous
+        ** sentence implies the seconf half; I don't think it does.
         */
         lc->MR_lc_slots[i].MR_lcs_context = NULL;
         lc->MR_lc_slots[i].MR_lcs_is_free = MR_TRUE;
@@ -70,7 +72,7 @@
 ** Deprecated, this was part of our old loop control design.
 */
 MR_LoopControlSlot *
-MR_lc_try_get_free_slot(MR_LoopControl* lc)
+MR_lc_try_get_free_slot(MR_LoopControl *lc)
 {
     if (lc->MR_lc_outstanding_workers == lc->MR_lc_num_slots) {
         return NULL;
@@ -78,7 +80,7 @@
         unsigned i;
 
         /*
-        ** Optimize this by using a hint to start the search at.
+        ** XXX Optimize this by using a hint to start the search at.
         */
         for (i = 0; i<lc->MR_lc_num_slots; i++) {
             if (lc->MR_lc_slots[i].MR_lcs_is_free) {
@@ -93,7 +95,7 @@
 }
 
 void
-MR_lc_spawn_off_func(MR_LoopControlSlot* lcs, MR_Code* code_ptr)
+MR_lc_spawn_off_func(MR_LoopControlSlot *lcs, MR_Code *code_ptr)
 {
     if (lcs->MR_lcs_context == NULL) {
         /*
@@ -111,7 +113,7 @@
 }
 
 void
-MR_lc_join(MR_LoopControl* lc, MR_LoopControlSlot* lcs)
+MR_lc_join(MR_LoopControl *lc, MR_LoopControlSlot *lcs)
 {
     MR_bool     last_worker;
     MR_Context  *wakeup_context;
@@ -123,13 +125,13 @@
         MR_atomic_dec_and_is_zero_int(&(lc->MR_lc_outstanding_workers));
 
     /*
-    ** If the master thread is suspended wake it up, provided that
-    ** either: The loop has finished and this is the last worker to exit.
-    **         The loop has not finished (so the master can create more work).
-    */
-    if (lc->MR_lc_master_context &&
-        ((lc->MR_lc_finished && last_worker) ||
-         (!lc->MR_lc_finished))) {
+    ** If the master thread is suspended, wake it up, provided that either:
+    ** - the loop has finished and this is the last worker to exit, or
+    ** - the loop has not finished (so the master can create more work).
+    */
+    if ((lc->MR_lc_master_context != NULL) &&
+        ((lc->MR_lc_finished && last_worker) || (!lc->MR_lc_finished)))
+    {
         /*
         ** Now take a lock and re-read the master context field.
         */
Index: runtime/mercury_par_builtin.h
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/runtime/mercury_par_builtin.h,v
retrieving revision 1.9
diff -u -b -r1.9 mercury_par_builtin.h
--- runtime/mercury_par_builtin.h	27 Sep 2011 00:49:27 -0000	1.9
+++ runtime/mercury_par_builtin.h	27 Sep 2011 06:17:05 -0000
@@ -302,15 +302,24 @@
 
 struct MR_LoopControl_Struct
 {
-    unsigned                                MR_lc_num_slots;
-    MR_LoopControlSlot                      MR_lc_slots[1];
     /* Outstanding workers is manipulated with atomic instructions */
     MR_THREADSAFE_VOLATILE MR_Integer       MR_lc_outstanding_workers;
+
     /* This lock protects only the next field */
     MR_THREADSAFE_VOLATILE MR_Us_Lock       MR_lc_master_context_lock;
     MR_Context                              *MR_lc_master_context;
+
     /* Unused atm */
     MR_THREADSAFE_VOLATILE MR_bool          MR_lc_finished;
+
+    /*
+    ** MR_lc_slots MUST be the last field, since in practice, we treat
+    ** the array as having as many slots as we need, adding the size of
+    ** all the elements except the first to sizeof(MR_LoopControl) when
+    ** we allocate memory for the structure.
+    */
+    unsigned                                MR_lc_num_slots;
+    MR_LoopControlSlot                      MR_lc_slots[1];
 };
 
 #else
@@ -347,7 +356,7 @@
         (lc)->MR_lc_finished = MR_TRUE;                                     \
         /*                                                                  \
         ** This barrier ensures that MR_lc_finished has been set to MR_TRUE \
-        ** before we read MR_lc_outstanding_contexts.
+        ** before we read MR_lc_outstanding_contexts.                       \
         ** it works with another barrier in     \
         ** MR_lc_join_and_terminate().  See MR_lc_join_and_terminate().     \
         */                                                                  \
@@ -394,7 +403,7 @@
 **
 ** Deprecated: this was part of our old loop control design.
 */
-extern MR_LoopControlSlot* MR_lc_try_get_free_slot(MR_LoopControl* lc);
+extern MR_LoopControlSlot   *MR_lc_try_get_free_slot(MR_LoopControl *lc);
 
 /*
 ** Get a free slot in the loop control, or block until one is available.
@@ -406,17 +415,17 @@
         if ((lc)->MR_lc_outstanding_workers == (lc)->MR_lc_num_slots) {     \
             MR_US_SPIN_LOCK(&((lc)->MR_lc_master_context_lock));            \
             /*                                                              \
-            ** Re-check outstanding workers while holding the lock.  This   \
-            ** ensures that we only commit to sleeping while holding the    \
-            ** lock, But if there were a worker available we wouldn't need   \
-            ** to take the lock at all.                                     \
+            ** Re-check outstanding workers while holding the lock.         \
+            ** This ensures that we only commit to sleeping while holding   \
+            ** the lock. But if there were a worker available, we would not \
+            ** need to take the lock at all.                                \
             */                                                              \
             if ((lc)->MR_lc_outstanding_workers == (lc)->MR_lc_num_slots) { \
                 MR_Context *ctxt;                                           \
                                                                             \
                 /*                                                          \
-                ** Block this context and have it retry once it's           \
-                ** unblocked                                                \
+                ** Block this context, and have it retry once it is         \
+                ** unblocked.                                               \
                 */                                                          \
                 ctxt = MR_ENGINE(MR_eng_this_context);                      \
                 (lc)->MR_lc_master_context = ctxt;                          \
@@ -431,7 +440,7 @@
         }                                                                   \
                                                                             \
         /*                                                                  \
-        ** Optimize this by using a hint to start the search at.            \
+        ** XXX Optimize this by using a hint to start the search at.        \
         */                                                                  \
         for (i = 0; i<(lc)->MR_lc_num_slots; i++) {                         \
             if ((lc)->MR_lc_slots[i].MR_lcs_is_free) {                      \
@@ -446,6 +455,7 @@
         ** Since only one context can ever run MR_lc_wait_free_slot then we \
         ** can never fail to find a since outstanding workers can never be  \
         ** incremented by another engine.                                   \
+        ** XXX This comment is so mangled it does not make sense.           \
         */                                                                  \
         MR_fatal_error("No free slot found in loop control");               \
     } while (0);
@@ -456,7 +466,7 @@
 #define MR_lc_spawn_off(lcs, label) \
     MR_lc_spawn_off_func((lcs), MR_LABEL(MR_add_prefix(label)))
 
-extern void MR_lc_spawn_off_func(MR_LoopControlSlot* lcs, MR_Code* code_ptr);
+extern void MR_lc_spawn_off_func(MR_LoopControlSlot *lcs, MR_Code *code_ptr);
 
 /*
 ** Join and terminate a worker.
@@ -483,7 +493,7 @@
 ** Join a worker context with the main thread.  Termination of the context
 ** is handled in the macro above.
 */
-extern void MR_lc_join(MR_LoopControl* lc, MR_LoopControlSlot* lcs);
+extern void MR_lc_join(MR_LoopControl *lc, MR_LoopControlSlot *lcs);
 
 #endif /* MR_THREAD_SAFE && MR_LL_PARALLEL_CONJ */
 
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