Commit Graph

7 Commits

Author SHA1 Message Date
Zoltan Somogyi
3d1acbb7f4 Update the style of the tabling tests. 2018-07-08 23:20:52 +02:00
Zoltan Somogyi
fdd141bf77 Clean up the tests in the other test directories.
tests/invalid/*.{m,err_exp}:
tests/misc_tests/*.m:
tests/mmc_make/*.m:
tests/par_conj/*.m:
tests/purity/*.m:
tests/stm/*.m:
tests/string_format/*.m:
tests/structure_reuse/*.m:
tests/submodules/*.m:
tests/tabling/*.m:
tests/term/*.m:
tests/trailing/*.m:
tests/typeclasses/*.m:
tests/valid/*.m:
tests/warnings/*.{m,exp}:
    Make these tests use four-space indentation, and ensure that
    each module is imported on its own line. (I intend to use the latter
    to figure out which subdirectories' tests can be executed in parallel.)

    These changes usually move code to different lines. For the tests
    that check compiler error messages, expect the new line numbers.

browser/cterm.m:
browser/tree234_cc.m:
    Import only one module per line.

tests/hard_coded/boyer.m:
    Fix something I missed.
2015-02-16 12:32:18 +11:00
Julien Fischer
40d69de28a Make doubly sure that the tabling tests aren't run in grades that do not
support tabling.

(The Makefiles in tests directory should prevent this, but in at least one
grade on neptune this isn't currently happening and it's rendering that
machine unusable - I'll fix the Makefile issue separately.)

tests/tabling/*.m:
	Add require_feature_set pragmas to all the tabling tests to ensure
	they aren't accidently run in grades that don't support tabling.
2010-04-01 07:36:22 +00:00
Julien Fischer
63bc291f6f Update test cases that are only run in minimal model tabling grades
Estimated hours taken: 0.2
Branches: main

Update test cases that are only run in minimal model tabling grades
to conform to recent standard library changes.

tests/tabling/*.m:
	Conform to recent changes in the standard library.
2006-04-06 04:50:18 +00:00
Zoltan Somogyi
cdf0383b52 Fix a bunch of problems with tabling that I identified in Uppsala.
Estimated hours taken: 32
Branches: main

Fix a bunch of problems with tabling that I identified in Uppsala. These fall
into two categories.

First, the tabling transformations we were using were dividing work up
too finely. This had three bad effects. First, it caused too much time to be
spent on transmitting data to and from library predicates. Second, it made the
transformations hard to document and hard to explain in a paper. Third, it
caused us to misidentify just what the various forms of tabling have in common,
and what forms of tabling work for what determinisms. To fix this problem,
this diff reorients table_builtin.m and table_gen.m from being divided
primarily by determinism to being divided by evaluation method.

Second, we weren't being careful in separating out the parts of the tabling
data structures that are needed only for debugging the tabling system itself.
The fix for this is to introduce a new grade flag, MR_MINIMAL_MODEL_DEBUG,
intended for use by implementors only, to govern whether the tabling data
structures include debug-only components. (If this flag weren't a grade flag,
the sizes of data structures created in files with different values of this
flag could be inconsistent, which is something you don't want when debugging
the complex code of the tabling infrastructure.)

compiler/table_gen.m:
	Reorganize the simple (loopcheck and memo) tabling transformations
	completely. Instead of separate transformations for model_det and
	model_semi predicates, have separate transformations for loopcheck
	and memo predicates, since this makes it easier to see (and to ensure)
	that the transformation follows the required scheme. Instead of
	generating nested if-then-elses, generate switches when possible.

	For model_semi loopcheck and memo predicates, generate Mercury code
	that obeys our scope rules by not binding output variables in the
	condition of the one remaining if-then-else.

	Finetune the minimal model tabling transformation by combining some
	operations where this improves clarity and performance.

	Order the transformation predicates logically, and move the
	documentation of each form of tabling next to the code implementing
	that form of tabling.

	Attach call_table_gen markers to the setup goals that now all
	loopcheck, memo and minimal model tabled predicates have,
	to avoid having to special case the last lookup goal, and to avoid
	having to have separate code for lookups in call tables versus answer
	tables.

	Generate unique and more meaningful variable names. Change some
	predicate names to be more meaningful, both here and in the
	transformed code.

	Factor out some common code, e.g. for generating lookup goals,
	for generating instmap_deltas and for attaching hide_debug_event
	markers to goals.

	Report errors in cases where the arguments of a tabled predicate
	aren't completely input or output.

compiler/hlds_pred.m:
	Be more strict about the determinisms of tabled predicates; permit
	only the determinisms we really support in all cases, and do not
	permit the ones that may happen to work in some cases.

	Conform to the change of the name of a builtin.

compiler/det_report.m:
	Improve the error message for cases when the determinism is
	incompatible with the selected tabling mechanism.

compiler/compile_target_code.m:
compiler/handle_options.m:
compiler/options.m:
	Handle the new grade component.

library/private_builtin.m:
	Provide a semipure analog of the imp predicate, a call to which makes
	predicates semipure rather than impure, for use in table_builtin.m.

library/table_builtin.m:
runtime/mercury_tabling_preds.h:
	Change the tabling primitives in the ways required by the changes to
	the tabling transformations.

	Group the primitives by the tabling methods they support, and change
	their names to reflect this.

	Change the implementation of each of the affected predicates to be
	nothing more than the invocation of a macro defined in the new header
	file runtime/mercury_tabling_preds.h. The objective of this change
	is to make it possible for table_gen.m to replace sequences of calls
	to predicates in table_builtin.m with a single extended foreign_proc
	goal whose body just invokes the corresponding macros in sequence.
	That change should improve performance by allowing the variables
	that flow from one tabling primitive to another to stay in x86
	registers, instead of being copied to and from Mercury abstract
	machines registers, which on the x86 aren't real machine registers.
	Benchmarking in Uppsala verified that this is a major cost.

	Mark the foreign types used for tabling as can_pass_as_mercury_type;
	this was the intended use of that assertion. Make them private to the
	module, since the rest of the compiler can now handle this.

	Delete the implementations of the predicates for duplicate checking
	and for returning answers for completed subgoals. Profiling with gprof
	has shown their performance to be critical to the performance of
	minimal model tabling overall, and even with our recent changes,
	the compiler still can't create optimal C code for them. They are
	now implemented with handwritten code in mercury_minimal_model.c.

library/term.m:
	Add two utility predicates for use by table_gen.m.

library/Mmakefile:
	Since much of the implementation of table_builtin.m is now in
	runtime/mercury_tabling_preds.h, make its object files depend
	on that header file.

runtime/mercury_conf_params.h:
runtime/mercury_grade.h:
	Include MR_MINIMAL_MODEL_DEBUG when computing the grade.

runtime/mercury_minimal_model.[ch]:
	Add handwritten code to implement the predicates declared as external
	in table_builtin.m.

	Conform to the new names of the suspension and completion predicates.

	Conform to the presence of debugging fields in tabling data structures
	only if MR_MINIMAL_MODEL_DEBUG is defined.

	Collect a lot more statistics than before.

	Reorder some functions.

	Instead of saving the whole generator stack each time, which the new
	statistics showed to have O(n^2) behavior on some benchmarks, save only
	the segment we need to save.

runtime/mercury_tabling.h:
	Conform to the fact that loopcheck and memo predicates now have
	separate sets of status values, and import mercury_tabling_preds.h.

runtime/mercury_tabling.c:
runtime/mercury_hash_lookup_or_add_body.h:
	Move a huge macro out of mercury_tabling.c to the new file
	mercury_hash_lookup_or_add_body.h for ease of editing, and modify it to
	gather more statistics.

	Make the statistics report easier to read.

runtime/Mmakefile:
	Mention mercury_tabling_preds.h and mercury_hash_lookup_or_add_body.h.

runtime/mercury_wrapper.h:
	Provide a mechanism (--tabling-statistics in MERCURY_OPTIONS)
	that causes the runtime to print tabling statistics at the ends of
	executions, for use in benchmarking.

doc/user_guide.texi:
	Document --tabling-statistics. (Minimal model tabling is not yet
	stable enough to be documented, which is why .dmm isn't documented
	either.)

scripts/canonical_grade.sh-subr:
scripts/init_grade_options.sh-subr:
scripts/parse_grade_options.sh-subr:
scripts/mgnuc.in:
	Implement the new grade component.

trace/mercury_trace.c:
trace/mercury_trace_internal.c:
	Conform to changes in the runtime.

tests/debugger/*.m:
	Avoid now invalid combinations of determinism and evaluation method.

tests/debugger/*.exp:
	Conform to new goal paths in procedures transformed by tabling.

tests/tabling/*.m:
	For tests which had predicate whose determinisms isn't compatible
	with the evaluation method, change the determinism if possible,
	and the evaluation method otherwise, if either is possible.

	Bring these tests up to date with our coding guidelines, since they
	may now appear in papers.

tests/tabling/Mmakefile:
	Disable the tests whose combination of determinism and evaluation
	method is no longer supported, and in which neither one can be changed.

tests/tabling/loopcheck_no_loop.{m,exp}:
	Make this test case tougher.

tests/tabling/test_tabling:
	Make this script more robust in the face of different kinds of
	test case failures.

tests/invalid/loopcheck.{m,err_exp}:
tests/invalid/Mmakefile:
	Test that we get the expected error message for an invalid combination
	of determinism and evaluation method. The new test invalid/loopcheck.m
	is the old test tabling/loopcheck.m.

tests/valid/Mmakefile:
	Use a more general pattern to test for minimal model grades,
	now that we also use .dmm as a grade component.
2004-05-31 04:13:39 +00:00
Zoltan Somogyi
8b9d436cbb More improvements for minimal model tabling.
Estimated hours taken: 12
Branches: main

More improvements for minimal model tabling.

runtime/mercury_engine.[ch]:
	Provide a debug flag to control the printing of debug stack slots
	in nondet stack dumps.

runtime/mercury_stack_trace.[ch]:
	Provide a mechanism that allows a dump of the nondet stack to print
	the principal debugging stack slots of the stack frames of procedures
	that were compiled with debugging, to help debug problems where
	these are overwritten during stack segment saves/restores.

	Add a mechanism for limiting the output of a nondet stack trace
	to a segment of the nondet stack.

runtime/mercury_minimal_model.[ch]:
	Limit the output of a diagnostic nondet stack trace to just the
	segment being saved or restored.

	Provide a label layout structure for the entry point of the suspend
	predicate, since this is necessary for correct nondet stack traces
	at suspensions and resumptions.

	Store the layout structure of the top nondet stack frame with each
	saved state, to allow the saved nondet stack segment to be dumped
	at resumptions as well as suspensions.

	Fix an old bug: when extending a saved stack segment, use the same
	algorithm for determining its lower bound as when the stack segment
	was created in the first place.

	Factor out some repeated definitions.

	Note problems to be fixed later.

	Improve debugging output.

runtime/mercury_stacks.[ch]:
	Move the documentation of the generator stack, the cut stack and the
	pneg stack from the source file to the header file, and expand it
	considerably.

	Make the routines for printing entries of these stacks generate more
	consistently formatted output.

	Simplify some code.

runtime/mercury_stack_layout.h:
	Provide a macro for use by mercury_minimal_model.c.

runtime/mercury_trace_base.[ch]:
	Save and restore the global variables holding event numbers,
	call sequence numbers and call depths across debugging Mercury code.
	We already used to do this for Mercury code invoked by the debugger,
	but now that we can invoke Mercury code to print the values of
	variables as diagnostics from within the suspend and resume predicates
	*outside* the debugger, we need to do it more generally.

trace/mercury_trace.c:
	Fix a bug: provide the layout structure of the current procedure
	to the diagnostic routines for minimal model tabling even if the
	debugger doesn't stop at that procedure.

trace/mercury_trace_internal.c:
	Add two new mdb commands to help debug minimal model tabling.

	The "mm_stack" command has the same effect as the existing commands
	"gen_stack", "cut_stack" and "pneg_stack" executed in sequence.

	The "debug_vars" command prints the counters for event numbers,
	call sequence numbers and call depths, both from their global variables
	and their saved copies, for debugging problems where they are
	overwritten, such as the one fixed by the changes to
	mercury_trace_base.[ch] above.

	Reorder some code for consistency.

trace/mercury_trace_util.[ch]:
	Add a function to implement the "debug_vars" command.

doc/user_guide.texi:
	Document the new mdb commands.

doc/mdb_categories:
	Add the new mdb commands to the list of developer commands, as well
	some others previously left out.

tests/debugger/mdb_command_test.inp:
	Test the documentation of the new mdb commands.

tests/tabling/combine.m:
	Change the code of this test case to what was intended, so that it now
	matches the old expected output.

tests/tabling/completed_consumer_in_solutions.{m,exp}:
	New test case, an easier version of consumer_in_solutions.

tests/tabling/consumer_in_commit.{m,exp}:
	Extend this test case and update the expected output; we can execute
	both the original code and the extension without runtime exceptions.

tests/tabling/seq2.m:
	Fix Kostis's new test case.

tests/tabling/seq4.exp:
	Fix the expected output of Kostis's new test case.

tests/tabling/Mmakefile:
	Enable the new test cases, and some old test cases that we now pass.
2004-03-12 06:02:19 +00:00
Kostis Sagonas
529011d312 Added a test for switching back and forth between two consumers in order to derive all the answers. 2004-03-11 07:32:21 +00:00