Commit Graph

51 Commits

Author SHA1 Message Date
Fergus Henderson
04b720630b Update the copyright messages so that (a) they contain the correct years
and (b) they say "Copyright (C) ... _The_ University of Melbourne".
1997-07-27 15:09:59 +00:00
Simon Taylor
27d156bbb5 Implemented a :- use_module directive. This is the same as
Estimated hours taken: 14

Implemented a :- use_module directive. This is the same as
:- import_module, except all uses of the imported items
must be explicitly module qualified.

:- use_module is implemented by ensuring that unqualified versions
of items only get added to the HLDS symbol tables if they were imported
using import_module.

Indirectly imported items (from `.int2' files) and items declared in `.opt'
files are treated as if they were imported with use_module, since all uses
of them should be module qualified.

compiler/module_qual.m
	Keep two sets of type, mode and inst ids, those which can
	be used without qualifiers and those which can't.

	Renamed some predicates which no longer have unique names since
	'__' became a synonym for ':'.

	Made mq_info_set_module_used check whether the current item is in
	the interface, rather than relying on its caller to do the check.

	Removed init_mq_info_module, since make_hlds.m now uses the
	mq_info built during the module qualification pass.

compiler/prog_data.m
	Added a pseudo-declaration `used', same as `imported' except uses of
	the following items must be module qualified.

	Added a type need_qualifier to describe whether uses of an item
	need to be module qualified.

compiler/make_hlds.m
	Keep with the import_status whether current item was imported
	using a :- use_module directive.

	Use the mq_info structure passed in instead of building a new one.

	Ensure unqualified versions of constructors only get added to the
	cons_table if they can be used without qualification.

compiler/hlds_module.m
	Added an extra argument to predicate_table_insert of type
	need_qualifier.

	Only add predicates to the name and name-arity indices if they
	can be used without qualifiers.

	Changed the structure of the module-name-arity index, so that
	lookups can be made without an arity, such as when type-checking
	module qualified higher-order predicate constants. This does not
	change the interface to the module_name_arity index.

	Factored out some common code in predicate_table_insert which
	applies to both predicates and functions.

compiler/hlds_pred.m
	Removed the opt_decl import_status. It isn't needed any more
	since all uses of items declared in .opt files must now be
	module qualified.

	Added some documentation about when the clauses_info is valid.

compiler/intermod.m
	Ensure that predicate and function calls in the `.opt' file are
	module qualified. Use use_module instead of import_module in
	`.opt' files.

compiler/modules.m
	Handle use_module directives.

	Report a warning if both use_module and import_module declarations
	exist for the same module.

compiler/mercury_compile.m
	Collect inter-module optimization information before module
	qualification, since it can't cause conflicts any more. This means
	that the mq_info structure built in module_qual.m can be reused in
	make_hlds.m, instead of building a new one.

compiler/prog_out.m
	Add a predicate prog_out__write_module_list, which was moved
	here from module_qual.m.

compiler/typecheck.m
	Removed code to check that predicates declared in `.opt' files
	were being used appropriately, since this is now handled by
	use_module.

compiler/*.m
	Added missing imports, mostly for prog_data and term.

NEWS
compiler/notes/todo.html
doc/reference_manual.texi
	Document `:- use_module'.

tests/valid/intermod_lambda_test.m
tests/valid/intermod_lambda_test2.m
tests/invalid/errors.m
tests/invalid/errors2.m
	Test cases.
1997-06-29 23:11:42 +00:00
Tyson Dowd
cbcb23d17b Enable --warn-interface-imports by default.
Estimated hours taken: 3

Enable --warn-interface-imports by default. This was turned off while
list and term were defined in mercury_builtin.m, since it caused many
warnings.

Fix all the unused interface imports that have been added since then.

compiler/options.m:
	Enable --warn-interface-imports by default.

compiler/module_qual.m:
	Fix formatting inconsistencies with module names in warning
	messages. (".m" was not appended to module names if there was
	only one module).

compiler/*.m:
library/*.m:
tests/invalid/type_loop.m:
tests/warnings/*.m:
	Remove usused interface imports, or move them into
	implementation (mostly bool, list and std_util).
1997-05-21 02:16:53 +00:00
Zoltan Somogyi
5279c1466f Slight rearrangement of the data structures of the code generator, to allow
Estimated hours taken: 5

Slight rearrangement of the data structures of the code generator, to allow
more flexibility in code generation. The rearrangement moves the stack_slots
information (mapping vars to their stack slots if any) and follow_vars
information (mapping vars to the location preferred for them by future code)
from code_info to code_exprn. This allows the predicates in code_exprn to
make use of this information.

As a result of these changes, the code generator now emits 110 fewer lines
of C code for the compiler (478 lines are replaced by 368). There is no
discernible impact on the memory requirements or running time of the compiler
itself.

code_exprn:
	Add the two fields to the exprn_info data structure.

	Several predicates in code_exprn now evaluate variables directly
	into their preferred location, instead of a random register.

code_info:
	Remove the two fields from the code_info data structure.
1997-05-12 07:02:54 +00:00
Zoltan Somogyi
4c3b0ecb09 Replace calls to map__set with calls to either map__det_insert or
Estimated hours taken: 3

Replace calls to map__set with calls to either map__det_insert or
map__det_update. In some cases this required a small amount of code
reorganization.
1997-04-07 05:39:59 +00:00
Christopher Rodd Speirs
8332111adb Made some extensive additions to bag.m to include the standard set
Estimated hours taken: 5

Made some extensive additions to bag.m to include the standard set
operations (union, intersection, subtraction).  Also added some other
useful predicates to operate on bags.

library/bag.m:
	The following changes were made which will break any programs using
	these predicates: in bag__contains/2, the order of the arguments were
	swapped to make bag__contains the same as map__contains.
	bag__remove was det, but is now semidet.  bag__delete was added to
	replace the old bag__remove.  These changes make bag conform to the
	same standard as set.m and map.m.
compiler/code_exprn.m:
	This needed to be changed as it uses bag.m, and the changes to
	bag.m stopped code_exprn.m from compiling.
1997-02-13 23:57:16 +00:00
Zoltan Somogyi
a4a1a7788c Add support for taking the addresses of words on the heap as well as on
Estimated hours taken: 7

Add support for taking the addresses of words on the heap as well as on
on either stack. This will be used later to support tail recursion modulo
constructor application as well as parallelism.

The support provided is a first draft. Since nothing in the compiler
currently generates code that uses the new facilities, they have not been
tested yet beyond ensuring that they don't interfere with the old functionality
of the compiler.

llds:
	Add a new type, mem_ref, that denotes a reference to a stackvar,
	a framevar, or to a field of a cell on the heap.

	Add a new function symbol to the type rval: mem_addr(mem_ref),
	which represents the address of the word denoted by the mem_ref.

	Add a new function symbol to the type lval: mem_ref(rval).
	Given that Rval is an address, mem_ref(Rval) denotes the word
	at that address. The value of Rval should have originally come from
	a mem_addr(_) type rval, but that value could have been store in
	registers, stack slots etc since then.

code_exprn, code_info, dupelim, exprn_aux, garbage_out, livemap, llds_common,
llds_out, middle_rec, opt_debug, opt_util, vn_cost, vn_filter:
	Added code to handle the new mem_ref type and the new alternatives
	in lval and rval.

exprn_aux:
	Make exprn_aux__substitute_lval_in_lval more thorough.

vn_type:
	Add vn shadows of the new things in llds.

vn_flush, vn_order, vn_util:
	Handle the new things in llds and/or their vn shadows.
1997-01-21 05:05:31 +00:00
Zoltan Somogyi
54bb1c4a67 Move the code that generates code for pragma_c_codes to a new module.
Estimated hours taken: 3

code_gen, pragma_c_code:
	Move the code that generates code for pragma_c_codes to a new module.

llds:
	Change the representation of reg and temp lvals, in order to create
	the concept of a "register type" and to reduce memory requirements.

	Also add a comment indicating a possible future extension dealing with
	model_non pragma_c_codes.

code_exprn, code_info:
	Add the ability to request registers of a given type, or a specific
	register, when acquiring registers.

bytecode, bytecode_gen, call_gen, dupelim, exprn_aux, follow_vars, frameopt,
garbage_out, jumpopt, llds_out, middle_rec, opt_debug, opt_util, store_alloc,
string_switch, tag_switch, unify_gen, vn_block, vn_cost, vn_filter, vn_flush,
vn_order, vn_temploc, vn_type, vn_util, vn_verify:
	Small changes to accommodate the new register representation.

hlds_goal:
	Add a comment indicating a possible future extension dealing with
	model_non pragma_c_codes.

inlining:
	Add a comment indicating a how to deal with a possible future extension
	dealing with model_non pragma_c_codes.
1996-12-31 09:58:59 +00:00
Zoltan Somogyi
403d1064e0 Rename a bunch of predicates to make their names better reflect what they do.
Estimated hours taken: 0.5

Rename a bunch of predicates to make their names better reflect what they do.
1996-12-26 02:07:51 +00:00
Zoltan Somogyi
08a5f48e2c Take the code generator a big step closer to notes/ALLOCATION.
Estimated hours taken: _____

Take the code generator a big step closer to notes/ALLOCATION.
The new code generator emits code that is smaller and faster than
the code we used to emit.

Nondet liveness is no longer used; nondet live sets are always empty.
In code that was being modified anyway, remove its handling. Other
uses will be removed later (this keeps this change from being far too big;
as it is it is merely too big). Similarly for cont-lives.

In several places, clarify the code that gathers several code pieces together.

call_gen:
	Unset the failure continuation and flush the resume vars to
	their stack slots before nondet calls.

	Move the code that decides whether a nondet call can be a tailcall
	to code_info.

code_aux:
	Remove the code to handle resume points, since these are now
	handled in the specific constructs that need them. Replace it
	with a sanity check.

code_exprn:
	Add a predicate to place multiple vars.

code_gen:
	Remove the predicate code_gen__generate_forced_goal, since it
	packaged together some operations that should be executed at different
	times.

	Don't unset the failure continuation after every nondet goal;
	this is now done in the constructs that need it.

	Modify the handling of negation to use resume point info
	according to notes/ALLOCATION.

	Remove the predicate code_gen__ensure_vars_are_saved which was
	use to save all lives variables to the stack before nondet
	disjunctions and if-then-elses; we don't do that anymore.

code_info:
	Significantly simplify and document the handling of failure
	continuations, and make the types involved abstract types.

	Factor out common code in the handling of det and semi commits.

	Keep track of "zombies", variables that are dead wrt forward
	execution but whose values we need because they may be needed
	at a resume point we can reach.

	Remove several now unneeded predicates, and introduce new
	predicates to help other modules.

code_util:
	Add a couple of predicates to check whether ia goal cannot fail before
	flushing all variables to the stack, and whether a goal cannot flush
	any variables to the stack. These are used in liveness to decide
	which entry labels will be needed at resume points.

disj_gen:
	Unify the handling of det and semi disjunctions. Model the code
	handling of nondet disjunctions on the code handling pruned
	disjunctions. It is possible that the handling of nondet and pruned
	disjunctions can also be unified; the new code should make this
	significantly easier.

	Make the code conform to notes/ALLOCATION. This means saving
	only the variables mentioned in the resume_point field, not
	flushing all live variables to the stack at the start of a
	nondet disjunction, handling zombies, and using the new method
	of flushing variables at the ends of branched structures.

ite_gen:
	Unify the handling of det and semi if-then-elses. Model the code
	handling of nondet if-then-elses on the code handling det/semi
	if-then-elses. It is possible that the handling of nondet and pruned
	if-then-elses can also be unified; the new code should make this
	significantly easier.

	Make the code conform to notes/ALLOCATION. This means saving
	only the variables mentioned in the resume_point field, not
	flushing all live variables to the stack at the start of a
	nondet if-then-else, handling zombies, and using the new method
	of flushing variables at the ends of branched structures.

	Apply the new rules about liveness in if-then-elses, which say that
	the else part is parallel not to the then part but to the conjunction
	of the condition and the then part.

dense_switch, lookup_switch, string_switch, switch_gen, tag_switch, middle_rec:
	Use the new method of flushing variables at the ends of branched
	structures. Don't call remake_with_store map; switch_gen will do so.

	Fix an old bug in lookup_switch.

	The code in switch_gen which looked for the special case of a two-way
	switch used to use a heuristic to decide which one was recursive and
	which one was a base case. We now check the codes of the cases.

hlds_goal:
	Adjust the structure of the resume_point field to make it easier
	to use. Add a more convenient access predicate.

hlds_out:
	Don't print the nondet liveness and cont live fields, since they are
	not used anymore. Comment out the printing of the context field,
	which is rarely useful. Modify the printing of the resume_point field
	to conform to its new definition.

live_vars:
	Use the resume_point field, not the nondetlives field, to decide
	which variables may be needed on backward execution. Remove some
	code copied from liveness.m.

liveness:
	Put the several pieces of information we thread through the traversal
	predicates into a single tuple.

	Don't put variables which are local to one branch of a branched
	structure into the post-birth sets of other branches.

	Apply the new rules about liveness in if-then-elses, which say that
	the else part is parallel not to the then part but to the conjunction
	of the condition and the then part. Variables that are needed in the
	else part but not in the condition or the then part now die in at the
	start of the condition (they will be protected by the resume point on
	the condition).

	We now treat pruned and non-pruned disjunctions the same way
	wrt deadness; the old way was too conservative (it had to be).

	We still mishandle branches which produce some variables but
	can't succeed.

mercury_compile:
	Liveness now prints its own progress message with -V; support this.

store_alloc:
	When figuring out what variables need to be saved across calls,
	make sure that we put in interference arcs between those variables
	and those that are required by enclosing resume points.

	Don't compute cont-lives, since they are not used anymore.

livemap:
	Fix the starting comment.
1996-12-18 08:56:10 +00:00
Zoltan Somogyi
0b45f80fd4 Get rid of unnecessary placement of variables in registers at failure
Estimated hours taken: 0.5

Get rid of unnecessary placement of variables in registers at failure
continuations. The change reduces the size of the code of the compiler
on Alphas by 100 Kb (3%).

code_exprn:
	Add a predicate to produce a variable either in a register
	or in a stack slot.

code_info:
	Call this predicate (instead of another that produces variables
	into registers only) when we are flushing the values of the variables
	whose values will be needed at a resumption point.
1996-12-10 07:33:21 +00:00
Zoltan Somogyi
584e402c33 Another step towards implementing notes/ALLOCATION.
Estimated hours taken: 6

Another step towards implementing notes/ALLOCATION.

hlds_goal:
	Define a new type that gives the information associated with
	resumption points. Add a field of this type to goal_info, and the
	associated operations.

	Change the layout of the access predicates to make the code_info
	structure easier to modify in the future.

liveness:
	Fill in the resume_point fields of goals that establish
	resumption points.

hlds_out:
	Print the new resume_point field of goal_info.

	Allow the printing of base_type_infos on the right hand sides
	of unifications.

code_info:
	Reuse the stack of store maps field, which we don't use anymore,
	to store the stack of resumption-point variable sets. Add operations
	on this new stack.

	Remove the slot that holds the code model of the current procedure,
	since it is used rarely and can be easily looked up in the proc_info,
	which we also store. Reuse the slot to store the maximum number of
	stack pushes, eliminating the pair used to store it previously.

	Change the layout of the access predicates to make the code_info
	structure easier to modify in the future.

code_gen:
	Don't pass the code model to code_info__init.

code_exprn:
	Make an abort message more specific.

hlds_pred:
	Fix typos.
1996-11-25 00:27:43 +00:00
Zoltan Somogyi
ee24e66a71 Switch from using a stack of store_maps in the code_info to govern what
Estimated hours taken: 2.5

Switch from using a stack of store_maps in the code_info to govern what
goes where at the end of each branched structure to using the store map
fields of the goal expressions of those structures.

Fix variable names where they resembled the wrong kind of map(var, lval).

code_info:
	Remove the operations on stacks of store maps.
	Modify the generate_forced_saves and remake_with_store_map operations
	to take a store_map parameter.

	When making variables magically live, pick random unused variables
	to hold them, since we can no longer use the guidance of the top
	store map stack entry. This may lead to the generation of some
	excess move instructions at non-reachable points in the code;
	this will be fixed later.

code_gen:
	Remove the store map push and pop invocations.
	Modify the generate_forced_goal operation to take a store_map parameter.

code_exprn:
	Export a predicate for use by code_info.

middle_rec, disj_gen, ite_gen, switch_gen,
dense_switch, lookup_switch, string_switch, tag_switch:
	Pass the store map around to get it to invocations of the primitives
	in code_gen and code_info that now need it.

goal_util:
	Name apart the new follow_vars field in hlds__goal_infos.
	(This should have been in the change that introduced that field.)

common, constraint, cse_detection, det_analysis, dnf, excess, follow_code,
intermod, lambda, lco, liveness, make_hlds, mode_util, modes, polymorphism,
quantification, simplify, switch_detection, typecheck, unique_modes,
unused_args:
	Fix variable names.

follow_vars, store_alloc:
	Add comments.
1996-11-23 10:39:02 +00:00
Fergus Henderson
322f0b8a56 Eliminate some source code duplication.
Estimated hours taken: 0.25

compiler/code_exprn.m:
	Eliminate some source code duplication.
1996-11-09 00:35:36 +00:00
Thomas Conway
9bfeb3cb44 Fix the new predicate introduced in the last change:
Estimated hours taken: 0.25

mercury/compiler/code_exprn.m:
	Fix the new predicate introduced in the last change:
		code_exprn__materialize_vars_in_rval
	which was removing and adding register dependencies to
	the exprn_info structure, and it shouldn't have been.
1996-11-07 00:53:19 +00:00
Thomas Conway
8e4e537a38 These changes have 2 parts:
Estimated hours taken: 3

These changes have 2 parts:
	* Fix a bug in unify_gen triggered by zoltans fix to a
	  bug triggered by dmo's graphics project and add a test
	  case for it.
	* Fix a couple of small bugs in the testing procedures where
	  they required you to have . in your path.


mercury/compiler/code_exprn.m,
mercury/compiler/code_info.m:
	add the predicate
		code_{exprn,info}__materialize_vars_in_rval/5
	which generates code to materialize the vars in an rval and
	updates the exprn info appropriately.
	This predicate was added because it is needed for generating
	the sub-unifications where a deconstruction has assignments
	into the term (ie field(....) = var; rather than the other
	way around).

mercury/compiler/exprn_aux.m:
	export exprn_aux__vars_in_rval.

mercury/compiler/follow_vars.m:
	fix a singleton variable warning.

mercury/compiler/unify_gen.m:
	When generating code to assign into the fields of a term
	within a deconstruction, materialize any variables in the
	the field expression (into which you are going to assign)
	before doing the assignment. Before this fix, the code generator
	was emitting code that contained var(M), which with certain
	combinations of opt flags was causing an abort in llds_out.

tests/runtests:
	tiny bugfix so that runtests works for people who don't have `.'
	in their path.

tests/valid/Mmake:
	enable `two_way_unif' which tests the bugfix in unify_gen shown above

mercury/tools/bootcheck:
	tiny bugfix so that runtests works for people who don't have `.'
	in their path.
1996-11-05 07:10:51 +00:00
Fergus Henderson
5fe0f4f82c A bunch of changes required to fix problems in code generation for
Estimated hours taken: 24

A bunch of changes required to fix problems in code generation for
model_det and model_semi disjunctions.

simplify.m:
	Don't convert all model_det and model_semi disjunctions into
	if-then-elses, because that doesn't work if the disjuncts
	have output variables, which can happen (e.g. with cc_nondet
	disjunctions)

disj_gen.m:
	Fix a bug in the code generation for semidet disjunctions:
	don't forget to jump to the end of the disjunction after
	each disjunct!

liveness.m, live_vars.m, store_alloc.m, disj_gen.m:
	Treat backtracking in model_det and model_semi disjunctions
	as shallow backtracking rather than deep backtracking.
	This means that rather than pushing all live variables
	onto the stack at the start of a model_det/semi disjunction,
	and using the nondet_lives to keep track of them, we instead
	treat these disjunctions a bit more like an if-then-else and
	use the ordinary liveness/deadness to keep track of them.

code_aux.m:
	Change code_aux__pre_goal_update so that it only applies
	the post-deaths if the goal is atomic.  Applying the
	*post*-deaths to the set of live variables in the *pre*-goal
	update only makes sense for atomic goals.
	(I think previously we only ever generated post-deaths
	for atomic goals, but now we generate them also for
	goals inside model_det or model_semi disjunctions.)

code_gen.pp, middle_rec.m:
	Pass an is-atomic flag to code_aux__pre_goal_update.

hlds_goal.m:
	Add some comments.

goal_util.m:
	Fix bugs in goal_util__name_apart_goalinfo.
	It wasn't applying the substitution to all the
	appropriate fields.

code_exprn.m:
	Improve the error message for one of the internal errors.

hlds_out.m:
	Print the stack slot allocations in the HLDS dump again.
1996-10-29 20:10:17 +00:00
Zoltan Somogyi
b3710249de Add some comments about my recent code generation change.
Estimated hours taken: 0.05

code_exprn.m:
	Add some comments about my recent code generation change.
1996-08-04 23:26:24 +00:00
Zoltan Somogyi
40e727614d Add a boolean argument to the create rval, which should be set to true
Estimated hours taken: 2

llds.m:
	Add a boolean argument to the create rval, which should be set to true
	if the cell created must have a unique reference.

vn_type.m:
	Add a corresponding argument to vn_create.

others:
	Fix references to creates and vn_creates.
1996-08-04 23:18:56 +00:00
Zoltan Somogyi
ba3903ff4d Use place_arg instead of construct_code to emit the code for the
Estimated hours taken: 4

code_exprn.m:
	Use place_arg instead of construct_code to emit the code for the
	arguments of creates. This is a win, because construct_code does
	not check whether the value it is constructing is a static term,
	while place_arg does. To enable place_arg to generate good code
	when used like this, it now has an extra argument that allows
	the caller to say where it would like the value to go.
1996-08-03 13:34:01 +00:00
Zoltan Somogyi
99e729814f Make sure we don't change the goal being analyzed except possibly
Estimated hours taken: 20

det_analysis:
	Make sure we don't change the goal being analyzed except possibly
	for the introduction of `some's (which should not hurt anything).

	Make sure we don't print any error messages except in the final
	iteration, when all the inputs to the inference are stable.

	If the --debug-detism options is set, print messages about the
	progress of inference and checking.

	Also moved some code around.

det_report:
	Distinguish the handling of warning messages and error messages.

simplify:
	Use the new ability of det_report to separate warnings and errors.

passes_aux:
	Add a new generic pass form, for use by simplify.

option:
	Add --debug-detism (as above), --aditi, which at the moment
	only enables the disjunctive normal form transformation, and
	--inlining/--no-inlining, which set the other three flags
	involved in inlining depending on whether you want standard
	inlining or none at all.

	Follow_code used to be set twice and follow_vars not at all;
	I fixed this.

	Reenabled optimize_higher_order at -O3.

	Moved value numbering to -O4 and pred_value_number to -O5.
	This makes it easier to separate value numbering from the
	other optimizations (which are likely to be more effective).

	Divided options_help into sections to avoid excessive
	compilation times.

store_alloc:
	Base the store map on the follow_vars info attached to the
	branched structure which I added recently, and not on the
	follow_vars map being passed around, since it will be more accurate.

hlds_out:
	Print information about follow_vars and store_maps when -D is given.

follow_code:
	Undo an old hack that change to follow_vars has made counterproductive.

middle_rec:
	Fix a bug uncovered by the change to follow_code. When looking for a
	register to hold the counter, it is not enough to avoid picking a
	register that appears in the recursive case; we must also avoid
	registers that occur only in the base case.

livemap:
	Mentioning the code address succip now causes the succip to be
	considered live. This may or may not fix the bug with pred_value_number
	miscompiling unused_args.m; the other changes have caused the input
	to value numbering to change, and they no longer trigger the problem.
	(Will try to test this later.)

mercury_compile:
	Try to make sure that we print statistics only after passes that
	were actually executed. Also, reduce the number of lookups of the
	verbose option. Move some predicates so that the order of their
	appearance matches the current order of invocation.

vn_table:
	Loosen a sanity check to let xnuc2 pass through it.

code_exprn, switch_detection:
	Minor changes.
1996-05-10 09:49:17 +00:00
Fergus Henderson
a3b0d22d9f When generating semidet pragma c_codes, make sure to shuffle r1
Estimated hours taken: 6

compiler/{code_gen.pp,code_info.m,code_exprn.m}:
	When generating semidet pragma c_codes, make sure to shuffle r1
	out of the way in case its value is needed after the pragma.
1996-04-30 00:05:51 +00:00
Zoltan Somogyi
477aa2a463 Improve a panic message.
Estimated hours taken: 0.1

code_exprn:
	Improve a panic message.
1996-04-19 11:12:41 +00:00
Fergus Henderson
974d3b9247 Do some more work on improving floating-point performance:
Estimated hours taken: 2

Do some more work on improving floating-point performance:
emit boxed floating point constants as static ground terms.

options.m:
	Add new option --unboxed-float.

exprn_aux.m
	Add --unboxed-float to the `exprn_opts' that affect whether
	or not things can be static constants.  If --unboxed-float
	is not set, and --static-ground-terms is, then consider
	float_consts to be constant.

code_exprn.m, lookup_switch.m:
	Trivial changes to handle new arity of exprn_opts type.

llds.m:
	If --unboxed-float is not set, and --static-ground-terms is, then
	output `static const Float mercury_float_const_...' declarations
	for float_consts.
1996-04-07 07:41:52 +00:00
Zoltan Somogyi
587bf30a5d Avoid creating unecessary shuffling operations.
Estimated hours taken: 1

code_exprn:
	Avoid creating unecessary shuffling operations. Specifically,
	if a register (say r1) is live, and if you want to put a value
	into it, we used to generate a sequence such as:

		r2 = r1;
		r1 = <some rval>;

	Very often the original value of r1 is needed *only* in <some rval>.
	We now generate this bad code as before, but then check whether
	there are any live variables whose values *require* r2 (as opposed
	to having one of their several copies accessible via r2). If not,
	we remove the register copy.

	Most of the work is done by the auxiliary predicates introduced
	in the previous checkin.

	This change reduces the size of the compiler by 65 Kb, almost 3%.
	This is with standard optimization. Since this optimization removes
	code that is also removed by value numbering, any gain in the
	size of fully optimized code will be minimal.
1996-04-05 10:06:05 +00:00
Zoltan Somogyi
c8da041006 Made a start towards getting better code generated for nested creates
Estimated hours taken: 4

code_exprn:
	Made a start towards getting better code generated for nested creates
	and towards getting rid of useless "shuffle lval" instructions.
	Also, some minor cleanup.

exprn_aux:
	Add some auxiliary predicates for the new code_exprn.

delay_info:
	Remove a useless import of hlds, which is now empty.
1996-04-05 08:27:21 +00:00
Zoltan Somogyi
ea15e53e11 Add a couple of auxiliary predicates and use them.
Estimated hours taken: 0.5

code_exprn:
	Add a couple of auxiliary predicates and use them.
1996-04-04 00:06:15 +00:00
Zoltan Somogyi
5724b9bc64 Factor out some more common cases.
Estimated hours taken: 1

code_exprn:
	Factor out some more common cases.

livemap:
	Fix a misleading error message.
1996-04-03 14:18:47 +00:00
Zoltan Somogyi
27b615a71e Factor out some common code, moving it into a predicate.
Estimated hours taken: 0.5

code_exprn:
	Factor out some common code, moving it into a predicate.
1996-04-03 06:48:00 +00:00
Zoltan Somogyi
4808a8dfff A step towards better handling of cell creations.
Estimated hours taken: 0.2

code_exprn:
	A step towards better handling of cell creations.
1996-04-03 00:34:04 +00:00
Zoltan Somogyi
6be6177df5 Distribute the initial comments among the declarations of the exported
Estimated hours taken: 1.5

code_exprn:
	Distribute the initial comments among the declarations of the exported
	predicates. This makes it much less likely that the declarations will
	be modified without changes in the comments. Since this has happened
	in the past, some predicates are now without comments.

	Changed code_exprn__place_var to prefer to get even a constant term
	from a location if it has been produced before, and factor out some
	code that is shared between the handling of cached and evaled
	expressions.

code_exprm, code_info:
	Removed an unnecessary argument from code_exprn__get_varlocs.

dead_proc_elim:
	Changed the predicate name prefix from dead__ to dead_proc_elim__
	to conform to notes/CODING_STANDARDS.

handle_options:
	Remove an inappropriate comment.

jumpopt:
	Filter out redundant livevals whether --optimize-fulljumps is given
	or not. (I thought they aren't created if the option isn't given,
	but they are.)

options:
	Change the meaning of -O from --c-optimize to --opt-level.
	Disabled unused args until the bug is fixed.
1996-03-17 04:21:38 +00:00
Zoltan Somogyi
c70dbe9e2b When we are processing the flushing of create expressions, make sure
Estimated hours taken: 2

code_exprn:
	When we are processing the flushing of create expressions, make sure
	the Lval we are creating into isn't a field reference. This avoids
	deep field of field of field of ... nesting. It does introduce
	references to high register numbers, but this is a lesser evil,
	and Tom and I plan to fix this anyway.

arg_info, globals, options:
	Change --args old to --args simple.

options:
	Make some help messages more specific.

code_aux, code_exprn, code_info, det_report, make_hlds, mercury_to_goedel,
prog_io, typecheck:
	Changes to accommodate the move from varset__lookup_name
	to varset__search_name.
1996-03-12 03:39:13 +00:00
Zoltan Somogyi
b4f71d7b53 Both code_exprn and lookup_switch had code to check whether an
Estimated hours taken: 2

exprn_aux:
	Both code_exprn and lookup_switch had code to check whether an
	expression is constant or not. Some of the code is different
	due to different handling of variables in rvals, but exprn_aux
	now contains the common subset.

	This common subset used to treat some address constants incorrectly,
	simply by not considering them; they are now considered and treated
	properly.

code_exprn, lookup_switch, exprn_aux:
	Remove redundant option lookups in the process of checking for
	constant expressions.

code_exprn:
	Other minor cleanups, including removal of a block of code Tom
	says was "deep magic" (but which turns out to be unnecessary).

code_info:
	Removed some dead code.

options:
	Added real support for --opt-level, in the form of a table of
	default values of options for each optimization level between
	0 and 5 (both inclusive). This needs a new form of documentation.
	How do you do tables in texinfo?
1996-03-11 10:32:20 +00:00
Zoltan Somogyi
e7054745f2 Wrap parentheses around pred insts, since they are needed.
Estimated hours taken: 6

mercury_to_mercury:
	Wrap parentheses around pred insts, since they are needed.

value_number, vn_verify:
	Value numbering now reapplies itself to both halves of a block if
	it cannot optimize the block as a whole.
	Split the verification code into its own module, and fix line lengths.

vn_order:
	Fix the computation of the label at which blocks should be divided.
	Fix line lengths.

vn_debug:
	Add a message to support the new block dividing capability.

code_exprn:
	Redirect option lookup operations from options to getopt.

passes_aux:
	Prepare for some further changes.

prog_io:
	Formatting changes.
1996-03-05 23:55:48 +00:00
Fergus Henderson
6d7f4b9b30 Undo dylan's changes in the names of some library entities,
Estimated hours taken: 1.5

Undo dylan's changes in the names of some library entities,
by applying the following sed script

	s/term_atom/term__atom/g
	s/term_string/term__string/g
	s/term_integer/term__integer/g
	s/term_float/term__float/g
	s/term_context/term__context/g
	s/term_functor/term__functor/g
	s/term_variable/term__variable/g
	s/_term__/_term_/g
	s/std_util__bool_/bool__/g

to all the `.m' and `.pp' files in the compiler and library directories.
The reason for undoing these changes was to minimize incompatibilities
with 0.4 (and besides, the changes were not a really good idea in the first
place).

I also moved `bool' to a separate module.
The main reason for that change is to ensure that the `__' prefix is
only used when it genuinely represents a module qualifier.
(That's what dylan's changes were trying to acheive, but `term__'
does genuinely represent a module qualifier.)

compiler/*.m:
	Apply sed script above;
	where appropriate, add `bool' to the list of imported modules.
1996-02-03 17:30:14 +00:00
Fergus Henderson
e2d7877b0f Improve error message for one of the internal errors.
code_exprn.m:
	Improve error message for one of the internal errors.

det_analysis.m:
	Make sure we don't generated unnecessary nested `some' goals.

prog_io.m, inst_match.m, mode_util.m, mercury_to_mercury.m:
	Add new insts `mostly_unique' and `mostly_clobbered', with
	semantics similar to `unique' and `clobbered', except that
	mostly-unique variables might be needed on backtracking.

unique_modes.m:
	A good start on the code to check that `unique' modes
	are not used for nondet live variables.  Still incomplete,
	but just about all the code is there except the code to
	actually compute the set of nondet live variables as you
	traverse the goal.
1996-01-01 13:19:22 +00:00
Zoltan Somogyi
3224e94532 A new pass to remove unnecessary assignment unifications.
excess:
	A new pass to remove unnecessary assignment unifications.

mercury_compile:
	Call the new excess assignment module.

options:
	Add a new option, excess_assign, to control the new optimization.
	Add another, num-real-regs, to specify how many of r1, r2 etc are
	actually real registers. The default is now set to 5 for kryten;
	later it should be supplied by the mc script, with a value determined
	at configuration time.

tag_switch:
	Use num-real-regs to figure out whether it is likely to be worthwhile
	to eliminate the common subexpression of taking the primary tag of
	a variable. Also fix an old performance bug: the test for when a
	jump table is worthwhile was reversed.

value_number, vn_block:
	Do value numbering on extended basic blocks, not basic blocks.

vn_debug:
	Modify an information message.

labelopt:
	Clean up an export an internal predicate for value numbering. Replace
	bintree_set with set.

middle_rec:
	Prepare for the generalization of middle recursion optimization
	to include predicates with an if-then-else structure.

cse_detection:
	Fix a bug: when hoisting a common desconstruction X = f(Yi), create
	new variables for the Yi. This avoids problems with any of the Yis
	appearing in other branches of the code.

goal_util:
	Add a new predicate for use by cse_detection.

common:
	Fix a bug: recompute instmap deltas, since they may be affected by the
	optimization of common structures.

code_info:
	Make an error message more explicit.

det_analysis:
	Restrict import list to the needed modules.

*.m:
	Import assoc_list.
1995-10-27 09:39:28 +00:00
Fergus Henderson
432eee8f1f Fix singleton variable warnings by deleting useless code.
code_exprn.m, modes.m:
	Fix singleton variable warnings by deleting useless code.

shapes.m, typecheck.m:
	Fix singleton variable warnings by renaming variables so that they
	start with an underscore.

make_hlds.m:
	Pass the context down into transform_goal_2, unravel_unification,
	insert_arg_unifications, and append_arg_unifications, so that
	the goal_info_context in the newly built HLDS is never empty.
	This is needed because the new warn_singletons uses the context,
	so it has to be valid.

unify_proc.m:
	Pass a term__context to unravel_unification (as required by
	above change).

quantification.m:
	Rearrange some comments that got shifted a dozen
	lines from the code they referred to.

vn_util.m:
	Fix omission in Zoltan's changes with `succip(FramePointer)'
	which caused "Software Error: unexpected lval in vn_...".
1995-09-06 17:29:28 +00:00
Fergus Henderson
ce9a5cf7d5 Optimize away unifications with dead variables.
modes.m:
	Optimize away unifications with dead variables.
	(The code generator already does that, but by
	that time we have already allocated unnecessary
	stack slots for them.)

code_exprn.m:
	Avoid generating sequences such as `r2 = r3; r3 = r2;'
	when a register already contains the correct value.
	(This change was in fact at least as much Tom's work as mine.)

store_alloc.m:
	For disjunctions, we only want to allocate registers
	for the variables that are output by the disjunction.
	The inputs should go in framevars, not in registers.
	This avoids much of the register-shuffling
	in the code generated for e.g. list__member(out, in).
	(This change was in fact at least as much Tom's work as mine.)
1995-09-06 11:42:11 +00:00
Zoltan Somogyi
bebe96be34 Look inside blocks introduced by value numbering when looking
frameopt:
	Look inside blocks introduced by value numbering when looking
	restorations of succip.

value_number, opt_util:
	If we are using conservative garbage collection, disable value
	numbering for blocks that allocate more than one cell on the heap.
	This allows value numbering of most blocks to work in the absence
	of -DALL_INTERIOR_POINTERS.

all other source files:
	Clean up "blank" lines that nevertheless contain space or tab
	characters.
1995-08-27 11:10:20 +00:00
Fergus Henderson
62d57a5ab5 Fix bug reported by Dylan: float constants are boxed and thus
code_exprn.m:
	Fix bug reported by Dylan: float constants are boxed and thus
	cannot be considered constant.
1995-07-17 02:46:41 +00:00
Thomas Conway
1b9ff54448 Double bug fix. Static ground terms were not being correctly
code_exprn.m:
	Double bug fix. Static ground terms were not being correctly
	handled. Neither were partially instantiated terms. Both are
	now handled correctly (famous last words, no doubt).

det_analysis.m:
	I thought I'd committed this change at *least* once before
	(though I havn;t checked the revision history). I fixed the
	code generator bug that was causing a commented out section
	to fail. So I've uncommented out that section.
1995-07-14 00:56:26 +00:00
Andrew Bromage
9dddf14a3f OK, finally, everything should be back in order. 1995-07-05 23:38:32 +00:00
Andrew Bromage
fda56846cb With any luck, this should be the call_graph branch successfully
merged.  Do not use --constraint-propagation, because it doesn't
schedule conjunctions properly yet.
1995-07-04 03:15:30 +00:00
Thomas Conway
0dc8ca50d8 Implement an improved method of handling negated contexts.
code*.m & *gen.m:
	Implement an improved method of handling negated contexts.
	The new method avoids saving things onto the stack before
	an if-then-else or negation if it can.
	Also, fix the implementation of nondet if-then-else so that
	it does the soft cut properly.
1995-06-22 23:55:59 +00:00
Thomas Conway
57e3bc01db Fix a bug that was causing the code generator to loose
code_exprn.m:
	Fix a bug that was causing the code generator to loose
	track of how many references there are to a register.
	The bug was what caused incorrect results for one of
	Bart's programs.
1995-04-30 10:12:37 +00:00
Fergus Henderson
ac4f8ba0fb Add copyright messages.
compiler/*:
	Add copyright messages.
	Change all occurences of *.nl in comments to *.m.

compiler/mercury_compile.pp:
	Change the output to the .dep files to use *.m rather than *.nl.
	(NOTE: this means that `mmake' will not work any more if you
	call your files *.nl!!!)
1995-03-30 21:03:41 +00:00
Thomas Conway
215b965214 The interface of set changed slightly.
code_exprn.m, common.m graph_colour.m, quantification.m:
	The interface of set changed slightly.
1995-03-24 09:21:12 +00:00
Thomas Conway
1fd52bc3a5 Fix an overly conservative sanity check.
code_exprn.m
code_info.m:
	Fix an overly conservative sanity check.

mercury_compile.pp
typecheck.m:
	Fix type errors due to the changed implementation of map.
	Possibly these bits of code should be removed or something
	so that map is properly abstract.
1995-03-22 11:40:54 +00:00
Thomas Conway
a0140a10e9 Thread options down into the new part of the code generator
code_exprn.m:
code_info.m:
	Thread options down into the new part of the code generator
	so that it does the right thing with constant expressions.
1995-03-18 09:41:06 +00:00