[m-dev.] for review: clip instmap deltas to typeinfo completed nonlocals

Tyson Dowd trd at cs.mu.OZ.AU
Sun Aug 6 14:43:15 AEST 2000


This change seems to have broken debug grades completely.

lmc r5 -v --grade asm_fast.gc.debug hello.m

% Parsing file `hello' and imported interfaces...
% Module qualifying items...
% done.
% Expanding equivalence types... done.
% Converting parse tree to hlds...
Uncaught exception:
Software Error: map__lookup: key not found
	Key Type: term:var(prog_data:tvar_type)
	Key Functor: var/1
	Value Type: hlds_pred:type_info_locn
Stack dump not available in this grade.

A compiler built from sources before this change works, but after this
change I always get this error.

Could you please look at this, and perhaps back out the change if it
appears it might take a while to fix?

On 30-Jul-2000, Zoltan Somogyi <zs at cs.mu.OZ.AU> wrote:
> For review by anyone.
> 
> If we are using typeinfo liveness, then clip the instmap delta fields in
> goal_infos not to the nonlocals, but to the nonlocals plus the
> type info or typeclass info variables needed to describe the types of the
> nonlocals (this set is now called the "typeinfo completed nonlocals").
> 
> This is necessary for the proper handling of code such as resume_typeinfos.m
> in tests/debugger. This involves a call to a procedure with an existentially
> typed argument, where the returned argument is processed only in ways that do
> not need the typeinfo describing it. The typeinfo therefore used to be local
> to the call binding it. Its binding was therefore not recorded in the instmap
> delta, which in turn meant that in the absence of a value-giving occurrence,
> liveness.m considered it not to be born anywhere. On the other hand, with
> typeinfo liveness, occurrences of the argument are also considered value-using
> occurrences of the typeinfo, so the typeinfo was considered to die at the last
> such occurrence. Therefore the typeinfo died without being born. The current
> code generator is sloppy enough not to mind this, but the upcoming eager code
> generator isn't.
> 
> compiler/hlds_goal.m:
> 	Document the new semantics of instmap_deltas.
> 
> compiler/quantification.m:
> compiler/mode_util.m:
> compiler/modes.m:
> compiler/unique_modes.m:
> 	If typeinfo liveness is set, include the relevant typeinfo variables
> 	in the set of variables the instmap is limited to.
> 
> compiler/modes.m:
> 	Delete some unused predicates.
> 
> compiler/hlds_pred.m:
> 	Centralize the code for (maybe) completing a set of vars with the set
> 	of typeinfo vars describing their types here.
> 
> compiler/call_gen.m:
> compiler/live_vars.m:
> 	Use the central code in hlds_pred.m.
> 
> compiler/accumulator.m:
> compiler/cse_detection.m:
> compiler/follow_code.m:
> compiler/higher_order.m:
> compiler/lambda.m:
> compiler/liveness.m:
> compiler/magic.m:
> compiler/make_hlds.m:
> compiler/mode_info.m:
> compiler/pd_util.m:
> compiler/polymorphism.m:
> compiler/simplify.m:
> compiler/unify_proc.m:
> compiler/unneeded_code.m:
> compiler/unused_args.m:
> 	Call quantification and/or mode_util with the right arguments.
> 	In some cases, introduce field names, predmode declarations and/or
> 	shorter type names to make this change easier.
> 
> 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/include
> cvs diff: Diffing boehm_gc/include/private
> cvs diff: Diffing browser
> cvs diff: Diffing bytecode
> cvs diff: Diffing compiler
> Index: compiler/accumulator.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/accumulator.m,v
> retrieving revision 1.14
> diff -u -b -r1.14 accumulator.m
> --- compiler/accumulator.m	2000/07/27 09:00:56	1.14
> +++ compiler/accumulator.m	2000/07/29 02:08:42
> @@ -1554,7 +1554,9 @@
>  	proc_info_set_varset(OrigProcInfo1, VarSet, OrigProcInfo2),
>  	proc_info_set_vartypes(OrigProcInfo2, VarTypes, OrigProcInfo3),
>  
> -	OrigProcInfo = requantify_procedure(OrigProcInfo3),
> +	module_info_globals(ModuleInfo1, Globals),
> +	body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
> +	OrigProcInfo = requantify_procedure(TypeInfoLiveness, OrigProcInfo3),
>  
>  	update_accumulator_pred(AccPredId, AccProcId, AccGoal,
>  			ModuleInfo1, ModuleInfo).
> @@ -1961,26 +1963,19 @@
>  
>  	proc_info_set_goal(ProcInfo0, AccGoal, ProcInfo),
>  
> +	module_info_globals(ModuleInfo0, Globals),
> +	body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  	module_info_set_pred_proc_info(ModuleInfo0, NewPredId, NewProcId,
> -			PredInfo, requantify_procedure(ProcInfo), ModuleInfo).
> +		PredInfo, requantify_procedure(TypeInfoLiveness, ProcInfo),
> +		ModuleInfo).
>  
>  	%
>  	% Recalculate the non-locals of a procedure.
>  	%
> -:- func requantify_procedure(proc_info) = proc_info.
> +:- func requantify_procedure(bool, proc_info) = proc_info.
>  
> -requantify_procedure(ProcInfo0) = ProcInfo :-
> -	proc_info_headvars(ProcInfo0, HeadVars),
> -	proc_info_vartypes(ProcInfo0, VarTypes0),
> -	proc_info_varset(ProcInfo0, Varset0),
> -	proc_info_goal(ProcInfo0, Goal0),
> -
> -	implicitly_quantify_clause_body(HeadVars, Goal0, Varset0,
> -		VarTypes0, Goal, Varset, VarTypes, _Warnings),
> -
> -	proc_info_set_goal(ProcInfo0, Goal, ProcInfo1),
> -	proc_info_set_varset(ProcInfo1, Varset, ProcInfo2),
> -	proc_info_set_vartypes(ProcInfo2, VarTypes, ProcInfo).
> +requantify_procedure(TypeInfoLiveness, ProcInfo0) = ProcInfo :-
> +	requantify_proc(TypeInfoLiveness, ProcInfo0, ProcInfo).
>  
>  %-----------------------------------------------------------------------------%
>  %-----------------------------------------------------------------------------%
> Index: compiler/call_gen.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/call_gen.m,v
> retrieving revision 1.140
> diff -u -b -r1.140 call_gen.m
> --- compiler/call_gen.m	2000/05/24 07:12:23	1.140
> +++ compiler/call_gen.m	2000/07/28 09:39:37
> @@ -585,16 +585,11 @@
>  	{ set__list_to_set(Variables0, Vars0) },
>  	code_info__get_globals(Globals),
>  	{ body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness) },
> -	( 
> -		{ TypeInfoLiveness = yes }
> -	->
>  		code_info__get_proc_info(ProcInfo),
> -		{ proc_info_get_typeinfo_vars_setwise(ProcInfo, Vars0, 
> -			TypeInfoVars) },
> -		{ set__union(Vars0, TypeInfoVars, Vars1) }
> -	;
> -		{ Vars1 = Vars0 }
> -	),
> +	{ proc_info_vartypes(ProcInfo, VarTypes) },
> +	{ proc_info_typeinfo_varmap(ProcInfo, TVarMap) },
> +	{ proc_info_maybe_complete_with_typeinfo_vars(Vars0, TypeInfoLiveness,
> +		VarTypes, TVarMap, Vars1) },
>  	{ set__difference(Vars1, OutArgs, Vars) },
>  	{ set__to_sorted_list(Vars, Variables) },
>  	call_gen__save_variables_2(Variables, Code).
> Index: compiler/cse_detection.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/cse_detection.m,v
> retrieving revision 1.59
> diff -u -b -r1.59 cse_detection.m
> --- compiler/cse_detection.m	2000/01/13 06:15:15	1.59
> +++ compiler/cse_detection.m	2000/07/29 02:12:57
> @@ -152,9 +152,13 @@
>  		% ModuleInfo should not be changed by detect_cse_in_goal
>  		CseInfo = cse_info(Varset1, VarTypes1, _),
>  		proc_info_headvars(ProcInfo0, HeadVars),
> +		proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
>  
> +		module_info_globals(ModuleInfo0, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  		implicitly_quantify_clause_body(HeadVars, Goal1, Varset1,
> -			VarTypes1, Goal, Varset, VarTypes, _Warnings),
> +			VarTypes1, TVarMap, TypeInfoLiveness,
> +			Goal, Varset, VarTypes, _Warnings),
>  
>  		proc_info_set_goal(ProcInfo0, Goal, ProcInfo1),
>  		proc_info_set_varset(ProcInfo1, Varset, ProcInfo2),
> Index: compiler/deforest.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/deforest.m,v
> retrieving revision 1.12
> diff -u -b -r1.12 deforest.m
> --- compiler/deforest.m	1999/10/25 03:48:42	1.12
> +++ compiler/deforest.m	2000/07/29 02:16:48
> @@ -117,13 +117,17 @@
>  
>  	( { Changed = yes } ->
>  		pd_info_get_module_info(ModuleInfo2),
> -		{ requantify_proc(ProcInfo2, ProcInfo3) },
> +		{ module_info_globals(ModuleInfo2, Globals0) },
> +		{ body_should_use_typeinfo_liveness(Globals0,
> +			TypeInfoLiveness) },
> +		{ requantify_proc(TypeInfoLiveness, ProcInfo2, ProcInfo3) },
>  		{ proc_info_goal(ProcInfo3, Goal3) },
>  		{ proc_info_get_initial_instmap(ProcInfo3,
>  			ModuleInfo2, InstMap0) },
>  		{ proc_info_vartypes(ProcInfo3, VarTypes) },
> -		{ recompute_instmap_delta(yes, Goal3, Goal, 
> -			VarTypes, InstMap0, ModuleInfo2, ModuleInfo3) },
> +		{ proc_info_typeinfo_varmap(ProcInfo3, TVarMap) },
> +		{ recompute_instmap_delta(yes, Goal3, Goal, VarTypes,
> +			TVarMap, InstMap0, ModuleInfo2, ModuleInfo3) },
>  		pd_info_set_module_info(ModuleInfo3),
>  
>  		pd_info_get_pred_info(PredInfo),
> Index: compiler/follow_code.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/follow_code.m,v
> retrieving revision 1.54
> diff -u -b -r1.54 follow_code.m
> --- compiler/follow_code.m	1999/10/25 03:48:48	1.54
> +++ compiler/follow_code.m	2000/07/29 02:19:59
> @@ -1,5 +1,5 @@
>  %-----------------------------------------------------------------------------%
> -% Copyright (C) 1994-1999 The University of Melbourne.
> +% Copyright (C) 1994-2000 The University of Melbourne.
>  % This file may only be copied under the terms of the GNU General
>  % Public License - see the file COPYING in the Mercury distribution.
>  %-----------------------------------------------------------------------------%
> @@ -53,12 +53,15 @@
>  			% we need to fix up the goal_info by recalculating
>  			% the nonlocal vars and the non-atomic instmap deltas.
>  		proc_info_headvars(ProcInfo0, HeadVars),
> +		proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  		implicitly_quantify_clause_body(HeadVars, Goal1,
> -			Varset0, VarTypes0, Goal2, Varset, VarTypes, _Warnings),
> +			Varset0, VarTypes0, TVarMap, TypeInfoLiveness,
> +			Goal2, Varset, VarTypes, _Warnings),
>  		proc_info_get_initial_instmap(ProcInfo0,
>  			ModuleInfo0, InstMap0),
> -		recompute_instmap_delta(no, Goal2, Goal, VarTypes, InstMap0,
> -			ModuleInfo0, ModuleInfo)
> +		recompute_instmap_delta(no, Goal2, Goal, VarTypes, TVarMap,
> +			InstMap0, ModuleInfo0, ModuleInfo)
>  	;
>  		Goal = Goal0,
>  		Varset = Varset0,
> Index: compiler/higher_order.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/higher_order.m,v
> retrieving revision 1.64
> diff -u -b -r1.64 higher_order.m
> --- compiler/higher_order.m	2000/04/11 07:56:56	1.64
> +++ compiler/higher_order.m	2000/07/29 02:20:32
> @@ -387,13 +387,16 @@
>  	Info0 = info(A, B, C, D, E, ProcInfo0, ModuleInfo0, H, Changed),
>  	( (Changed = changed ; MustRecompute = yes) ->
>  		proc_info_set_goal(ProcInfo0, Goal0, ProcInfo1),
> -		requantify_proc(ProcInfo1, ProcInfo2),
> +		module_info_globals(ModuleInfo0, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
> +		requantify_proc(TypeInfoLiveness, ProcInfo1, ProcInfo2),
>  		proc_info_goal(ProcInfo2, Goal2),
>  		RecomputeAtomic = no,
>  		proc_info_get_initial_instmap(ProcInfo2, ModuleInfo0, InstMap),
>  		proc_info_vartypes(ProcInfo2, VarTypes),
> +		proc_info_typeinfo_varmap(ProcInfo2, TVarMap),
>  		recompute_instmap_delta(RecomputeAtomic, Goal2, Goal3,
> -			VarTypes, InstMap, ModuleInfo0, ModuleInfo),
> +			VarTypes, TVarMap, InstMap, ModuleInfo0, ModuleInfo),
>  		proc_info_set_goal(ProcInfo2, Goal3, ProcInfo),
>  		Info = info(A, B, C, D, E, ProcInfo, ModuleInfo, H, Changed)
>  	;
> Index: compiler/hlds_goal.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/hlds_goal.m,v
> retrieving revision 1.72
> diff -u -b -r1.72 hlds_goal.m
> --- compiler/hlds_goal.m	2000/07/25 09:27:20	1.72
> +++ compiler/hlds_goal.m	2000/07/29 03:33:46
> @@ -721,6 +721,13 @@
>  				% unreachability, but both will be
>  				% conservative approximations, so if either
>  				% says a goal is unreachable then it is.
> +				%
> +				% Normally the instmap_delta will list only
> +				% the nonlocal variables of the goal. However,
> +				% with typeinfo liveness, it may also list
> +				% typeinfo or typeclass info variables that
> +				% describe (part of) the type of a nonlocal
> +				% variable.
>  
>  		context :: prog_context,
>  
> Index: compiler/hlds_pred.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/hlds_pred.m,v
> retrieving revision 1.77
> diff -u -b -r1.77 hlds_pred.m
> --- compiler/hlds_pred.m	2000/07/25 09:27:20	1.77
> +++ compiler/hlds_pred.m	2000/07/28 09:44:09
> @@ -1392,10 +1392,15 @@
>  	% for accurate garbage collection - live variables need to have 
>  	% their typeinfos stay live too.
>  
> -:- pred proc_info_get_typeinfo_vars_setwise(proc_info, set(prog_var),
> +:- pred proc_info_get_typeinfo_vars(set(prog_var), vartypes, type_info_varmap,
>  		set(prog_var)).
> -:- mode proc_info_get_typeinfo_vars_setwise(in, in, out) is det.
> +:- mode proc_info_get_typeinfo_vars(in, in, in, out) is det.
>  
> +:- pred proc_info_maybe_complete_with_typeinfo_vars(set(prog_var), bool,
> +	vartypes, type_info_varmap, set(prog_var)).
> +:- mode proc_info_maybe_complete_with_typeinfo_vars(in, in, in, in, out)
> +	is det.
> +
>  :- pred proc_info_ensure_unique_names(proc_info, proc_info).
>  :- mode proc_info_ensure_unique_names(in, out) is det.
>  
> @@ -1681,35 +1686,32 @@
>  proc_info_set_address_taken(ProcInfo, AT, ProcInfo^is_address_taken := AT).
>  proc_info_set_rl_exprn_id(ProcInfo, ID, ProcInfo^maybe_aditi_rl_id := yes(ID)).
>  
> -proc_info_get_typeinfo_vars_setwise(ProcInfo, Vars, TypeInfoVars) :-
> +proc_info_get_typeinfo_vars(Vars, VarTypes, TVarMap, TypeInfoVars) :-
>  	set__to_sorted_list(Vars, VarList),
> -	proc_info_get_typeinfo_vars_2(ProcInfo, VarList, TypeInfoVarList),
> +	proc_info_get_typeinfo_vars_2(VarList, VarTypes, TVarMap,
> +		TypeInfoVarList),
>  	set__list_to_set(TypeInfoVarList, TypeInfoVars).
>  
>  	% auxiliary predicate - traverses variables and builds a list of
>  	% variables that store typeinfos for these variables. 
> -:- pred proc_info_get_typeinfo_vars_2(proc_info, list(prog_var),
> -		list(prog_var)).
> -:- mode proc_info_get_typeinfo_vars_2(in, in, out) is det.
> +:- pred proc_info_get_typeinfo_vars_2(list(prog_var)::in,
> +	vartypes::in, type_info_varmap::in, list(prog_var)::out) is det.
>  
> -proc_info_get_typeinfo_vars_2(_, [], []).
> -proc_info_get_typeinfo_vars_2(ProcInfo, [Var | Vars1], TypeInfoVars) :-
> -	proc_info_vartypes(ProcInfo, VarTypeMap),
> -	( 
> -		map__search(VarTypeMap, Var, Type)
> +proc_info_get_typeinfo_vars_2([], _, _, []).
> +proc_info_get_typeinfo_vars_2([Var | Vars], VarTypes, TVarMap, TypeInfoVars) :-
> +	( map__search(VarTypes, Var, Type)
>  	->
>  		type_util__real_vars(Type, TypeVars),
>  		(
>  			% Optimize common case
>  			TypeVars = []
>  		->
> -			proc_info_get_typeinfo_vars_2(ProcInfo, Vars1, 
> +			proc_info_get_typeinfo_vars_2(Vars, VarTypes, TVarMap,
>  				TypeInfoVars)
>  		;
>  			% XXX It's possible there are some complications with
>  			% higher order pred types here -- if so, maybe
>  			% treat them specially.
> -			proc_info_typeinfo_varmap(ProcInfo, TVarMap),
>  
>  				% The type_info is either stored in a variable,
>  				% or in a typeclass_info. Either get the
> @@ -1722,12 +1724,25 @@
>  				)),
>  			list__map(LookupVar, TypeVars, TypeInfoVars0),
>  
> -			proc_info_get_typeinfo_vars_2(ProcInfo, Vars1,
> +			proc_info_get_typeinfo_vars_2(Vars, VarTypes, TVarMap,
>  				TypeInfoVars1),
> -			list__append(TypeInfoVars0, TypeInfoVars1, TypeInfoVars)
> +			list__append(TypeInfoVars0, TypeInfoVars1,
> +				TypeInfoVars)
>  		)
>  	;
>  		error("proc_info_get_typeinfo_vars_2: var not found in typemap")
> +	).
> +
> +proc_info_maybe_complete_with_typeinfo_vars(Vars0, TypeInfoLiveness,
> +		VarTypes, TVarMap, Vars) :-
> +	(
> +		TypeInfoLiveness = yes,
> +		proc_info_get_typeinfo_vars(Vars0, VarTypes, TVarMap,
> +			TypeInfoVars),
> +		set__union(Vars0, TypeInfoVars, Vars)
> +	;
> +		TypeInfoLiveness = no,
> +		Vars = Vars0
>  	).
>  
>  proc_info_ensure_unique_names(ProcInfo0, ProcInfo) :-
> Index: compiler/lambda.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/lambda.m,v
> retrieving revision 1.62
> diff -u -b -r1.62 lambda.m
> --- compiler/lambda.m	2000/05/22 17:59:31	1.62
> +++ compiler/lambda.m	2000/07/29 02:22:43
> @@ -191,9 +191,11 @@
>  
>  	% check if we need to requantify
>  	( MustRecomputeNonLocals = yes ->
> +		module_info_globals(ModuleInfo, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  		implicitly_quantify_clause_body(HeadVars,
> -			Goal1, VarSet1, VarTypes1, Goal, VarSet, VarTypes,
> -			_Warnings)
> +			Goal1, VarSet1, VarTypes1, TVarMap, TypeInfoLiveness,
> +			Goal, VarSet, VarTypes, _Warnings)
>  	;
>  		Goal = Goal1,
>  		VarSet = VarSet1,
> Index: compiler/live_vars.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/live_vars.m,v
> retrieving revision 1.86
> diff -u -b -r1.86 live_vars.m
> --- compiler/live_vars.m	2000/02/10 04:47:42	1.86
> +++ compiler/live_vars.m	2000/07/28 09:41:18
> @@ -526,9 +526,11 @@
>  	(
>  		TypeInfoLiveness = yes
>  	->
> -		proc_info_get_typeinfo_vars_setwise(ProcInfo, LiveVars1,
> +		proc_info_vartypes(ProcInfo, VarTypes),
> +		proc_info_typeinfo_varmap(ProcInfo, TVarMap),
> +		proc_info_get_typeinfo_vars(LiveVars1, VarTypes, TVarMap,
>  			TypeInfoVarsLive),
> -		proc_info_get_typeinfo_vars_setwise(ProcInfo, OutVars,
> +		proc_info_get_typeinfo_vars(OutVars, VarTypes, TVarMap,
>  			TypeInfoVarsOut),
>  		set__union(LiveVars1, TypeInfoVarsOut, LiveVars2),
>  		set__union(LiveVars2, TypeInfoVarsLive, LiveVars)
> Index: compiler/liveness.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/liveness.m,v
> retrieving revision 1.104
> diff -u -b -r1.104 liveness.m
> --- compiler/liveness.m	2000/07/22 11:32:40	1.104
> +++ compiler/liveness.m	2000/07/29 02:30:12
> @@ -152,11 +152,14 @@
>  :- import_module string.
>  
>  detect_liveness_proc(ProcInfo0, PredId, ModuleInfo, ProcInfo) :-
> -	requantify_proc(ProcInfo0, ProcInfo1),
> +	module_info_globals(ModuleInfo, Globals),
> +	body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness0),
> +	requantify_proc(TypeInfoLiveness0, ProcInfo0, ProcInfo1),
> +
>  	proc_info_goal(ProcInfo1, Goal0),
>  	proc_info_varset(ProcInfo1, Varset),
>  	proc_info_vartypes(ProcInfo1, VarTypes),
> -	module_info_globals(ModuleInfo, Globals),
> +	proc_info_typeinfo_varmap(ProcInfo1, TVarMap),
>  
>  	module_info_pred_info(ModuleInfo, PredId, PredInfo),
>  	pred_info_module(PredInfo, PredModule),
> @@ -168,10 +171,10 @@
>  	->
>  		TypeInfoLiveness = no
>  	;
> -		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness)
> +		TypeInfoLiveness = TypeInfoLiveness0
>  	),
> -	live_info_init(ModuleInfo, ProcInfo1, TypeInfoLiveness,
> -		VarTypes, Varset, LiveInfo),
> +	live_info_init(ModuleInfo, TypeInfoLiveness, VarTypes, TVarMap, Varset,
> +		LiveInfo),
>  
>  	initial_liveness(ProcInfo1, PredId, ModuleInfo, Liveness0),
>  	detect_liveness_in_goal(Goal0, Liveness0, LiveInfo,
> @@ -952,7 +955,7 @@
>  	->
>  		true
>  	;
> -		live_info_get_varset(LiveInfo, Varset),
> +		Varset = LiveInfo^varset,
>  		set__to_sorted_list(LivenessFirst, FirstVarsList),
>  		set__to_sorted_list(LivenessRest, RestVarsList),
>  		list__map(varset__lookup_name(Varset),
> @@ -1009,7 +1012,8 @@
>  		\+ polymorphism__no_type_info_builtin(PredModule,
>  			PredName, PredArity)
>  	->
> -		proc_info_get_typeinfo_vars_setwise(ProcInfo, NonLocals0,
> +		proc_info_typeinfo_varmap(ProcInfo, TVarMap),
> +		proc_info_get_typeinfo_vars(NonLocals0, VarTypes, TVarMap,
>  			TypeInfoNonLocals),
>  		set__union(NonLocals0, TypeInfoNonLocals, NonLocals)
>  	;
> @@ -1056,11 +1060,11 @@
>  
>  		% If doing alternate liveness, the corresponding
>  		% typeinfos need to be added to these.
> -	live_info_get_typeinfo_liveness(LiveInfo, TypeinfoLiveness),
>  	( 
> -		TypeinfoLiveness = yes
> +		LiveInfo^typeinfo_liveness = yes
>  	->
> -		proc_info_get_typeinfo_vars_setwise(ProcInfo, Deadness2,
> +		proc_info_typeinfo_varmap(ProcInfo, TVarMap),
> +		proc_info_get_typeinfo_vars(Deadness2, VarTypes, TVarMap,
>  			TypeInfoVars),
>  		set__union(Deadness2, TypeInfoVars, Deadness)
>  	;
> @@ -1120,11 +1124,11 @@
>  find_value_giving_occurrences([], _, _, ValueVars, ValueVars).
>  find_value_giving_occurrences([Var | Vars], LiveInfo, InstMapDelta,
>  		ValueVars0, ValueVars) :-
> -	live_info_get_var_types(LiveInfo, VarTypes),
> -	live_info_get_module_info(LiveInfo, ModuleInfo),
> +	VarTypes = LiveInfo^vartypes,
>  	map__lookup(VarTypes, Var, Type),
>  	(
>  		instmap_delta_search_var(InstMapDelta, Var, Inst),
> +		ModuleInfo = LiveInfo^module_info,
>  		mode_to_arg_mode(ModuleInfo, (free -> Inst), Type, top_out)
>  	->
>  		set__insert(ValueVars0, Var, ValueVars1)
> @@ -1135,52 +1139,6 @@
>  		ValueVars1, ValueVars).
>  
>  %-----------------------------------------------------------------------------%
> -%-----------------------------------------------------------------------------%
> -
> -:- type live_info	--->	live_info(
> -					module_info,
> -					proc_info,
> -					bool,		% Do we use typeinfo
> -							% liveness for this
> -							% proc?
> -					map(prog_var, type),
> -					prog_varset
> -				).
> -
> -:- pred live_info_init(module_info, proc_info, bool, map(prog_var, type),
> -	prog_varset, live_info).
> -:- mode live_info_init(in, in, in, in, in, out) is det.
> -
> -live_info_init(ModuleInfo, ProcInfo, TypeInfoLiveness, VarTypes, Varset,
> -	live_info(ModuleInfo, ProcInfo, TypeInfoLiveness, VarTypes, Varset)).
> -
> -:- pred live_info_get_module_info(live_info, module_info).
> -:- mode live_info_get_module_info(in, out) is det.
> -
> -live_info_get_module_info(live_info(ModuleInfo, _, _, _, _), ModuleInfo).
> -
> -:- pred live_info_get_proc_info(live_info, proc_info).
> -:- mode live_info_get_proc_info(in, out) is det.
> -
> -live_info_get_proc_info(live_info(_, ProcInfo, _, _, _), ProcInfo).
> -
> -:- pred live_info_get_typeinfo_liveness(live_info, bool).
> -:- mode live_info_get_typeinfo_liveness(in, out) is det.
> -
> -live_info_get_typeinfo_liveness(live_info(_, _, TypeInfoLiveness, _, _),
> -	TypeInfoLiveness).
> -
> -:- pred live_info_get_var_types(live_info, map(prog_var, type)).
> -:- mode live_info_get_var_types(in, out) is det.
> -
> -live_info_get_var_types(live_info(_, _, _, VarTypes, _), VarTypes).
> -
> -:- pred live_info_get_varset(live_info, prog_varset).
> -:- mode live_info_get_varset(in, out) is det.
> -
> -live_info_get_varset(live_info(_, _, _, _, Varset), Varset).
> -
> -%-----------------------------------------------------------------------------%
>  
>  	% Get the nonlocals, and, if doing alternate liveness, add the
>  	% typeinfo vars for the nonlocals.
> @@ -1198,14 +1156,26 @@
>  	set(prog_var)::in, set(prog_var)::out) is det.
>  
>  liveness__maybe_complete_with_typeinfos(LiveInfo, Vars0, Vars) :-
> -	live_info_get_typeinfo_liveness(LiveInfo, TypeinfoLiveness),
> -	( TypeinfoLiveness = yes ->
> -		live_info_get_proc_info(LiveInfo, ProcInfo),
> -		proc_info_get_typeinfo_vars_setwise(ProcInfo, Vars0,
> -			TypeInfoVars),
> -		set__union(Vars0, TypeInfoVars, Vars)
> -	;
> -		Vars = Vars0
> +	proc_info_maybe_complete_with_typeinfo_vars(Vars0,
> +		LiveInfo^typeinfo_liveness, LiveInfo^vartypes,
> +		LiveInfo^type_info_varmap, Vars).
> +
> +%-----------------------------------------------------------------------------%
> +%-----------------------------------------------------------------------------%
> +
> +:- type live_info
> +	--->	live_info(
> +			module_info		::	module_info,
> +			typeinfo_liveness	::	bool,
> +			vartypes		::	vartypes,
> +			type_info_varmap	::	type_info_varmap,
> +			varset			::	prog_varset
>  	).
> +
> +:- pred live_info_init(module_info::in, bool::in, vartypes::in,
> +	type_info_varmap::in, prog_varset::in, live_info::out) is det.
> +
> +live_info_init(ModuleInfo, ProcInfo, TypeInfoLiveness, VarTypes, Varset,
> +	live_info(ModuleInfo, ProcInfo, TypeInfoLiveness, VarTypes, Varset)).
>  
>  %-----------------------------------------------------------------------------%
> Index: compiler/magic.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/magic.m,v
> retrieving revision 1.19
> diff -u -b -r1.19 magic.m
> --- compiler/magic.m	2000/05/26 08:14:42	1.19
> +++ compiler/magic.m	2000/07/29 02:25:33
> @@ -276,7 +276,9 @@
>  
>  		% Requantify the goal to rename apart the variables
>  		% in the copies of the condition.
> -		requantify_proc(ProcInfo1, ProcInfo3),
> +		module_info_globals(ModuleInfo0, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
> +		requantify_proc(TypeInfoLiveness, ProcInfo1, ProcInfo3),
>  		ModuleInfo1 = ModuleInfo0
>  	; Goal0 = switch(Var, _Canfail, Cases, _SM) - GoalInfo ->
>  		proc_info_varset(ProcInfo0, VarSet0),
> Index: compiler/make_hlds.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/make_hlds.m,v
> retrieving revision 1.338
> diff -u -b -r1.338 make_hlds.m
> --- compiler/make_hlds.m	2000/07/20 11:24:03	1.338
> +++ compiler/make_hlds.m	2000/07/29 02:30:22
> @@ -4980,9 +4980,17 @@
>  			HldsGoal1, VarSet2, transform_info(ModuleInfo0, Info0),
>  				transform_info(ModuleInfo, Info)),
>  		{
> -		map__init(Empty),
> +		map__init(EmptyVarTypes),
> +			% Since the we haven't done mode analysis yet, the
> +			% instmap_delta fields in goal_infos are not yet
> +			% meaningful. Therefore there no point in clipping
> +			% them to the set of typeinfo-liveness-completed
> +			% nonlocals.
> +		map__init(EmptyTVarMap),
> +		TypeInfoLiveness = no,
>  		implicitly_quantify_clause_body(HeadVars, HldsGoal1,
> -			VarSet2, Empty, HldsGoal, VarSet, _, _Warnings),
> +			VarSet2, EmptyVarTypes, EmptyTVarMap, TypeInfoLiveness,
> +			HldsGoal, VarSet, _, _Warnings),
>  		NewClause = clause([ModeId], HldsGoal, Context),
>  		ClausesInfo =  clauses_info(VarSet, VarTypes, VarTypes1,
>  			HeadVars, [NewClause|ClauseList],
> @@ -5021,7 +5029,6 @@
>  		Arity, IsAssertion, Goal, VarSet, Warnings, Info0, Info) -->
>  	transform_goal(Body, VarSet0, Subst, Goal1, VarSet1, Info0, Info1),
>  	{ term__apply_substitution_to_list(Args0, Subst, Args) },
> -	{ map__init(Empty) },
>  		
>  		% The head variables of an assertion will always be
>  		% variables, so it is unnecessary to insert unifications.
> @@ -5036,7 +5043,16 @@
>  		insert_arg_unifications(HeadVars, Args, Context, ArgContext,
>  			no, Goal1, VarSet1, Goal2, VarSet2, Info1, Info)
>  	),
> -	{ implicitly_quantify_clause_body(HeadVars, Goal2, VarSet2, Empty,
> +	{ map__init(EmptyVarTypes) },
> +		% Since the we haven't done mode analysis yet, the
> +		% instmap_delta fields in goal_infos are not yet
> +		% meaningful. Therefore there no point in clipping
> +		% them to the set of typeinfo-liveness-completed
> +		% nonlocals.
> +	{ map__init(EmptyTVarMap) },
> +	{ TypeInfoLiveness = no },
> +	{ implicitly_quantify_clause_body(HeadVars, Goal2, VarSet2,
> +		EmptyVarTypes, EmptyTVarMap, TypeInfoLiveness,
>  				Goal, VarSet, _, Warnings) }.
>  
>  %-----------------------------------------------------------------------------%
> Index: compiler/mode_info.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/mode_info.m,v
> retrieving revision 1.52
> diff -u -b -r1.52 mode_info.m
> --- compiler/mode_info.m	2000/07/28 01:52:41	1.52
> +++ compiler/mode_info.m	2000/07/28 09:34:49
> @@ -275,6 +275,23 @@
>  :- mode mode_info_set_checking_extra_goals(in,
>  		mode_info_di, mode_info_uo) is det.
>  
> +:- pred mode_info_get_typeinfo_liveness(mode_info, bool).
> +:- mode mode_info_get_typeinfo_liveness(mode_info_no_io, out) is det.
> +
> +:- pred mode_info_get_completed_nonlocals_base(hlds_goal_info,
> +		vartypes, type_info_varmap, bool, set(prog_var)).
> +:- mode mode_info_get_completed_nonlocals_base(in, in, in, in, out) is det.
> +
> +:- pred mode_info_get_completed_nonlocals(hlds_goal_info, set(prog_var),
> +		mode_info, mode_info).
> +:- mode mode_info_get_completed_nonlocals(in, out,
> +		mode_info_di, mode_info_uo) is det.
> +
> +:- pred mode_info_get_goal_completed_nonlocals(hlds_goal, set(prog_var),
> +		mode_info, mode_info).
> +:- mode mode_info_get_goal_completed_nonlocals(in, out,
> +		mode_info_di, mode_info_uo) is det.
> +
>  	% Find the simple_call_id to use in error messages
>  	% for the given pred_id.
>  :- pred mode_info_get_call_id(mode_info, pred_id, simple_call_id).
> @@ -333,7 +350,7 @@
>  
>  :- implementation.
>  
> -:- import_module delay_info, mode_errors, mode_util.
> +:- import_module delay_info, mode_errors, mode_util, globals.
>  :- import_module term, varset.
>  :- import_module require, std_util, queue.
>  
> @@ -345,7 +362,7 @@
>  			procid :: proc_id,	% The mode which we are checking
>  			varset :: prog_varset,	
>  					% The variables in the current proc
> -			var_types :: map(prog_var, type),
> +			var_types :: vartypes,
>  					% The types of the variables
>  			context :: prog_context,
>  					% The line number of the subgoal we
> @@ -414,7 +431,7 @@
>  					% to change which procedure
>  					% is called?
>  
> -			checking_extra_goals :: bool
> +			checking_extra_goals :: bool,
>  					% Are we rechecking a goal after
>  					% introducing unifications for
>  					% complicated sub-unifications
> @@ -422,6 +439,9 @@
>  					% If so, redoing the mode check
>  					% should not introduce more
>  					% extra unifications.
> +
> +			typeinfo_liveness :: bool,
> +			type_info_varmap :: type_info_varmap
>  		).
>  
>  	% The normal inst of a mode_info struct: ground, with
> @@ -445,19 +465,23 @@
>  	map__lookup(Procs, ProcId, ProcInfo),
>  	proc_info_varset(ProcInfo, VarSet),
>  	proc_info_vartypes(ProcInfo, VarTypes),
> +	proc_info_typeinfo_varmap(ProcInfo, TVarMap),
>  
>  	LiveVarsList = [LiveVars],
>  	NondetLiveVarsList = [LiveVars],
>  
>  	Changed = no,
> -
>  	CheckingExtraGoals = no,
>  
> +	module_info_globals(ModuleInfo, Globals),
> +	body_should_use_typeinfo_liveness(Globals, TypeinfoLiveness),
> +
>  	ModeInfo = mode_info(
>  		IOState, ModuleInfo, PredId, ProcId, VarSet, VarTypes,
>  		Context, ModeContext, InstMapping0, LockedVars, DelayInfo,
>  		ErrorList, LiveVarsList, NondetLiveVarsList, [], [],
> -		Changed, HowToCheck, MayChangeProc, CheckingExtraGoals
> +		Changed, HowToCheck, MayChangeProc, CheckingExtraGoals,
> +		TypeinfoLiveness, TVarMap
>  	).
>  
>  %-----------------------------------------------------------------------------%
> @@ -468,79 +492,57 @@
>  	% XXX
>  	unsafe_promise_unique(ModeInfo^io_state, IOState).
>  
> -%-----------------------------------------------------------------------------%
> -
>  mode_info_set_io_state(ModeInfo, IOState0, ModeInfo^io_state := IOState) :-
>  	% XXX
>  	unsafe_promise_unique(IOState0, IOState).
>  
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_module_info(ModeInfo, ModeInfo^module_info).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_set_module_info(ModeInfo, ModuleInfo,
> -		ModeInfo^module_info := ModuleInfo).
> -
> -%-----------------------------------------------------------------------------%
> -
>  mode_info_get_preds(ModeInfo, Preds) :-
>  	module_info_preds(ModeInfo^module_info, Preds).
>  
> -%-----------------------------------------------------------------------------%
> -
>  mode_info_get_modes(ModeInfo, Modes) :-
>  	module_info_modes(ModeInfo^module_info, Modes).
>  
> -%-----------------------------------------------------------------------------%
> -
>  mode_info_get_insts(ModeInfo, Insts) :-
>  	module_info_insts(ModeInfo^module_info, Insts).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_predid(ModeInfo, ModeInfo^predid).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_procid(ModeInfo, ModeInfo^procid).
>  
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_varset(ModeInfo, ModeInfo^varset).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_set_varset(VarSet) -->
> -	^varset := VarSet.
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_var_types(ModeInfo, ModeInfo^var_types).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_set_var_types(VTypes) -->
> -	^var_types := VTypes.
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_context(ModeInfo, ModeInfo^context).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_set_context(Context) -->
> -	^context := Context.
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_mode_context(ModeInfo, ModeInfo^mode_context).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_set_mode_context(ModeContext) -->
> -	^mode_context := ModeContext.
> +mode_info_get_module_info(MI, MI^module_info).
> +mode_info_get_predid(MI, MI^predid).
> +mode_info_get_procid(MI, MI^procid).
> +mode_info_get_varset(MI, MI^varset).
> +mode_info_get_var_types(MI, MI^var_types).
> +mode_info_get_context(MI, MI^context).
> +mode_info_get_mode_context(MI, MI^mode_context).
> +mode_info_get_instmap(MI, MI^instmap).
> +mode_info_get_locked_vars(MI, MI^locked_vars).
> +mode_info_get_errors(MI, MI^errors).
> +mode_info_get_delay_info(MI, MI^delay_info).
> +mode_info_get_live_vars(MI, MI^live_vars).
> +mode_info_get_nondet_live_vars(MI, MI^nondet_live_vars).
> +mode_info_get_last_checkpoint_insts(MI, MI^last_checkpoint_insts).
> +mode_info_get_parallel_vars(PVars) --> PVars =^ parallel_vars.
> +mode_info_get_changed_flag(MI, MI^changed_flag).
> +mode_info_get_how_to_check(MI, MI^how_to_check).
> +mode_info_get_may_change_called_proc(MI, MI^may_change_called_proc).
> +mode_info_get_typeinfo_liveness(MI, MI^typeinfo_liveness).
> +
> +mode_info_set_module_info(MI, ModuleInfo, MI^module_info := ModuleInfo).
> +mode_info_set_varset(VarSet) --> ^varset := VarSet.
> +mode_info_set_var_types(VTypes) --> ^var_types := VTypes.
> +mode_info_set_context(Context) --> ^context := Context.
> +mode_info_set_mode_context(ModeContext) --> ^mode_context := ModeContext.
> +mode_info_set_locked_vars(MI, LockedVars, MI^locked_vars := LockedVars).
> +mode_info_set_errors(Errors) --> ^errors := Errors.
> +mode_info_set_delay_info(DelayInfo) --> ^delay_info := DelayInfo.
> +mode_info_set_live_vars(LiveVarsList) --> ^live_vars := LiveVarsList.
> +mode_info_set_nondet_live_vars(NondetLiveVars) -->
> +	^nondet_live_vars := NondetLiveVars.
> +mode_info_set_last_checkpoint_insts(LastCheckpointInsts) -->
> +	^last_checkpoint_insts := LastCheckpointInsts.
> +mode_info_set_parallel_vars(PVars) --> ^parallel_vars := PVars.
> +mode_info_set_changed_flag(Changed) --> ^changed_flag := Changed.
> +mode_info_set_how_to_check(How) --> ^how_to_check := How.
> +mode_info_set_may_change_called_proc(MayChange) -->
> +	^may_change_called_proc := MayChange.
>  
>  %-----------------------------------------------------------------------------%
>  
> @@ -568,8 +570,6 @@
>  
>  %-----------------------------------------------------------------------------%
>  
> -mode_info_get_instmap(ModeInfo, ModeInfo^instmap).
> -
>  	% mode_info_dcg_get_instmap/3 is the same as mode_info_get_instmap/2
>  	% except that it's easier to use inside a DCG.
>  
> @@ -594,29 +594,11 @@
>  
>  %-----------------------------------------------------------------------------%
>  
> -mode_info_get_locked_vars(ModeInfo, ModeInfo^locked_vars).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_set_locked_vars(ModeInfo, LockedVars,
> -		ModeInfo^locked_vars := LockedVars).
> -
> -%-----------------------------------------------------------------------------%
> -
> -mode_info_get_errors(ModeInfo, ModeInfo^errors).
> -
> -%-----------------------------------------------------------------------------%
> -
>  mode_info_get_num_errors(ModeInfo, NumErrors) :-
>  	list__length(ModeInfo^errors, NumErrors).
>  
>  %-----------------------------------------------------------------------------%
>  
> -mode_info_set_errors(Errors) -->
> -	^errors := Errors.
> -
> -%-----------------------------------------------------------------------------%
> -
>  	% We keep track of the live variables and the nondet-live variables
>  	% a bag, represented as a list of sets of vars.
>  	% This allows us to easily add and remove sets of variables.
> @@ -698,11 +680,6 @@
>  	set__union(LiveVars0, LiveVarsSet, LiveVars1),
>  	mode_info_get_liveness_2(LiveVarsList, LiveVars1, LiveVars).
>  
> -mode_info_get_live_vars(ModeInfo, ModeInfo^live_vars).
> -
> -mode_info_set_live_vars(LiveVarsList) -->
> -	^live_vars := LiveVarsList.
> -
>  %-----------------------------------------------------------------------------%
>  
>  	% Since we don't yet handle polymorphic modes, the inst varset
> @@ -754,43 +731,6 @@
>  		mode_info_var_is_locked_2(Sets, Var, Reason)
>  	).
>  
> -mode_info_get_delay_info(ModeInfo, ModeInfo^delay_info).
> -
> -mode_info_set_delay_info(DelayInfo) -->
> -	^delay_info := DelayInfo.
> -
> -mode_info_get_nondet_live_vars(ModeInfo, ModeInfo^nondet_live_vars).
> -
> -mode_info_set_nondet_live_vars(NondetLiveVars) -->
> -	^nondet_live_vars := NondetLiveVars.
> -
> -mode_info_get_last_checkpoint_insts(ModeInfo, ModeInfo^last_checkpoint_insts).
> -
> -mode_info_set_last_checkpoint_insts(LastCheckpointInsts) -->
> -	^last_checkpoint_insts := LastCheckpointInsts.
> -
> -mode_info_get_parallel_vars(PVars) -->
> -	PVars =^ parallel_vars.
> -
> -mode_info_set_parallel_vars(PVars) -->
> -	^parallel_vars := PVars.
> -
> -mode_info_get_changed_flag(ModeInfo, ModeInfo^changed_flag).
> -
> -mode_info_set_changed_flag(Changed) -->
> -	^changed_flag := Changed.
> -
> -mode_info_get_how_to_check(ModeInfo, ModeInfo^how_to_check).
> -
> -mode_info_set_how_to_check(How) -->
> -	^how_to_check := How.
> -
> -mode_info_get_may_change_called_proc(ModeInfo,
> -		ModeInfo^may_change_called_proc).
> -
> -mode_info_set_may_change_called_proc(MayChange) -->
> -	^may_change_called_proc := MayChange.
> -
>  mode_info_set_checking_extra_goals(Checking) -->
>  	( yes =^ checking_extra_goals, { Checking = yes } ->
>  		% This should never happen - once the extra goals are
> @@ -823,4 +763,27 @@
>          mode_info_set_errors(Errors, ModeInfo0, ModeInfo).
>  
>  %-----------------------------------------------------------------------------%
> +
> +mode_info_get_completed_nonlocals_base(GoalInfo, VarTypes, TVarMap,
> +		TypeinfoLiveness, CompletedNonlocals) :-
> +	goal_info_get_nonlocals(GoalInfo, NonLocals),
> +	(
> +		TypeinfoLiveness = yes,
> +		proc_info_get_typeinfo_vars(NonLocals, VarTypes, TVarMap,
> +			TypeInfoVars),
> +		set__union(NonLocals, TypeInfoVars, CompletedNonlocals)
> +	;
> +		TypeinfoLiveness = no,
> +		CompletedNonlocals = NonLocals
> +	).
> +
> +mode_info_get_completed_nonlocals(GoalInfo, CompletedNonlocals,
> +		ModeInfo, ModeInfo) :-
> +	mode_info_get_completed_nonlocals_base(GoalInfo,
> +		ModeInfo^var_types, ModeInfo^type_info_varmap,
> +		ModeInfo^typeinfo_liveness, CompletedNonlocals).
> +
> +mode_info_get_goal_completed_nonlocals(_ - GoalInfo, CompletedNonlocals) -->
> +	mode_info_get_completed_nonlocals(GoalInfo, CompletedNonlocals).
> +
>  %-----------------------------------------------------------------------------%
> Index: compiler/mode_util.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/mode_util.m,v
> retrieving revision 1.123
> diff -u -b -r1.123 mode_util.m
> --- compiler/mode_util.m	2000/05/05 06:07:47	1.123
> +++ compiler/mode_util.m	2000/07/28 09:56:10
> @@ -116,9 +116,9 @@
>  				module_info, module_info).
>  :- mode recompute_instmap_delta_proc(in, in, out, in, out) is det.
>  
> -:- pred recompute_instmap_delta(bool, hlds_goal, hlds_goal, vartypes, instmap,
> -				module_info, module_info).
> -:- mode recompute_instmap_delta(in, in, out, in, in, in, out) is det.
> +:- pred recompute_instmap_delta(bool, hlds_goal, hlds_goal, vartypes,
> +		type_info_varmap, instmap, module_info, module_info).
> +:- mode recompute_instmap_delta(in, in, out, in, in, in, in, out) is det.
>  
>  	% Given corresponding lists of types and modes, produce a new
>  	% list of modes which includes the information provided by the
> @@ -197,9 +197,9 @@
>  %-----------------------------------------------------------------------------%
>  
>  :- implementation.
> -:- import_module require, int, map, set, std_util, assoc_list.
> -:- import_module prog_util, prog_io, type_util.
> -:- import_module inst_match, inst_util, term.
> +:- import_module prog_util, prog_io, type_util, globals.
> +:- import_module inst_match, inst_util, mode_info.
> +:- import_module require, int, map, set, term, std_util, assoc_list.
>  
>  %-----------------------------------------------------------------------------%
>  
> @@ -1108,21 +1108,31 @@
>  	=(ModuleInfo0),
>  	{ proc_info_get_initial_instmap(ProcInfo0, ModuleInfo0, InstMap0) },
>  	{ proc_info_vartypes(ProcInfo0, VarTypes) },
> +	{ proc_info_typeinfo_varmap(ProcInfo0, TVarMap) },
>  	{ proc_info_goal(ProcInfo0, Goal0) },
> +	{ module_info_globals(ModuleInfo0, Globals) },
> +	{ body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness) },
>  	recompute_instmap_delta(RecomputeAtomic, Goal0, Goal,
> -		VarTypes, InstMap0),
> +		VarTypes, TVarMap, InstMap0, TypeInfoLiveness, _),
>  	{ proc_info_set_goal(ProcInfo0, Goal, ProcInfo) }.
>  
> -recompute_instmap_delta(RecomputeAtomic, Goal0, Goal, VarTypes, InstMap0) -->
> +recompute_instmap_delta(RecomputeAtomic, Goal0, Goal, VarTypes, TVarMap,
> +		InstMap0) -->
> +	=(ModuleInfo0),
> +	{ module_info_globals(ModuleInfo0, Globals) },
> +	{ body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness) },
>  	recompute_instmap_delta(RecomputeAtomic, Goal0, Goal, VarTypes,
> -		InstMap0, _).
> +		TVarMap, InstMap0, TypeInfoLiveness, _).
>  
> -:- pred recompute_instmap_delta(bool, hlds_goal, hlds_goal, vartypes, instmap,
> -		instmap_delta, module_info, module_info).
> -:- mode recompute_instmap_delta(in, in, out, in, in, out, in, out) is det.
> +:- pred recompute_instmap_delta(bool, hlds_goal, hlds_goal, vartypes,
> +		type_info_varmap, instmap, bool, instmap_delta,
> +		module_info, module_info).
> +:- mode recompute_instmap_delta(in, in, out, in, in, in, in, out, in, out)
> +		is det.
>  
>  recompute_instmap_delta(RecomputeAtomic, Goal0 - GoalInfo0, Goal - GoalInfo,
> -		VarTypes, InstMap0, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap0, TypeInfoLiveness, InstMapDelta)
> +		-->
>  	( 
>  		{ RecomputeAtomic = no },
>  		( 
> @@ -1137,8 +1147,10 @@
>  		{ GoalInfo1 = GoalInfo0 }
>  	;
>  		recompute_instmap_delta_2(RecomputeAtomic, Goal0,
> -			 GoalInfo0, Goal, VarTypes, InstMap0, InstMapDelta0),
> -		{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +			 GoalInfo0, Goal, VarTypes, TVarMap, InstMap0,
> +			 TypeInfoLiveness, InstMapDelta0),
> +		{ mode_info_get_completed_nonlocals_base(GoalInfo0,
> +			VarTypes, TVarMap, TypeInfoLiveness, NonLocals) },
>  		{ instmap_delta_restrict(InstMapDelta0,
>  			NonLocals, InstMapDelta1) },
>  		{ goal_info_set_instmap_delta(GoalInfo0,
> @@ -1156,72 +1168,88 @@
>  	{ goal_info_get_instmap_delta(GoalInfo, InstMapDelta) }.
>  
>  :- pred recompute_instmap_delta_2(bool, hlds_goal_expr, hlds_goal_info,
> -		hlds_goal_expr, vartypes, instmap, instmap_delta,
> -		module_info, module_info).
> -:- mode recompute_instmap_delta_2(in, in, in, out, in, in, out, in, out) is det.
> +		hlds_goal_expr, vartypes, type_info_varmap, instmap, bool,
> +		instmap_delta, module_info, module_info).
> +:- mode recompute_instmap_delta_2(in, in, in, out, in, in, in, in, out,
> +		in, out) is det.
>  
>  recompute_instmap_delta_2(Atomic, switch(Var, Det, Cases0, SM), GoalInfo,
> -		switch(Var, Det, Cases, SM), VarTypes, InstMap,
> -		InstMapDelta) -->
> -	{ goal_info_get_nonlocals(GoalInfo, NonLocals) },
> +		switch(Var, Det, Cases, SM), VarTypes, TVarMap, InstMap,
> +		TypeInfoLiveness, InstMapDelta) -->
> +	{ mode_info_get_completed_nonlocals_base(GoalInfo,
> +		VarTypes, TVarMap, TypeInfoLiveness, NonLocals) },
>  	recompute_instmap_delta_cases(Atomic, Var, Cases0, Cases,
> -		VarTypes, InstMap, NonLocals, InstMapDelta).
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta).
>  
>  recompute_instmap_delta_2(Atomic, conj(Goals0), _, conj(Goals),
> -		VarTypes, InstMap, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap, TypeInfoLiveness, InstMapDelta) -->
>  	recompute_instmap_delta_conj(Atomic, Goals0, Goals,
> -		VarTypes, InstMap, InstMapDelta).
> +		VarTypes, TVarMap, InstMap, TypeInfoLiveness, InstMapDelta).
>  
>  recompute_instmap_delta_2(Atomic, par_conj(Goals0, SM), GoalInfo,
> -		par_conj(Goals, SM), VarTypes, InstMap, InstMapDelta) -->
> -	{ goal_info_get_nonlocals(GoalInfo, NonLocals) },
> +		par_conj(Goals, SM), VarTypes, TVarMap, InstMap,
> +		TypeInfoLiveness, InstMapDelta) -->
> +	{ mode_info_get_completed_nonlocals_base(GoalInfo,
> +		VarTypes, TVarMap, TypeInfoLiveness, NonLocals) },
>  	recompute_instmap_delta_par_conj(Atomic, Goals0, Goals,
> -		VarTypes, InstMap, NonLocals, InstMapDelta).
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta).
>  
>  recompute_instmap_delta_2(Atomic, disj(Goals0, SM), GoalInfo, disj(Goals, SM),
> -		VarTypes, InstMap, InstMapDelta) -->
> -	{ goal_info_get_nonlocals(GoalInfo, NonLocals) },
> +		VarTypes, TVarMap, InstMap, TypeInfoLiveness, InstMapDelta)
> +		-->
> +	{ mode_info_get_completed_nonlocals_base(GoalInfo,
> +		VarTypes, TVarMap, TypeInfoLiveness, NonLocals) },
>  	recompute_instmap_delta_disj(Atomic, Goals0, Goals,
> -		VarTypes, InstMap, NonLocals, InstMapDelta).
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta).
>  
>  recompute_instmap_delta_2(Atomic, not(Goal0), _, not(Goal),
> -		VarTypes, InstMap, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap, TypeInfoLiveness, InstMapDelta) -->
>  	{ instmap_delta_init_reachable(InstMapDelta) },
> -	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, InstMap).
> +	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, TVarMap,
> +		InstMap, TypeInfoLiveness, _).
>  
>  recompute_instmap_delta_2(Atomic, if_then_else(Vars, A0, B0, C0, SM), GoalInfo,
> -		if_then_else(Vars, A, B, C, SM), VarTypes, InstMap0, InstMapDelta) -->
> -	recompute_instmap_delta(Atomic, A0, A, VarTypes, InstMap0, InstMapDelta1),
> +		if_then_else(Vars, A, B, C, SM), VarTypes, TVarMap, InstMap0,
> +		TypeInfoLiveness, InstMapDelta) -->
> +	recompute_instmap_delta(Atomic, A0, A, VarTypes, TVarMap, InstMap0,
> +		TypeInfoLiveness, InstMapDelta1),
>  	{ instmap__apply_instmap_delta(InstMap0, InstMapDelta1, InstMap1) },
> -	recompute_instmap_delta(Atomic, B0, B, VarTypes, InstMap1, InstMapDelta2),
> -	recompute_instmap_delta(Atomic, C0, C, VarTypes, InstMap0, InstMapDelta3),
> +	recompute_instmap_delta(Atomic, B0, B, VarTypes, TVarMap, InstMap1,
> +		TypeInfoLiveness, InstMapDelta2),
> +	recompute_instmap_delta(Atomic, C0, C, VarTypes, TVarMap, InstMap0,
> +		TypeInfoLiveness, InstMapDelta3),
>  	{ instmap_delta_apply_instmap_delta(InstMapDelta1, InstMapDelta2,
>  		InstMapDelta4) },
> -	{ goal_info_get_nonlocals(GoalInfo, NonLocals) },
> +	{ mode_info_get_completed_nonlocals_base(GoalInfo,
> +		VarTypes, TVarMap, TypeInfoLiveness, NonLocals) },
>  	merge_instmap_delta(InstMap0, NonLocals, InstMapDelta3,
>  		InstMapDelta4, InstMapDelta).
>  
>  recompute_instmap_delta_2(Atomic, some(Vars, CanRemove, Goal0), _,
> -		some(Vars, CanRemove, Goal),
> -		VarTypes, InstMap, InstMapDelta) -->
> -	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, InstMap, InstMapDelta).
> +		some(Vars, CanRemove, Goal), VarTypes, TVarMap, InstMap,
> +		TypeInfoLiveness, InstMapDelta) -->
> +	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, TVarMap,
> +		InstMap, TypeInfoLiveness, InstMapDelta).
>  
>  recompute_instmap_delta_2(_, generic_call(A, Vars, Modes, D), _,
> -		generic_call(A, Vars, Modes, D),
> -		_VarTypes, _InstMap, InstMapDelta) -->
> +		generic_call(A, Vars, Modes, D), _VarTypes, _TVarMap, _InstMap,
> +		_TypeInfoLiveness, InstMapDelta) -->
>  	=(ModuleInfo),
>  	{ instmap_delta_from_mode_list(Vars, Modes,
>  		ModuleInfo, InstMapDelta) }.
>  
>  recompute_instmap_delta_2(_, call(PredId, ProcId, Args, D, E, F), _,
> -		call(PredId, ProcId, Args, D, E, F), _VarTypes,
> -		InstMap, InstMapDelta) -->
> +		call(PredId, ProcId, Args, D, E, F), _VarTypes, _TVarMap,
> +		InstMap, _TypeInfoLiveness, InstMapDelta) -->
>  	recompute_instmap_delta_call(PredId, ProcId,
>  		Args, InstMap, InstMapDelta).
>  
>  recompute_instmap_delta_2(Atomic, unify(A, Rhs0, UniMode0, Uni, E), GoalInfo, 
> -		unify(A, Rhs, UniMode, Uni, E), VarTypes, InstMap0,
> -		InstMapDelta) -->
> +		unify(A, Rhs, UniMode, Uni, E), VarTypes, TVarMap, InstMap0,
> +		TypeInfoLiveness, InstMapDelta) -->
>  	(
>  		{ Rhs0 = lambda_goal(PorF, EvalMethod, FixModes, NonLocals,
>  			LambdaVars, Modes, Det, Goal0) }
> @@ -1229,7 +1257,8 @@
>  		=(ModuleInfo0),
>  		{ instmap__pre_lambda_update(ModuleInfo0, LambdaVars, Modes,
>  			InstMap0, InstMap) },
> -		recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, InstMap),
> +		recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes,
> +			TVarMap, InstMap, TypeInfoLiveness, _),
>  		{ Rhs = lambda_goal(PorF, EvalMethod, FixModes, NonLocals,
>  			LambdaVars, Modes, Det, Goal) }
>  	;
> @@ -1245,100 +1274,110 @@
>  
>  recompute_instmap_delta_2(_, pragma_c_code(A, PredId, ProcId, Args, E, F,
>  		G), _, pragma_c_code(A, PredId, ProcId, Args, E, F, G),
> -		_VarTypes, InstMap, InstMapDelta) -->
> +		_VarTypes, _TVarMap, InstMap, _TypeInfoLiveness, InstMapDelta)
> +		-->
>  	recompute_instmap_delta_call(PredId, ProcId,
>  		Args, InstMap, InstMapDelta).
>  
> -recompute_instmap_delta_2(_, bi_implication(_, _), _, _, _, _, _) -->
> +recompute_instmap_delta_2(_, bi_implication(_, _), _, _, _, _, _, _, _) -->
>  	% these should have been expanded out by now
>  	{ error("recompute_instmap_delta_2: unexpected bi_implication") }.
>  	
>  %-----------------------------------------------------------------------------%
>  
>  :- pred recompute_instmap_delta_conj(bool, list(hlds_goal), list(hlds_goal),
> -		vartypes, instmap, instmap_delta, module_info, module_info).
> -:- mode recompute_instmap_delta_conj(in, in, out, in, in, out, in, out) is det.
> +		vartypes, type_info_varmap, instmap, bool, instmap_delta,
> +		module_info, module_info).
> +:- mode recompute_instmap_delta_conj(in, in, out, in, in, in, in, out,
> +		in, out) is det.
>  
> -recompute_instmap_delta_conj(_, [], [], _VarTypes, _InstMap, InstMapDelta) -->
> +recompute_instmap_delta_conj(_, [], [], _, _, _, _, InstMapDelta) -->
>  	{ instmap_delta_init_reachable(InstMapDelta) }.
>  recompute_instmap_delta_conj(Atomic, [Goal0 | Goals0], [Goal | Goals],
> -		VarTypes, InstMap0, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap0, TypeInfoLiveness, InstMapDelta)
> +		-->
>  	recompute_instmap_delta(Atomic, Goal0, Goal,
> -		VarTypes, InstMap0, InstMapDelta0),
> +		VarTypes, TVarMap, InstMap0, TypeInfoLiveness, InstMapDelta0),
>  	{ instmap__apply_instmap_delta(InstMap0, InstMapDelta0, InstMap1) },
>  	recompute_instmap_delta_conj(Atomic, Goals0, Goals,
> -		VarTypes, InstMap1, InstMapDelta1),
> +		VarTypes, TVarMap, InstMap1, TypeInfoLiveness, InstMapDelta1),
>  	{ instmap_delta_apply_instmap_delta(InstMapDelta0, InstMapDelta1,
>  		InstMapDelta) }.
>  
>  %-----------------------------------------------------------------------------%
>  
>  :- pred recompute_instmap_delta_disj(bool, list(hlds_goal), list(hlds_goal),
> -		vartypes, instmap, set(prog_var), instmap_delta,
> -		module_info, module_info).
> -:- mode recompute_instmap_delta_disj(in, in, out, in, in, in, out, in, out)
> -		is det.
> +		vartypes, type_info_varmap, instmap, set(prog_var), bool,
> +		instmap_delta, module_info, module_info).
> +:- mode recompute_instmap_delta_disj(in, in, out, in, in, in, in, in, out,
> +		in, out) is det.
>  
> -recompute_instmap_delta_disj(_, [], [], _, _, _, InstMapDelta) -->
> +recompute_instmap_delta_disj(_, [], [], _, _, _, _, _, InstMapDelta) -->
>  	{ instmap_delta_init_unreachable(InstMapDelta) }.
> -recompute_instmap_delta_disj(Atomic, [Goal0], [Goal],
> -		VarTypes, InstMap, _, InstMapDelta) -->
> -	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, InstMap,
> -		InstMapDelta).
> +recompute_instmap_delta_disj(Atomic, [Goal0], [Goal], VarTypes, TVarMap,
> +		InstMap, _, TypeInfoLiveness, InstMapDelta) -->
> +	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, TVarMap,
> +		InstMap, TypeInfoLiveness, InstMapDelta).
>  recompute_instmap_delta_disj(Atomic, [Goal0 | Goals0], [Goal | Goals],
> -		VarTypes, InstMap, NonLocals, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta) -->
>  	{ Goals0 = [_|_] },
>  	recompute_instmap_delta(Atomic, Goal0, Goal,
> -		VarTypes, InstMap, InstMapDelta0),
> +		VarTypes, TVarMap, InstMap, TypeInfoLiveness, InstMapDelta0),
>  	recompute_instmap_delta_disj(Atomic, Goals0, Goals,
> -		VarTypes, InstMap, NonLocals, InstMapDelta1),
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta1),
>  	merge_instmap_delta(InstMap, NonLocals, InstMapDelta0,
>  		InstMapDelta1, InstMapDelta).
>  
>  :- pred recompute_instmap_delta_par_conj(bool, list(hlds_goal),
> -		list(hlds_goal), vartypes, instmap, set(prog_var),
> -		instmap_delta, module_info, module_info).
> -:- mode recompute_instmap_delta_par_conj(in, in, out, in, in, in, out,
> +		list(hlds_goal), vartypes, type_info_varmap, instmap,
> +		set(prog_var), bool, instmap_delta, module_info, module_info).
> +:- mode recompute_instmap_delta_par_conj(in, in, out, in, in, in, in, in, out,
>  		in, out) is det.
>  
> -recompute_instmap_delta_par_conj(_, [], [], _, _, _, InstMapDelta) -->
> +recompute_instmap_delta_par_conj(_, [], [], _, _, _, _, _, InstMapDelta) -->
>  	{ instmap_delta_init_unreachable(InstMapDelta) }.
> -recompute_instmap_delta_par_conj(Atomic, [Goal0], [Goal],
> -		VarTypes, InstMap, _, InstMapDelta) -->
> -	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, InstMap,
> -		InstMapDelta).
> +recompute_instmap_delta_par_conj(Atomic, [Goal0], [Goal], VarTypes, TVarMap,
> +		InstMap, _, TypeInfoLiveness, InstMapDelta) -->
> +	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, TVarMap,
> +		InstMap, TypeInfoLiveness, InstMapDelta).
>  recompute_instmap_delta_par_conj(Atomic, [Goal0 | Goals0], [Goal | Goals],
> -		VarTypes, InstMap, NonLocals, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta) -->
>  	{ Goals0 = [_|_] },
>  	recompute_instmap_delta(Atomic, Goal0, Goal,
> -		VarTypes, InstMap, InstMapDelta0),
> +		VarTypes, TVarMap, InstMap, TypeInfoLiveness, InstMapDelta0),
>  	recompute_instmap_delta_par_conj(Atomic, Goals0, Goals,
> -		VarTypes, InstMap, NonLocals, InstMapDelta1),
> +		VarTypes, TVarMap, InstMap, NonLocals, TypeInfoLiveness,
> +		InstMapDelta1),
>  	unify_instmap_delta(InstMap, NonLocals, InstMapDelta0,
>  		InstMapDelta1, InstMapDelta).
>  
>  %-----------------------------------------------------------------------------%
>  
>  :- pred recompute_instmap_delta_cases(bool, prog_var, list(case), list(case),
> -		vartypes, instmap, set(prog_var), instmap_delta,
> -		module_info, module_info).
> +		vartypes, type_info_varmap, instmap, set(prog_var), bool,
> +		instmap_delta, module_info, module_info).
>  :- mode recompute_instmap_delta_cases(in, in, in, out,
> -		in, in, in, out, in, out) is det.
> +		in, in, in, in, in, out, in, out) is det.
>  
> -recompute_instmap_delta_cases(_, _, [], [], _, _, _, InstMapDelta) -->
> +recompute_instmap_delta_cases(_, _, [], [], _, _, _, _, _, InstMapDelta) -->
>  	{ instmap_delta_init_unreachable(InstMapDelta) }.
>  recompute_instmap_delta_cases(Atomic, Var, [Case0 | Cases0], [Case | Cases],
> -		VarTypes, InstMap0, NonLocals, InstMapDelta) -->
> +		VarTypes, TVarMap, InstMap0, NonLocals, TypeInfoLiveness,
> +		InstMapDelta) -->
>  	{ Case0 = case(Functor, Goal0) },
>  	{ map__lookup(VarTypes, Var, Type) },
>  	instmap__bind_var_to_functor(Var, Type, Functor, InstMap0, InstMap),
> -	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, InstMap,
> -		InstMapDelta0),
> +	recompute_instmap_delta(Atomic, Goal0, Goal, VarTypes, TVarMap,
> +		InstMap, TypeInfoLiveness, InstMapDelta0),
>  	instmap_delta_bind_var_to_functor(Var, Type, Functor,
>  		InstMap0, InstMapDelta0, InstMapDelta1),
>  	{ Case = case(Functor, Goal) },
>  	recompute_instmap_delta_cases(Atomic, Var, Cases0, Cases,
> -		VarTypes, InstMap0, NonLocals, InstMapDelta2),
> +		VarTypes, TVarMap, InstMap0, NonLocals, TypeInfoLiveness,
> +		InstMapDelta2),
>  	merge_instmap_delta(InstMap0, NonLocals, InstMapDelta1,
>  		InstMapDelta2, InstMapDelta).
>  
> Index: compiler/modes.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/modes.m,v
> retrieving revision 1.242
> diff -u -b -r1.242 modes.m
> --- compiler/modes.m	2000/07/24 11:36:04	1.242
> +++ compiler/modes.m	2000/07/28 06:18:07
> @@ -190,11 +190,11 @@
>  
>  	% Modecheck a unification.
>  
> - 	% given the right-hand-side of a unification, return a list of
> -	% the potentially non-local variables of that unification.
> -	%
> -:- pred unify_rhs_vars(unify_rhs, list(prog_var)).
> -:- mode unify_rhs_vars(in, out) is det.
> +%  	% given the right-hand-side of a unification, return a list of
> +% 	% the potentially non-local variables of that unification.
> +% 	%
> +% :- pred unify_rhs_vars(unify_rhs, list(prog_var)).
> +% :- mode unify_rhs_vars(in, out) is det.
>  
>  	% Given a list of variables, and a list of livenesses,
>  	% select the live variables.
> @@ -977,10 +977,11 @@
>  		%
>  	mode_info_get_instmap(ModeInfo1, InstMap0),
>  
> -	modecheck_goal_expr(Goal0, GoalInfo0, Goal, ModeInfo1, ModeInfo),
> +	modecheck_goal_expr(Goal0, GoalInfo0, Goal, ModeInfo1, ModeInfo2),
>  
>  	mode_info_get_instmap(ModeInfo, InstMap),
> -	goal_info_get_nonlocals(GoalInfo0, NonLocals),
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals,
> +		ModeInfo2, ModeInfo),
>  	compute_instmap_delta(InstMap0, InstMap, NonLocals, DeltaInstMap),
>  	goal_info_set_instmap_delta(GoalInfo0, DeltaInstMap, GoalInfo).
>  
> @@ -1016,7 +1017,7 @@
>  	% conjunctions properly.
>  modecheck_goal_expr(par_conj(List0, SM), GoalInfo0, par_conj(List, SM)) -->
>  	mode_checkpoint(enter, "par_conj"),
> -	{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  	modecheck_par_conj_list(List0, List, NonLocals, InstMapNonlocalList),
>  	instmap__unify(NonLocals, InstMapNonlocalList),
>  	mode_checkpoint(exit, "par_conj").
> @@ -1028,7 +1029,7 @@
>  		{ instmap__init_unreachable(InstMap) },
>  		mode_info_set_instmap(InstMap)
>  	;
> -		{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +		mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  		modecheck_disj_list(List0, List, InstMapList),
>  		instmap__merge(NonLocals, InstMapList, disj),
>  		{ disj_list_to_goal(List, GoalInfo0, Goal - _GoalInfo) }
> @@ -1037,8 +1038,8 @@
>  
>  modecheck_goal_expr(if_then_else(Vs, A0, B0, C0, SM), GoalInfo0, Goal) -->
>  	mode_checkpoint(enter, "if-then-else"),
> -	{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> -	{ goal_get_nonlocals(B0, B_Vars) },
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
> +	mode_info_get_goal_completed_nonlocals(B0, B_Vars),
>  	mode_info_dcg_get_instmap(InstMap0),
>  	%
>  	% We need to lock the non-local variables, to ensure
> @@ -1070,7 +1071,7 @@
>  
>  modecheck_goal_expr(not(A0), GoalInfo0, not(A)) -->
>  	mode_checkpoint(enter, "not"),
> -	{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  	mode_info_dcg_get_instmap(InstMap0),
>  	%
>  	% when analyzing a negated goal, nothing is forward-live
> @@ -1178,7 +1179,7 @@
>  		{ instmap__init_unreachable(InstMap) },
>  		mode_info_set_instmap(InstMap)
>  	;
> -		{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +		mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  		modecheck_case_list(Cases0, Var, Cases, InstMapList),
>  		instmap__merge(NonLocals, InstMapList, disj)
>  	),
> @@ -1213,14 +1214,14 @@
>   	% given the right-hand-side of a unification, return a list of
>  	% the potentially non-local variables of that unification.
>  
> -unify_rhs_vars(var(Var), [Var]).
> -unify_rhs_vars(functor(_Functor, Vars), Vars).
> -unify_rhs_vars(lambda_goal(_PredOrFunc, _EvalMethod, _Fix, LambdaNonLocals,
> -		LambdaVars, _Modes, _Det, _Goal - GoalInfo), Vars) :-
> -	goal_info_get_nonlocals(GoalInfo, NonLocals0),
> -	set__delete_list(NonLocals0, LambdaVars, NonLocals1),
> -	set__insert_list(NonLocals1, LambdaNonLocals, NonLocals),
> -	set__to_sorted_list(NonLocals, Vars).
> +% unify_rhs_vars(var(Var), [Var]).
> +% unify_rhs_vars(functor(_Functor, Vars), Vars).
> +% unify_rhs_vars(lambda_goal(_PredOrFunc, _EvalMethod, _Fix, LambdaNonLocals,
> +% 		LambdaVars, _Modes, _Det, _Goal - GoalInfo), Vars) :-
> +% 	mode_info_get_completed_nonlocals(GoalInfo, NonLocals0),
> +% 	set__delete_list(NonLocals0, LambdaVars, NonLocals1),
> +% 	set__insert_list(NonLocals1, LambdaNonLocals, NonLocals),
> +% 	set__to_sorted_list(NonLocals, Vars).
>  
>  append_extra_goals(no_extra_goals, ExtraGoals, ExtraGoals).
>  append_extra_goals(extra_goals(BeforeGoals, AfterGoals),
> @@ -1261,7 +1262,8 @@
>  		%
>  
>  		% recompute the new set of non-local variables for the main goal
> -		goal_info_get_nonlocals(GoalInfo0, NonLocals0),
> +		mode_info_get_completed_nonlocals(GoalInfo0, NonLocals0,
> +			ModeInfo0, ModeInfo1),
>  		set__list_to_set(Args0, OldArgVars),
>  		set__list_to_set(Args, NewArgVars),
>  		set__difference(NewArgVars, OldArgVars, IntroducedVars),
> @@ -1276,19 +1278,19 @@
>  		handle_extra_goals_contexts(AfterGoals0, Context, AfterGoals),
>  		list__append(BeforeGoals, [Goal0 | AfterGoals], GoalList0),
>  
> -		mode_info_get_may_change_called_proc(ModeInfo0,
> +		mode_info_get_may_change_called_proc(ModeInfo1,
>  			MayChangeCalledProc0),
>  
>  		% Make sure we don't go into an infinite loop if
>  		% there is a bug in the code to add extra goals.
> -		mode_info_set_checking_extra_goals(yes, ModeInfo0, ModeInfo1),
> +		mode_info_set_checking_extra_goals(yes, ModeInfo1, ModeInfo2),
>  
>  		% We've already worked out which procedure should be called,
>  		% we don't need to do it again.
>  		mode_info_set_may_change_called_proc(
> -			may_not_change_called_proc, ModeInfo1, ModeInfo2),
> +			may_not_change_called_proc, ModeInfo2, ModeInfo3),
>  
> -		mode_info_set_instmap(InstMap0, ModeInfo2, ModeInfo3),
> +		mode_info_set_instmap(InstMap0, ModeInfo3, ModeInfo4),
>  
>  		% Recheck the goals to compute the instmap_deltas.
>  		%
> @@ -1302,13 +1304,13 @@
>  		% is not, the main unification will be delayed until after the
>  		% argument unifications, which turns them into assignments,
>  		% and we end up repeating the process forever.
> -		mode_info_add_goals_live_vars(GoalList0, ModeInfo3, ModeInfo4),
> +		mode_info_add_goals_live_vars(GoalList0, ModeInfo4, ModeInfo5),
>  		modecheck_conj_list_no_delay(GoalList0, GoalList,
> -			ModeInfo4, ModeInfo5),
> +			ModeInfo5, ModeInfo6),
>  		Goal = conj(GoalList),
> -		mode_info_set_checking_extra_goals(no, ModeInfo5, ModeInfo6),
> +		mode_info_set_checking_extra_goals(no, ModeInfo6, ModeInfo7),
>  		mode_info_set_may_change_called_proc(MayChangeCalledProc0,
> -			ModeInfo6, ModeInfo)
> +			ModeInfo7, ModeInfo)
>  	;
>  		Goal = MainGoal,
>  		ModeInfo = ModeInfo0
> @@ -1325,12 +1327,6 @@
>  	goal_info_set_context(GoalInfo0, Context, GoalInfo),
>  	handle_extra_goals_contexts(Goals0, Context, Goals).
>  
> -:- pred goal_get_nonlocals(hlds_goal, set(prog_var)).
> -:- mode goal_get_nonlocals(in, out) is det.
> -
> -goal_get_nonlocals(_Goal - GoalInfo, NonLocals) :-
> -	goal_info_get_nonlocals(GoalInfo, NonLocals).
> -
>  %-----------------------------------------------------------------------------%
>  
>  	% Modecheck a conjunction without doing any reordering.
> @@ -1342,7 +1338,7 @@
>  
>  modecheck_conj_list_no_delay([], []) --> [].
>  modecheck_conj_list_no_delay([Goal0 | Goals0], [Goal | Goals]) -->
> -	{ goal_get_nonlocals(Goal0, NonLocals) },
> +	mode_info_get_goal_completed_nonlocals(Goal0, NonLocals),
>  	mode_info_remove_live_vars(NonLocals),
>  	modecheck_goal(Goal0, Goal),
>  	mode_info_dcg_get_instmap(InstMap),
> @@ -1424,12 +1420,12 @@
>  	% at the start of the list of live vars sets, which
>  	% makes them cheaper to remove.
>  	mode_info_add_goals_live_vars(Goals),
> -	{ goal_get_nonlocals(Goal, Vars) },
> +	mode_info_get_goal_completed_nonlocals(Goal, Vars),
>  	mode_info_add_live_vars(Vars).
>  
>  mode_info_remove_goals_live_vars([]) --> [].
>  mode_info_remove_goals_live_vars([Goal | Goals]) -->
> -	{ goal_get_nonlocals(Goal, Vars) },
> +	mode_info_get_goal_completed_nonlocals(Goal, Vars),
>  	mode_info_remove_live_vars(Vars),
>  	mode_info_remove_goals_live_vars(Goals).
>  
> @@ -1469,7 +1465,7 @@
>  
>  		% Modecheck the goal, noting first that the non-locals
>  		% which occur in the goal might not be live anymore.
> -	{ goal_get_nonlocals(Goal0, NonLocalVars) },
> +	mode_info_get_goal_completed_nonlocals(Goal0, NonLocalVars),
>  	mode_info_remove_live_vars(NonLocalVars),
>  	modecheck_goal(Goal0, Goal),
>  
> @@ -1699,11 +1695,11 @@
>  		mode_info_di, mode_info_uo) is det.
>  
>  modecheck_par_conj_list([], [], _NonLocals, []) --> [].
> -modecheck_par_conj_list([Goal0|Goals0], [Goal|Goals], NonLocals, 
> -		[InstMap - GoalNonLocals|InstMaps]) -->
> +modecheck_par_conj_list([Goal0 | Goals0], [Goal|Goals], NonLocals, 
> +		[InstMap - GoalNonLocals | InstMaps]) -->
>  	mode_info_dcg_get_instmap(InstMap0),
>  	{ Goal0 = _ - GoalInfo },
> -	{ goal_info_get_nonlocals(GoalInfo, GoalNonLocals) },
> +	mode_info_get_completed_nonlocals(GoalInfo, GoalNonLocals),
>  	mode_info_get_parallel_vars(PVars0),
>  	{ set__init(Bound0) },
>  	mode_info_set_parallel_vars([NonLocals - Bound0|PVars0]),
> @@ -1731,18 +1727,6 @@
>  	mode_info_lock_vars(par_conj, Bound1),
>  	modecheck_par_conj_list(Goals0, Goals, NonLocals, InstMaps),
>  	mode_info_unlock_vars(par_conj, Bound1).
> -
> -:- pred get_all_conjunct_nonlocals(list(hlds_goal), set(prog_var),
> -		set(prog_var)).
> -:- mode get_all_conjunct_nonlocals(in, in, out) is det.
> -
> -get_all_conjunct_nonlocals([], NonLocals, NonLocals).
> -get_all_conjunct_nonlocals([G|Gs], NonLocals0, NonLocals) :-
> -	G = _ - GoalInfo,
> -	goal_info_get_nonlocals(GoalInfo, GoalNonLocals),
> -	set__union(GoalNonLocals, NonLocals0, NonLocals1),
> -	get_all_conjunct_nonlocals(Gs, NonLocals1, NonLocals).
> -
>  
>  %-----------------------------------------------------------------------------%
>  
> Index: compiler/pd_util.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/pd_util.m,v
> retrieving revision 1.8
> diff -u -b -r1.8 pd_util.m
> --- compiler/pd_util.m	2000/04/14 08:38:14	1.8
> +++ compiler/pd_util.m	2000/07/29 03:29:13
> @@ -157,8 +157,9 @@
>  	pd_info_get_proc_info(ProcInfo0),
>  	{ proc_info_varset(ProcInfo0, VarSet0) },
>  	{ proc_info_vartypes(ProcInfo0, VarTypes0) },
> +	{ proc_info_typeinfo_varmap(ProcInfo0, TVarMap) },
>  	{ simplify_info_init(DetInfo0, Simplifications, InstMap0,
> -		VarSet0, VarTypes0, SimplifyInfo0) },
> +		VarSet0, VarTypes0, TVarMap, SimplifyInfo0) },
>  
>  	{ simplify__process_goal(Goal0, Goal, SimplifyInfo0, SimplifyInfo) },
>  
> @@ -666,7 +667,12 @@
>  	pd_info_get_proc_info(ProcInfo0),
>  	{ proc_info_varset(ProcInfo0, VarSet0) },
>  	{ proc_info_vartypes(ProcInfo0, VarTypes0) },
> -	{ implicitly_quantify_goal(Goal0, VarSet0, VarTypes0, NonLocals,
> +	{ proc_info_typeinfo_varmap(ProcInfo0, TVarMap) },
> +	pd_info_get_module_info(ModuleInfo0),
> +	{ module_info_globals(ModuleInfo0, Globals) },
> +	{ body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness) },
> +	{ implicitly_quantify_goal(Goal0, VarSet0, VarTypes0,
> +		TVarMap, TypeInfoLiveness, NonLocals,
>  			Goal, VarSet, VarTypes, _) },
>  	{ proc_info_set_varset(ProcInfo0, VarSet, ProcInfo1) },
>  	{ proc_info_set_vartypes(ProcInfo1, VarTypes, ProcInfo) },
> @@ -677,7 +683,8 @@
>  	pd_info_get_instmap(InstMap),
>  	pd_info_get_proc_info(ProcInfo),
>  	{ proc_info_vartypes(ProcInfo, VarTypes) },
> -	{ recompute_instmap_delta(yes, Goal0, Goal, VarTypes, InstMap, 
> +	{ proc_info_typeinfo_varmap(ProcInfo, TVarMap) },
> +	{ recompute_instmap_delta(yes, Goal0, Goal, VarTypes, TVarMap, InstMap, 
>  		ModuleInfo0, ModuleInfo) },
>  	pd_info_set_module_info(ModuleInfo).
>  
> Index: compiler/polymorphism.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/polymorphism.m,v
> retrieving revision 1.190
> diff -u -b -r1.190 polymorphism.m
> --- compiler/polymorphism.m	2000/07/20 11:24:08	1.190
> +++ compiler/polymorphism.m	2000/07/29 02:53:41
> @@ -1825,8 +1825,13 @@
>  		poly_info_get_varset(Info0, VarSet0),
>  		poly_info_get_var_types(Info0, VarTypes0),
>  		set__list_to_set(HeadVars, OutsideVars),
> +		poly_info_get_type_info_map(Info0, TVarMap),
> +		poly_info_get_module_info(Info0, ModuleInfo),
> +		module_info_globals(ModuleInfo, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  		implicitly_quantify_goal(Goal0, VarSet0, VarTypes0,
> -			OutsideVars, Goal, VarSet, VarTypes, _Warnings),
> +			TVarMap, TypeInfoLiveness, OutsideVars,
> +			Goal, VarSet, VarTypes, _Warnings),
>  		poly_info_set_varset_and_types(VarSet, VarTypes, Info0, Info)
>  	).
>  
> @@ -1869,8 +1874,13 @@
>  			TypeClassVarMap, VarTypes0, ExistQVars,
>  			NonLocalsPlusArgs, NewOutsideVars),
>  		set__union(NonLocals, NewOutsideVars, OutsideVars),
> +		poly_info_get_type_info_map(Info0, TVarMap),
> +		poly_info_get_module_info(Info0, ModuleInfo),
> +		module_info_globals(ModuleInfo, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  		implicitly_quantify_goal(Goal0, VarSet0, VarTypes0,
> -			OutsideVars, Goal, VarSet, VarTypes, _Warnings),
> +			TVarMap, TypeInfoLiveness, OutsideVars,
> +			Goal, VarSet, VarTypes, _Warnings),
>  		poly_info_set_varset_and_types(VarSet, VarTypes, Info0, Info)
>  	).
>  
> @@ -1954,8 +1964,7 @@
>  	ClassId = class_id(ClassName, ClassArity),
>  
>  	Info0 = poly_info(VarSet0, VarTypes0, TypeVarSet, TypeInfoMap0, 
> -		TypeClassInfoMap0, Proofs, PredName, ModuleInfo,
> -		unit, unit),
> +		TypeClassInfoMap0, Proofs, PredName, ModuleInfo),
>  
>  	(
>  		map__search(TypeClassInfoMap0, Constraint, Location)
> @@ -2099,7 +2108,7 @@
>  
>  			Info1 = poly_info(VarSet1, VarTypes1, TypeVarSet, 
>  				TypeInfoMap0, TypeClassInfoMap0, Proofs, 
> -				PredName, ModuleInfo, unit, unit),
> +				PredName, ModuleInfo),
>  
>  				% Make the typeclass_info for the subclass
>  			polymorphism__make_typeclass_info_var(
> @@ -3204,20 +3213,24 @@
>  
>  :- type poly_info --->
>  		poly_info(
> -			prog_varset,		% from the proc_info
> -			map(prog_var, type),	% from the proc_info
> -			tvarset,		% from the proc_info
> -			map(tvar, type_info_locn),		
> +			% the first three fields are from the proc_info
> +			varset			:: prog_varset,
> +			vartypes		:: vartypes,
> +			typevarset		:: tvarset,
> +
> +			type_info_varmap	:: type_info_varmap,		
>  						% specifies the location of
>  						% the type_info var
>  						% for each of the pred's type
>  						% parameters
>  
> +			typeclass_info_map	::
>  			map(class_constraint, prog_var),		
>  						% specifies the location of
>  						% the typeclass_info var
>  						% for each of the pred's class
>  						% constraints
> +			proof_map		::
>  			map(class_constraint, constraint_proof),
>  						% specifies why each constraint
>  						% that was eliminated from the
> @@ -3233,10 +3246,8 @@
>  						% calculated here in
>  						% polymorphism.m
>  
> -			pred_info,
> -			module_info,
> -			unit,
> -			unit
> +			pred_info		:: pred_info,
> +			module_info		:: module_info
>  		).
>  
>  %---------------------------------------------------------------------------%
> @@ -3256,7 +3267,7 @@
>  	map__init(TypeClassInfoMap),
>  	PolyInfo = poly_info(VarSet, VarTypes, TypeVarSet,
>  			TypeInfoMap, TypeClassInfoMap,
> -			Proofs, PredInfo, ModuleInfo, unit, unit).
> +			Proofs, PredInfo, ModuleInfo).
>  
>  	% create_poly_info creates a poly_info for an existing procedure.
>  	% (See also init_poly_info.)
> @@ -3269,13 +3280,12 @@
>  	proc_info_typeclass_info_varmap(ProcInfo, TypeClassInfoMap),
>  	PolyInfo = poly_info(VarSet, VarTypes, TypeVarSet,
>  			TypeInfoMap, TypeClassInfoMap,
> -			Proofs, PredInfo, ModuleInfo, unit, unit).
> +			Proofs, PredInfo, ModuleInfo).
>  
>  poly_info_extract(Info, PredInfo0, PredInfo,
>                  ProcInfo0, ProcInfo, ModuleInfo) :-
>  	Info = poly_info(VarSet, VarTypes, TypeVarSet, TypeInfoMap,
> -		TypeclassInfoLocations, _Proofs, _OldPredInfo, ModuleInfo,
> -		_, _),
> +		TypeclassInfoLocations, _Proofs, _OldPredInfo, ModuleInfo),
>  
>  	% set the new values of the fields in proc_info and pred_info
>  	proc_info_set_varset(ProcInfo0, VarSet, ProcInfo1),
> @@ -3286,110 +3296,52 @@
>  	pred_info_set_typevarset(PredInfo0, TypeVarSet, PredInfo).
>  
>  %---------------------------------------------------------------------------%
> -
> -:- pred poly_info_get_varset(poly_info, prog_varset).
> -:- mode poly_info_get_varset(in, out) is det.
> -
> -poly_info_get_varset(PolyInfo, VarSet) :-
> -	PolyInfo = poly_info(VarSet, _, _, _, _, _, _, _, _, _).
> -
> -:- pred poly_info_get_var_types(poly_info, map(prog_var, type)).
> -:- mode poly_info_get_var_types(in, out) is det.
> -
> -poly_info_get_var_types(PolyInfo, VarTypes) :-
> -	PolyInfo = poly_info(_, VarTypes, _, _, _, _, _, _, _, _).
> -
> -:- pred poly_info_get_typevarset(poly_info, tvarset).
> -:- mode poly_info_get_typevarset(in, out) is det.
> -
> -poly_info_get_typevarset(PolyInfo, TypeVarSet) :-
> -	PolyInfo = poly_info(_, _, TypeVarSet, _, _, _, _, _, _, _).
> -
> -:- pred poly_info_get_type_info_map(poly_info, map(tvar, type_info_locn)).
> -:- mode poly_info_get_type_info_map(in, out) is det.
> -
> -poly_info_get_type_info_map(PolyInfo, TypeInfoMap) :-
> -	PolyInfo = poly_info(_, _, _, TypeInfoMap, _, _, _, _, _, _).
> -
> -:- pred poly_info_get_typeclass_info_map(poly_info,
> -					map(class_constraint, prog_var)).
> -:- mode poly_info_get_typeclass_info_map(in, out) is det.
> -
> -poly_info_get_typeclass_info_map(PolyInfo, TypeClassInfoMap) :-
> -	PolyInfo = poly_info(_, _, _, _, TypeClassInfoMap, _, _, _, _, _).
> -
> -:- pred poly_info_get_proofs(poly_info,
> -				map(class_constraint, constraint_proof)).
> -:- mode poly_info_get_proofs(in, out) is det.
> -
> -poly_info_get_proofs(PolyInfo, Proofs) :-
> -	PolyInfo = poly_info(_, _, _, _, _, Proofs, _, _, _, _).
> -
> -:- pred poly_info_get_pred_info(poly_info, pred_info).
> -:- mode poly_info_get_pred_info(in, out) is det.
> -
> -poly_info_get_pred_info(PolyInfo, PredInfo) :-
> -	PolyInfo = poly_info(_, _, _, _, _, _, PredInfo, _, _, _).
> -
> -:- pred poly_info_get_module_info(poly_info, module_info).
> -:- mode poly_info_get_module_info(in, out) is det.
>  
> -poly_info_get_module_info(PolyInfo, ModuleInfo) :-
> -	PolyInfo = poly_info(_, _, _, _, _, _, _, ModuleInfo, _, _).
> -
> -:- pred poly_info_set_varset(prog_varset, poly_info, poly_info).
> -:- mode poly_info_set_varset(in, in, out) is det.
> -
> -poly_info_set_varset(VarSet, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(_, B, C, D, E, F, G, H, I, J),
> -	PolyInfo = poly_info(VarSet, B, C, D, E, F, G, H, I, J).
> -
> -:- pred poly_info_set_varset_and_types(prog_varset, map(prog_var, type),
> -					poly_info, poly_info).
> -:- mode poly_info_set_varset_and_types(in, in, in, out) is det.
> -
> -poly_info_set_varset_and_types(VarSet, VarTypes, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(_, _, C, D, E, F, G, H, I, J),
> -	PolyInfo = poly_info(VarSet, VarTypes, C, D, E, F, G, H, I, J).
> -
> -:- pred poly_info_set_typevarset(tvarset, poly_info, poly_info).
> -:- mode poly_info_set_typevarset(in, in, out) is det.
> -
> -poly_info_set_typevarset(TypeVarSet, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(A, B, _, D, E, F, G, H, I, J),
> -	PolyInfo = poly_info(A, B, TypeVarSet, D, E, F, G, H, I, J).
> -
> -:- pred poly_info_set_type_info_map(map(tvar, type_info_locn),
> -					poly_info, poly_info).
> -:- mode poly_info_set_type_info_map(in, in, out) is det.
> -
> -poly_info_set_type_info_map(TypeInfoMap, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(A, B, C, _, E, F, G, H, I, J),
> -	PolyInfo = poly_info(A, B, C, TypeInfoMap, E, F, G, H, I, J).
> -
> -:- pred poly_info_set_typeclass_info_map(map(class_constraint, prog_var),
> -					poly_info, poly_info).
> -:- mode poly_info_set_typeclass_info_map(in, in, out) is det.
> -
> -poly_info_set_typeclass_info_map(TypeClassInfoMap, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(A, B, C, D, _, F, G, H, I, J),
> -	PolyInfo = poly_info(A, B, C, D, TypeClassInfoMap, F, G, H, I, J).
> -
> -
> -:- pred poly_info_set_proofs(map(class_constraint, constraint_proof),
> -				poly_info, poly_info).
> -:- mode poly_info_set_proofs(in, in, out) is det.
> -
> -poly_info_set_proofs(Proofs, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(A, B, C, D, E, _, G, H, I, J),
> -	PolyInfo = poly_info(A, B, C, D, E, Proofs, G, H, I, J).
> -
> -:- pred poly_info_set_module_info(module_info, poly_info, poly_info).
> -:- mode poly_info_set_module_info(in, in, out) is det.
> -
> -poly_info_set_module_info(ModuleInfo, PolyInfo0, PolyInfo) :-
> -	PolyInfo0 = poly_info(A, B, C, D, E, F, G, _, I, J),
> -	PolyInfo = poly_info(A, B, C, D, E, F, G, ModuleInfo, I, J).
> +:- pred poly_info_get_varset(poly_info::in, prog_varset::out) is det.
> +:- pred poly_info_get_var_types(poly_info::in, vartypes::out) is det.
> +:- pred poly_info_get_typevarset(poly_info::in, tvarset::out) is det.
> +:- pred poly_info_get_type_info_map(poly_info::in, type_info_varmap::out)
> +	is det.
> +:- pred poly_info_get_typeclass_info_map(poly_info::in,
> +	map(class_constraint, prog_var)::out) is det.
> +:- pred poly_info_get_proofs(poly_info::in,
> +	map(class_constraint, constraint_proof)::out) is det.
> +:- pred poly_info_get_pred_info(poly_info::in, pred_info::out) is det.
> +:- pred poly_info_get_module_info(poly_info::in, module_info::out) is det.
> +
> +poly_info_get_varset(PolyInfo, PolyInfo^varset).
> +poly_info_get_var_types(PolyInfo, PolyInfo^vartypes).
> +poly_info_get_typevarset(PolyInfo, PolyInfo^typevarset).
> +poly_info_get_type_info_map(PolyInfo, PolyInfo^type_info_varmap).
> +poly_info_get_typeclass_info_map(PolyInfo, PolyInfo^typeclass_info_map).
> +poly_info_get_proofs(PolyInfo, PolyInfo^proof_map).
> +poly_info_get_pred_info(PolyInfo, PolyInfo^pred_info).
> +poly_info_get_module_info(PolyInfo, PolyInfo^module_info).
> +
> +:- pred poly_info_set_varset(prog_varset::in, poly_info::in,
> +	poly_info::out) is det.
> +:- pred poly_info_set_varset_and_types(prog_varset::in, vartypes::in,
> +	poly_info::in, poly_info::out) is det.
> +:- pred poly_info_set_typevarset(tvarset::in, poly_info::in,
> +	poly_info::out) is det.
> +:- pred poly_info_set_type_info_map(type_info_varmap::in,
> +	poly_info::in, poly_info::out) is det.
> +:- pred poly_info_set_typeclass_info_map(map(class_constraint, prog_var)::in,
> +	poly_info::in, poly_info::out) is det.
> +:- pred poly_info_set_proofs(map(class_constraint, constraint_proof)::in,
> +	poly_info::in, poly_info::out) is det.
> +:- pred poly_info_set_module_info(module_info::in, poly_info::in,
> +	poly_info::out) is det.
> +
> +poly_info_set_varset(VarSet, PI, PI^varset := VarSet).
> +poly_info_set_varset_and_types(VarSet, VarTypes, PI,
> +	(PI ^varset := VarSet) ^vartypes := VarTypes).
> +poly_info_set_typevarset(TVarSet, PI, PI^typevarset := TVarSet).
> +poly_info_set_type_info_map(TVarMap, PI, PI^type_info_varmap := TVarMap).
> +poly_info_set_typeclass_info_map(TypeClassInfoMap, PI,
> +	PI^typeclass_info_map := TypeClassInfoMap).
> +poly_info_set_proofs(Proofs, PI, PI^proof_map := Proofs).
> +poly_info_set_module_info(ModuleInfo, PI, PI^module_info := ModuleInfo).
>  
>  %---------------------------------------------------------------------------%
>  %---------------------------------------------------------------------------%
> Index: compiler/quantification.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/quantification.m,v
> retrieving revision 1.73
> diff -u -b -r1.73 quantification.m
> --- compiler/quantification.m	2000/05/22 18:00:52	1.73
> +++ compiler/quantification.m	2000/07/28 10:24:02
> @@ -39,7 +39,7 @@
>  :- interface.
>  
>  :- import_module hlds_goal, hlds_pred, prog_data.
> -:- import_module map, list, set.
> +:- import_module bool, list, set.
>  
>  	%
>  	% When the compiler performs structure reuse, using
> @@ -71,40 +71,38 @@
>  	--->	ordinary_nonlocals
>  	;	code_gen_nonlocals.
>  
> -:- pred implicitly_quantify_clause_body(nonlocals_to_recompute, list(prog_var),
> -		hlds_goal, prog_varset, map(prog_var, type),
> -		hlds_goal, prog_varset, map(prog_var, type),
> -		list(quant_warning)).
> -:- mode implicitly_quantify_clause_body(in, in, in, in, in, out, out, out, out)
> -	is det.
> +:- pred implicitly_quantify_clause_body(
> +	nonlocals_to_recompute::in, list(prog_var)::in,
> +	hlds_goal::in, prog_varset::in, vartypes::in,
> +	type_info_varmap::in, bool::in,
> +	hlds_goal::out, prog_varset::out, vartypes::out,
> +	list(quant_warning)::out) is det.
>  
> -	
>  	% As above, with `ordinary_nonlocals' passed as the first argument.
> -:- pred implicitly_quantify_clause_body(list(prog_var),
> -		hlds_goal, prog_varset, map(prog_var, type),
> -		hlds_goal, prog_varset, map(prog_var, type),
> -		list(quant_warning)).
> -:- mode implicitly_quantify_clause_body(in, in, in, in, out, out, out, out)
> -	is det.
> -
> -:- pred implicitly_quantify_goal(nonlocals_to_recompute, hlds_goal, prog_varset,
> -		map(prog_var, type), set(prog_var), hlds_goal, prog_varset,
> -		map(prog_var, type), list(quant_warning)).
> -:- mode implicitly_quantify_goal(in, in, in, in, in,
> -		out, out, out, out) is det.
> +:- pred implicitly_quantify_clause_body(list(prog_var)::in,
> +	hlds_goal::in, prog_varset::in, vartypes::in,
> +	type_info_varmap::in, bool::in,
> +	hlds_goal::out, prog_varset::out, vartypes::out,
> +	list(quant_warning)::out) is det.
> +
> +:- pred implicitly_quantify_goal(nonlocals_to_recompute::in,
> +	hlds_goal::in, prog_varset::in, vartypes::in,
> +	type_info_varmap::in, bool::in, set(prog_var)::in,
> +	hlds_goal::out, prog_varset::out, vartypes::out,
> +	list(quant_warning)::out) is det.
>  
>  	% As above, with `ordinary_nonlocals' passed as the first argument.
> -:- pred implicitly_quantify_goal(hlds_goal, prog_varset, map(prog_var, type),
> -		set(prog_var), hlds_goal, prog_varset,
> -		map(prog_var, type), list(quant_warning)).
> -:- mode implicitly_quantify_goal(in, in, in, in, out, out, out, out) is det.
> +:- pred implicitly_quantify_goal(
> +	hlds_goal::in, prog_varset::in, vartypes::in,
> +	type_info_varmap::in, bool::in, set(prog_var)::in,
> +	hlds_goal::out, prog_varset::out, vartypes::out,
> +	list(quant_warning)::out) is det.
>  
> -:- pred requantify_proc(nonlocals_to_recompute, proc_info, proc_info) is det.
> -:- mode requantify_proc(in, in, out) is det.
> +:- pred requantify_proc(nonlocals_to_recompute::in, bool::in,
> +	proc_info::in, proc_info::out) is det.
>  
>  	% As above, with `ordinary_nonlocals' passed as the first argument.
> -:- pred requantify_proc(proc_info, proc_info) is det.
> -:- mode requantify_proc(in, out) is det.
> +:- pred requantify_proc(bool::in, proc_info::in, proc_info::out) is det.
>  
>  	% We return a list of warnings back to make_hlds.m.
>  	% Currently the only thing we warn about is variables with
> @@ -116,13 +114,11 @@
>  	% quantification__goal_vars(Goal, Vars):
>  	%	Vars is the set of variables that are free (unquantified)
>  	%	in Goal.
> -:- pred quantification__goal_vars(nonlocals_to_recompute,
> -		hlds_goal, set(prog_var)).
> -:- mode quantification__goal_vars(in, in, out) is det.
> +:- pred quantification__goal_vars(nonlocals_to_recompute::in,
> +	hlds_goal::in, set(prog_var)::out) is det.
>  
>  	% As above, with `ordinary_nonlocals' passed as the first argument.
> -:- pred quantification__goal_vars(hlds_goal, set(prog_var)).
> -:- mode quantification__goal_vars(in, out) is det.
> +:- pred quantification__goal_vars(hlds_goal::in, set(prog_var)::out) is det.
>  
>  %-----------------------------------------------------------------------------%
>  
> @@ -130,7 +126,7 @@
>  
>  :- import_module instmap, goal_util.
>  
> -:- import_module term, varset.
> +:- import_module map, term, varset.
>  :- import_module std_util, bool, require.
>  
>  	% The `outside vars', `lambda outside vars', and `quant vars'
> @@ -150,6 +146,8 @@
>  			seen :: set(prog_var),
>  			varset :: prog_varset,
>  			vartypes :: vartypes,
> +			type_info_varmap	:: type_info_varmap,
> +			typeinfo_liveness	:: bool,
>  			warnings :: list(quant_warning)
>  		).
>  
> @@ -183,40 +181,48 @@
>  %-----------------------------------------------------------------------------%
>  
>  implicitly_quantify_clause_body(HeadVars, Goal0, Varset0, VarTypes0,
> -		Goal, Varset, VarTypes, Warnings) :-
> +		TVarMap, TypeInfoLiveness, Goal, Varset, VarTypes, Warnings) :-
>  	implicitly_quantify_clause_body(ordinary_nonlocals,
> -		HeadVars, Goal0, Varset0, VarTypes0,
> +		HeadVars, Goal0, Varset0, VarTypes0, TVarMap, TypeInfoLiveness,
>  		Goal, Varset, VarTypes, Warnings).
>  
>  implicitly_quantify_clause_body(RecomputeNonLocals, HeadVars, Goal0,
> -		Varset0, VarTypes0, Goal, Varset, VarTypes, Warnings) :-
> +		Varset0, VarTypes0, TVarMap, TypeInfoLiveness,
> +		Goal, Varset, VarTypes, Warnings) :-
>  	set__list_to_set(HeadVars, OutsideVars),
>  	implicitly_quantify_goal(RecomputeNonLocals, Goal0, Varset0, VarTypes0,
> -			OutsideVars, Goal, Varset, VarTypes, Warnings).
> +		TVarMap, TypeInfoLiveness, OutsideVars,
> +		Goal, Varset, VarTypes, Warnings).
>  
> -requantify_proc(ProcInfo0, ProcInfo) :-
> -	requantify_proc(ordinary_nonlocals, ProcInfo0, ProcInfo).
> +requantify_proc(TypeInfoLiveness, ProcInfo0, ProcInfo) :-
> +	requantify_proc(ordinary_nonlocals, TypeInfoLiveness,
> +		ProcInfo0, ProcInfo).
>  
> -requantify_proc(RecomputeNonLocals, ProcInfo0, ProcInfo) :-
> +requantify_proc(RecomputeNonLocals, TypeInfoLiveness, ProcInfo0, ProcInfo) :-
>  	proc_info_varset(ProcInfo0, Varset0),
>  	proc_info_vartypes(ProcInfo0, VarTypes0),
> +	proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
>  	proc_info_headvars(ProcInfo0, HeadVars),
>  	proc_info_goal(ProcInfo0, Goal0),
>  	implicitly_quantify_clause_body(RecomputeNonLocals, HeadVars,
> -		Goal0, Varset0, VarTypes0, Goal, Varset, VarTypes, _),
> +		Goal0, Varset0, VarTypes0, TVarMap, TypeInfoLiveness,
> +		Goal, Varset, VarTypes, _),
>  	proc_info_set_varset(ProcInfo0, Varset, ProcInfo1),
>  	proc_info_set_vartypes(ProcInfo1, VarTypes, ProcInfo2),
>  	proc_info_set_goal(ProcInfo2, Goal, ProcInfo).
>  
> -implicitly_quantify_goal(Goal0, Varset0, VarTypes0, OutsideVars,
> -		Goal, Varset, VarTypes, Warnings) :-
> +implicitly_quantify_goal(Goal0, Varset0, VarTypes0, TVarMap, TypeInfoLiveness,
> +		OutsideVars, Goal, Varset, VarTypes, Warnings) :-
>  	implicitly_quantify_goal(ordinary_nonlocals, Goal0, Varset0, VarTypes0,
> -		OutsideVars, Goal, Varset, VarTypes, Warnings).
> +		TVarMap, TypeInfoLiveness, OutsideVars,
> +		Goal, Varset, VarTypes, Warnings).
>  
>  implicitly_quantify_goal(RecomputeNonLocals, Goal0, Varset0, VarTypes0,
> -		OutsideVars, Goal, Varset, VarTypes, Warnings) :-
> +		TVarMap, TypeInfoLiveness, OutsideVars,
> +		Goal, Varset, VarTypes, Warnings) :-
>  	implicitly_quantify_goal_2(ordinary_nonlocals,
> -		Goal0, Varset0, VarTypes0, OutsideVars,
> +		Goal0, Varset0, VarTypes0,
> +		TVarMap, TypeInfoLiveness, OutsideVars,
>  		Goal1, Varset1, VarTypes1, Warnings),
>  	(
>  		RecomputeNonLocals = code_gen_nonlocals,
> @@ -227,7 +233,8 @@
>  		goal_contains_reconstruction(Goal1)
>  	->
>  		implicitly_quantify_goal_2(code_gen_nonlocals,
> -			Goal1, Varset1, VarTypes1, OutsideVars,
> +			Goal1, Varset1, VarTypes1,
> +			TVarMap, TypeInfoLiveness, OutsideVars,
>  			Goal, Varset, VarTypes, _)
>  	;
>  		Goal = Goal1,
> @@ -235,26 +242,26 @@
>  		VarTypes = VarTypes1
>  	).
>  
> -:- pred implicitly_quantify_goal_2(nonlocals_to_recompute, hlds_goal,
> -		prog_varset, vartypes, set(prog_var), hlds_goal,
> -		prog_varset, vartypes, list(quant_warning)).
> -:- mode implicitly_quantify_goal_2(in, in, in, in, in,
> -		out, out, out, out) is det.
> +:- pred implicitly_quantify_goal_2(nonlocals_to_recompute::in,
> +	hlds_goal::in, prog_varset::in, vartypes::in,
> +	type_info_varmap::in, bool::in, set(prog_var)::in,
> +	hlds_goal::out, prog_varset::out, vartypes::out,
> +	list(quant_warning)::out) is det.
>  		
>  implicitly_quantify_goal_2(RecomputeNonLocals,
> -		Goal0, Varset0, VarTypes0, OutsideVars,
> +		Goal0, Varset0, VarTypes0,
> +		TVarMap, TypeInfoLiveness, OutsideVars,
>  		Goal, Varset, VarTypes, Warnings) :-
>  	quantification__init(RecomputeNonLocals, OutsideVars,
> -		Varset0, VarTypes0, QuantInfo0),
> +		Varset0, VarTypes0, TVarMap, TypeInfoLiveness, QuantInfo0),
>  	implicitly_quantify_goal(Goal0, Goal, QuantInfo0, QuantInfo),
>  	quantification__get_varset(Varset, QuantInfo, _),
>  	quantification__get_vartypes(VarTypes, QuantInfo, _),
>  	quantification__get_warnings(Warnings0, QuantInfo, _),
>  	list__reverse(Warnings0, Warnings).
>  
> -:- pred implicitly_quantify_goal(hlds_goal, hlds_goal,
> -					quant_info, quant_info).
> -:- mode implicitly_quantify_goal(in, out, in, out) is det.
> +:- pred implicitly_quantify_goal(hlds_goal::in, hlds_goal::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  implicitly_quantify_goal(Goal0 - GoalInfo0, Goal - GoalInfo) -->
>  	quantification__get_seen(SeenVars),
> @@ -285,13 +292,18 @@
>  	% to become local when previously it was non-local),
>  	% then we may need to likewise shrink the instmap delta.
>  	%
> +	quantification__get_typeinfo_liveness(TypeInfoLiveness),
> +	quantification__get_vartypes(VarTypes),
> +	quantification__get_type_info_varmap(TVarMap),
> +	{ proc_info_maybe_complete_with_typeinfo_vars(NonLocalVars,
> +		TypeInfoLiveness, VarTypes, TVarMap, CompletedNonLocalVars) },
>  	{ goal_info_get_instmap_delta(GoalInfo2, InstMapDelta0) },
> -	{ instmap_delta_restrict(InstMapDelta0, NonLocalVars, InstMapDelta) },
> +	{ instmap_delta_restrict(InstMapDelta0, CompletedNonLocalVars,
> +		InstMapDelta) },
>  	{ goal_info_set_instmap_delta(GoalInfo2, InstMapDelta, GoalInfo) }.
>  
> -:- pred implicitly_quantify_goal_2(hlds_goal_expr, prog_context,
> -				hlds_goal_expr, quant_info, quant_info).
> -:- mode implicitly_quantify_goal_2(in, in, out, in, out) is det.
> +:- pred implicitly_quantify_goal_2(hlds_goal_expr::in, prog_context::in,
> +	hlds_goal_expr::out, quant_info::in, quant_info::out) is det.
>  
>  	% After this pass, explicit quantifiers are redundant,
>  	% since all variables which were explicitly quantified
> @@ -1148,12 +1160,12 @@
>  
>  %-----------------------------------------------------------------------------%
>  
> -:- pred quantification__init(nonlocals_to_recompute, set(prog_var),
> -		prog_varset, map(prog_var, type), quant_info).
> -:- mode quantification__init(in, in, in, in, out) is det.
> +:- pred quantification__init(nonlocals_to_recompute::in, set(prog_var)::in,
> +	prog_varset::in, vartypes::in, type_info_varmap::in, bool::in,
> +	quant_info::out) is det.
>  
>  quantification__init(RecomputeNonLocals, OutsideVars,
> -		Varset, VarTypes, QuantInfo) :-
> +		Varset, VarTypes, TVarMap, TypeInfoLiveness, QuantInfo) :-
>  	set__init(QuantVars),
>  	set__init(NonLocals),
>  	set__init(LambdaOutsideVars),
> @@ -1161,98 +1173,101 @@
>  	OverlapWarnings = [],
>  	QuantInfo = quant_info(RecomputeNonLocals, OutsideVars, QuantVars,
>  		LambdaOutsideVars, NonLocals, Seen, Varset, VarTypes,
> -		OverlapWarnings).
> +		TVarMap, TypeInfoLiveness, OverlapWarnings).
>  
> -:- pred quantification__get_nonlocals_to_recompute(nonlocals_to_recompute,
> -		quant_info, quant_info).
> -:- mode quantification__get_nonlocals_to_recompute(out, in, out) is det.
> +:- pred quantification__get_nonlocals_to_recompute(nonlocals_to_recompute::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_nonlocals_to_recompute(Q ^ nonlocals_to_recompute, Q, Q).
>  
> -:- pred quantification__get_outside(set(prog_var), quant_info, quant_info).
> -:- mode quantification__get_outside(out, in, out) is det.
> +:- pred quantification__get_outside(set(prog_var)::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_outside(Q ^ outside, Q, Q).
>  
> -:- pred quantification__set_outside(set(prog_var), quant_info, quant_info).
> -:- mode quantification__set_outside(in, in, out) is det.
> +:- pred quantification__set_outside(set(prog_var)::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_outside(Outside, Q0, Q0 ^ outside := Outside).
>  
> -:- pred quantification__get_quant_vars(set(prog_var), quant_info, quant_info).
> -:- mode quantification__get_quant_vars(out, in, out) is det.
> +:- pred quantification__get_quant_vars(set(prog_var)::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_quant_vars(Q ^ quant_vars, Q, Q).
>  
> -:- pred quantification__set_quant_vars(set(prog_var), quant_info, quant_info).
> -:- mode quantification__set_quant_vars(in, in, out) is det.
> +:- pred quantification__set_quant_vars(set(prog_var)::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_quant_vars(QuantVars, Q0, Q0 ^ quant_vars := QuantVars).
>  
> -:- pred quantification__get_lambda_outside(set(prog_var),
> -		quant_info, quant_info).
> -:- mode quantification__get_lambda_outside(out, in, out) is det.
> +:- pred quantification__get_lambda_outside(set(prog_var)::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_lambda_outside(Q ^ lambda_outside, Q, Q).
>  
> -:- pred quantification__set_lambda_outside(set(prog_var),
> -		quant_info, quant_info).
> -:- mode quantification__set_lambda_outside(in, in, out) is det.
> +:- pred quantification__set_lambda_outside(set(prog_var)::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_lambda_outside(LambdaOutsideVars, Q0,
>  		Q0 ^ lambda_outside := LambdaOutsideVars).
>  
> -:- pred quantification__get_nonlocals(set(prog_var), quant_info, quant_info).
> -:- mode quantification__get_nonlocals(out, in, out) is det.
> +:- pred quantification__get_nonlocals(set(prog_var)::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_nonlocals(Q ^ nonlocals, Q, Q).
>  
> -:- pred quantification__set_nonlocals(set(prog_var), quant_info, quant_info).
> -:- mode quantification__set_nonlocals(in, in, out) is det.
> +:- pred quantification__set_nonlocals(set(prog_var)::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_nonlocals(NonLocals, Q0, Q0 ^ nonlocals := NonLocals).
>  
> -:- pred quantification__get_seen(set(prog_var), quant_info, quant_info).
> -:- mode quantification__get_seen(out, in, out) is det.
> +:- pred quantification__get_seen(set(prog_var)::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_seen(Q ^ seen, Q, Q).
>  
> -:- pred quantification__set_seen(set(prog_var), quant_info, quant_info).
> -:- mode quantification__set_seen(in, in, out) is det.
> +:- pred quantification__set_seen(set(prog_var)::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_seen(Seen, Q0, Q0 ^ seen := Seen).
>  
> -:- pred quantification__get_varset(prog_varset, quant_info, quant_info).
> -:- mode quantification__get_varset(out, in, out) is det.
> +:- pred quantification__get_varset(prog_varset::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_varset(Q ^ varset, Q, Q).
>  
> -:- pred quantification__set_varset(prog_varset, quant_info, quant_info).
> -:- mode quantification__set_varset(in, in, out) is det.
> +:- pred quantification__set_varset(prog_varset::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_varset(Varset, Q0, Q0 ^ varset := Varset).
>  
> -:- pred quantification__get_vartypes(map(prog_var, type),
> -		quant_info, quant_info).
> -:- mode quantification__get_vartypes(out, in, out) is det.
> +:- pred quantification__get_vartypes(vartypes::out,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__get_vartypes(Q ^ vartypes, Q, Q).
>  
> -:- pred quantification__set_vartypes(map(prog_var, type),
> -		quant_info, quant_info).
> -:- mode quantification__set_vartypes(in, in, out) is det.
> +:- pred quantification__set_vartypes(vartypes::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_vartypes(VarTypes, Q0, Q0 ^ vartypes := VarTypes).
>  
> -:- pred quantification__get_warnings(list(quant_warning),
> -					quant_info, quant_info).
> -:- mode quantification__get_warnings(out, in, out) is det.
> +:- pred quantification__get_type_info_varmap(type_info_varmap::out,
> +	quant_info::in, quant_info::out) is det.
>  
> +quantification__get_type_info_varmap(Q ^ type_info_varmap, Q, Q).
> +
> +:- pred quantification__get_typeinfo_liveness(bool::out,
> +	quant_info::in, quant_info::out) is det.
> +
> +quantification__get_typeinfo_liveness(Q ^ typeinfo_liveness, Q, Q).
> +
> +:- pred quantification__get_warnings(list(quant_warning)::out,
> +	quant_info::in, quant_info::out) is det.
> +
>  quantification__get_warnings(Q ^ warnings, Q, Q).
>  
> -:- pred quantification__set_warnings(list(quant_warning),
> -					quant_info, quant_info).
> -:- mode quantification__set_warnings(in, in, out) is det.
> +:- pred quantification__set_warnings(list(quant_warning)::in,
> +	quant_info::in, quant_info::out) is det.
>  
>  quantification__set_warnings(Warnings, Q0, Q0 ^ warnings := Warnings).
>  
> Index: compiler/saved_vars.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/saved_vars.m,v
> retrieving revision 1.23
> diff -u -b -r1.23 saved_vars.m
> --- compiler/saved_vars.m	2000/03/28 03:40:32	1.23
> +++ compiler/saved_vars.m	2000/07/29 02:55:47
> @@ -58,6 +58,7 @@
>  	proc_info_goal(ProcInfo0, Goal0),
>  	proc_info_varset(ProcInfo0, Varset0),
>  	proc_info_vartypes(ProcInfo0, VarTypes0),
> +	proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
>  	init_slot_info(Varset0, VarTypes0, SlotInfo0),
>  
>  	saved_vars_in_goal(Goal0, SlotInfo0, Goal1, SlotInfo),
> @@ -68,10 +69,13 @@
>  	% hlds_out__write_goal(Goal1, ModuleInfo, Varset1, 0, "\n"),
>  
>  	% recompute the nonlocals for each goal
> +	module_info_globals(ModuleInfo0, Globals),
> +	body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  	implicitly_quantify_clause_body(HeadVars, Goal1, Varset1,
> -		VarTypes1, Goal2, Varset, VarTypes, _Warnings),
> +		VarTypes1, TVarMap, TypeInfoLiveness,
> +		Goal2, Varset, VarTypes, _Warnings),
>  	proc_info_get_initial_instmap(ProcInfo0, ModuleInfo0, InstMap0),
> -	recompute_instmap_delta(no, Goal2, Goal, VarTypes, InstMap0, 
> +	recompute_instmap_delta(no, Goal2, Goal, VarTypes, TVarMap, InstMap0, 
>  		ModuleInfo0, ModuleInfo),
>  
>  	% hlds_out__write_goal(Goal, ModuleInfo, Varset, 0, "\n"),
> Index: compiler/simplify.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/simplify.m,v
> retrieving revision 1.77
> diff -u -b -r1.77 simplify.m
> --- compiler/simplify.m	2000/04/05 06:28:28	1.77
> +++ compiler/simplify.m	2000/07/29 03:02:39
> @@ -154,10 +154,11 @@
>  	proc_info_get_initial_instmap(ProcInfo0, ModuleInfo0, InstMap0),
>  	proc_info_varset(ProcInfo0, VarSet0),
>  	proc_info_vartypes(ProcInfo0, VarTypes0),
> +	proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
>  	proc_info_goal(ProcInfo0, Goal0),
>  
>  	simplify_info_init(DetInfo0, Simplifications, InstMap0,
> -		VarSet0, VarTypes0, Info0),
> +		VarSet0, VarTypes0, TVarMap, Info0),
>  	simplify__process_goal(Goal0, Goal, Info0, Info),
>  	
>  	simplify_info_get_varset(Info, VarSet),
> @@ -207,8 +208,12 @@
>  	( simplify_info_requantify(Info1) ->
>  		Goal1 = _ - GoalInfo1,
>  		goal_info_get_nonlocals(GoalInfo1, NonLocals),
> -
> -		implicitly_quantify_goal(Goal1, VarSet0, VarTypes0, NonLocals,
> +		simplify_info_get_type_info_varmap(Info1, TVarMap),
> +		simplify_info_get_module_info(Info1, ModuleInfo1),
> +		module_info_globals(ModuleInfo1, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
> +		implicitly_quantify_goal(Goal1, VarSet0, VarTypes0,
> +			TVarMap, TypeInfoLiveness, NonLocals,
>  			Goal2, VarSet, VarTypes, _),
>  
>  		simplify_info_set_varset(Info1, VarSet, Info2),
> @@ -222,7 +227,7 @@
>  
>  		simplify_info_get_module_info(Info3, ModuleInfo3),
>  		recompute_instmap_delta(RecomputeAtomic, Goal2, Goal3,
> -			VarTypes, InstMap0, ModuleInfo3, ModuleInfo4),
> +			VarTypes, TVarMap, InstMap0, ModuleInfo3, ModuleInfo4),
>  		simplify_info_set_module_info(Info3, ModuleInfo4, Info4)
>  	;
>  		Goal3 = Goal1,
> @@ -1319,7 +1324,7 @@
>  
>  simplify__type_info_locn(TypeVar, TypeInfoVar, Goals) -->
>  	=(Info0),
> -	{ simplify_info_get_typeinfo_map(Info0, TypeInfoMap) },
> +	{ simplify_info_get_type_info_varmap(Info0, TypeInfoMap) },
>  	{ map__lookup(TypeInfoMap, TypeVar, TypeInfoLocn) },
>  	(
>  			% If the typeinfo is available in a variable,
> @@ -1882,31 +1887,38 @@
>  
>  :- type simplify_info
>  	--->	simplify_info(
> -			det_info,
> -			set(det_msg),
> -			set(simplification),
> -			common_info,	% Info about common subexpressions.
> -			instmap,
> -			prog_varset,
> -			map(prog_var, type),
> -			bool,		% Does the goal need requantification.
> -			bool,		% Do we need to recompute
> +			det_info	::	det_info,
> +			msgs		::	set(det_msg),
> +			simplifications	::	set(simplification),
> +			common_info	::	common_info,
> +					% Info about common subexpressions.
> +			instmap		::	instmap,
> +			varset		::	prog_varset,
> +			var_types	::	map(prog_var, type),
> +			requantify	::	bool,
> +					% Does the goal need requantification.
> +			recompute_atomic ::	bool,
> +					% Do we need to recompute
>  					% instmap_deltas for atomic goals
> -			bool,		% Does determinism analysis need to
> +			rerun_det	::	bool,
> +					% Does determinism analysis need to
>  					% be rerun.
> -			int,		% Measure of the improvement in
> +			cost_delta	::	int,
> +					% Measure of the improvement in
>  					% the goal from simplification.
> -			int		% Count of the number of lambdas
> +			lambdas		::	int,
> +					% Count of the number of lambdas
>  					% which enclose the current goal.
> +			type_info_varmap ::	type_info_varmap
>  		).
>  
>  simplify_info_init(DetInfo, Simplifications0, InstMap,
> -		VarSet, VarTypes, Info) :-
> +		VarSet, VarTypes, TVarMap, Info) :-
>  	common_info_init(CommonInfo),
>  	set__init(Msgs),
>  	set__list_to_set(Simplifications0, Simplifications),
>  	Info = simplify_info(DetInfo, Msgs, Simplifications, CommonInfo,
> -			InstMap, VarSet, VarTypes, no, no, no, 0, 0). 
> +			InstMap, VarSet, VarTypes, no, no, no, 0, 0, TVarMap). 
>  
>  	% Reinitialise the simplify_info before reprocessing a goal.
>  :- pred simplify_info_reinit(set(simplification)::in, instmap::in,
> @@ -1914,10 +1926,10 @@
>  
>  simplify_info_reinit(Simplifications, InstMap0, Info0, Info) :-
>  	Info0 = simplify_info(DetInfo, Msgs, _, _, _,
> -		VarSet, VarTypes, _, _, _, CostDelta, _),
> +		VarSet, VarTypes, _, _, _, CostDelta, _, TVarMap),
>  	common_info_init(Common),
>  	Info = simplify_info(DetInfo, Msgs, Simplifications, Common, InstMap0,
> -		VarSet, VarTypes, no, no, no, CostDelta, 0).
> +		VarSet, VarTypes, no, no, no, CostDelta, 0, TVarMap).
>  
>  	% exported for common.m
>  :- interface.
> @@ -1926,8 +1938,8 @@
>  :- import_module set.
>  
>  :- pred simplify_info_init(det_info, list(simplification), instmap,
> -		prog_varset, map(prog_var, type), simplify_info).
> -:- mode simplify_info_init(in, in, in, in, in, out) is det.
> +		prog_varset, vartypes, type_info_varmap, simplify_info).
> +:- mode simplify_info_init(in, in, in, in, in, in, out) is det.
>  
>  :- pred simplify_info_get_det_info(simplify_info::in, det_info::out) is det.
>  :- pred simplify_info_get_msgs(simplify_info::in, set(det_msg)::out) is det.
> @@ -1938,33 +1950,34 @@
>  		common_info::out) is det.
>  :- pred simplify_info_get_varset(simplify_info::in, prog_varset::out) is det.
>  :- pred simplify_info_get_var_types(simplify_info::in,
> -		map(prog_var, type)::out) is det.
> +		vartypes::out) is det.
>  :- pred simplify_info_requantify(simplify_info::in) is semidet.
>  :- pred simplify_info_recompute_atomic(simplify_info::in) is semidet.
>  :- pred simplify_info_rerun_det(simplify_info::in) is semidet.
>  :- pred simplify_info_get_cost_delta(simplify_info::in, int::out) is det.
> +:- pred simplify_info_get_type_info_varmap(simplify_info::in,
> +		type_info_varmap::out) is det.
>  
>  :- pred simplify_info_get_module_info(simplify_info::in,
>  		module_info::out) is det.
>  
>  :- implementation.
>  
> -simplify_info_get_det_info(simplify_info(Det, _,_,_,_,_,_,_,_,_,_,_), Det). 
> -simplify_info_get_msgs(simplify_info(_, Msgs, _,_,_,_,_,_,_,_,_,_), Msgs).
> -simplify_info_get_simplifications(simplify_info(_,_,Simplify,_,_,_,_,_,_,_,_,_),
> -	Simplify). 
> -simplify_info_get_common_info(simplify_info(_,_,_,Common, _,_,_,_,_,_,_,_),
> -	Common).
> -simplify_info_get_instmap(simplify_info(_,_,_,_, InstMap,_,_,_,_,_,_,_),
> -	InstMap). 
> -simplify_info_get_varset(simplify_info(_,_,_,_,_, VarSet, _,_,_,_,_,_), VarSet).
> -simplify_info_get_var_types(simplify_info(_,_,_,_,_,_, VarTypes, _,_,_,_,_),
> -	VarTypes). 
> -simplify_info_requantify(simplify_info(_,_,_,_,_,_,_, yes, _,_,_,_)).
> -simplify_info_recompute_atomic(simplify_info(_,_,_,_,_,_,_,_, yes,_,_,_)).
> -simplify_info_rerun_det(simplify_info(_,_,_,_,_,_,_,_,_, yes,_,_)).
> -simplify_info_get_cost_delta(simplify_info(_,_,_,_,_,_,_,_,_,_,CostDelta, _),
> -	CostDelta).
> +simplify_info_get_det_info(SI, SI^det_info).
> +simplify_info_get_msgs(SI, SI^msgs).
> +simplify_info_get_simplifications(SI, SI^simplifications).
> +simplify_info_get_common_info(SI, SI^common_info).
> +simplify_info_get_instmap(SI, SI^instmap).
> +simplify_info_get_varset(SI, SI^varset).
> +simplify_info_get_var_types(SI, SI^var_types).
> +simplify_info_requantify(SI) :-
> +	SI^requantify = yes.
> +simplify_info_recompute_atomic(SI) :-
> +	SI^recompute_atomic = yes.
> +simplify_info_rerun_det(SI) :-
> +	SI^rerun_det = yes.
> +simplify_info_get_cost_delta(SI, SI^cost_delta).
> +simplify_info_get_type_info_varmap(SI, SI^type_info_varmap).
>  
>  simplify_info_get_module_info(Info, ModuleInfo) :-
>  	simplify_info_get_det_info(Info, DetInfo),
> @@ -2012,38 +2025,20 @@
>  
>  :- implementation.
>  
> -simplify_info_set_det_info(simplify_info(_, B, C, D, E, F, G, H, I, J, K, L),
> -		Det, simplify_info(Det, B, C, D, E, F, G, H, I, J, K, L)).
> -simplify_info_set_msgs(simplify_info(A, _, C, D, E, F, G, H, I, J, K, L), Msgs,
> -		simplify_info(A, Msgs, C, D, E, F, G, H, I, J, K, L)). 
> -simplify_info_set_simplifications(
> -		simplify_info(A, B, _, D, E, F, G, H, I, J, K, L),
> -		Simp, simplify_info(A, B, Simp, D, E, F, G, H, I, J, K, L)).
> -simplify_info_set_instmap(simplify_info(A, B, C, D, _, F, G, H, I, J, K, L), 
> -		InstMap, 
> -		simplify_info(A, B, C, D, InstMap, F, G, H, I, J, K, L)). 
> -simplify_info_set_common_info(simplify_info(A, B, C, _, E, F, G, H, I, J, K, L),
> -		Common, 
> -		simplify_info(A, B, C, Common, E, F, G, H, I, J, K, L)). 
> -simplify_info_set_varset(simplify_info(A, B, C, D, E, _, G, H, I, J, K, L), 
> -		VarSet, 
> -		simplify_info(A, B, C, D, E, VarSet, G, H, I, J, K, L)). 
> -simplify_info_set_var_types(simplify_info(A, B, C, D, E, F, _, H, I, J, K, L),
> -		VarTypes, simplify_info(A, B, C, D, E, F, VarTypes, H,I,J,K,L)).
> -simplify_info_set_requantify(simplify_info(A, B, C, D, E, F, G, _, I, J, K, L),
> -		simplify_info(A, B, C, D, E, F, G, yes, I, J, K, L)). 
> -simplify_info_set_recompute_atomic(simplify_info(A, B, C, D, E, F, G,H,_,J,K,L),
> -		simplify_info(A, B, C, D, E, F, G, H, yes, J, K, L)). 
> -simplify_info_set_rerun_det(simplify_info(A, B, C, D, E, F, G,H,I,_,K,L),
> -		simplify_info(A, B, C, D, E, F, G, H, I, yes, K, L)). 
> -simplify_info_set_cost_delta(simplify_info(A, B, C, D, E, F, G, H, I, J, _, L),
> -		Delta, simplify_info(A, B, C, D, E, F, G, H, I, J, Delta, L)). 
> -
> -simplify_info_incr_cost_delta(
> -		simplify_info(A, B, C, D, E, F,G,H,I,J, Delta0, L),
> -		Incr, simplify_info(A, B, C, D, E, F, G, H, I, J, Delta, L)) :-
> -	Delta is Delta0 + Incr.
> +simplify_info_set_det_info(SI, Det, SI^det_info := Det).
> +simplify_info_set_msgs(SI, Msgs, SI^msgs := Msgs). 
> +simplify_info_set_simplifications(SI, Simp, SI^simplifications := Simp).
> +simplify_info_set_instmap(SI, InstMap, SI^instmap := InstMap). 
> +simplify_info_set_common_info(SI, Common, SI^common_info := Common). 
> +simplify_info_set_varset(SI, VarSet, SI^varset := VarSet). 
> +simplify_info_set_var_types(SI, VarTypes, SI^var_types := VarTypes).
> +simplify_info_set_requantify(SI, SI^requantify := yes).
> +simplify_info_set_recompute_atomic(SI, SI^recompute_atomic := yes).
> +simplify_info_set_rerun_det(SI, SI^rerun_det := yes).
> +simplify_info_set_cost_delta(SI, Delta, SI^cost_delta := Delta).
>  
> +simplify_info_incr_cost_delta(SI, Incr, SI^cost_delta := SI^cost_delta + Incr).
> +
>  simplify_info_add_msg(Info0, Msg, Info) :-
>  	( simplify_do_warn(Info0) ->
>  		simplify_info_do_add_msg(Info0, Msg, Info)
> @@ -2056,14 +2051,9 @@
>  	set__insert(Msgs0, Msg, Msgs),
>  	simplify_info_set_msgs(Info0, Msgs, Info).
>  
> -simplify_info_enter_lambda(
> -		simplify_info(A, B, C, D, E, F, G, H, I, J, K, LambdaCount0),
> -		simplify_info(A, B, C, D, E, F, G, H, I, J, K, LambdaCount)) :-
> -	LambdaCount is LambdaCount0 + 1.
> -simplify_info_leave_lambda(
> -		simplify_info(A, B, C, D, E, F, G, H, I, J, K, LambdaCount0),
> -		simplify_info(A, B, C, D, E, F, G, H, I, J, K, LambdaCount)) :-
> -	LambdaCount1 is LambdaCount0 - 1,
> +simplify_info_enter_lambda(SI, SI^lambdas := SI^lambdas + 1).
> +simplify_info_leave_lambda(SI, SI^lambdas := LambdaCount) :-
> +	LambdaCount1 is SI^lambdas - 1,
>  	(
>  		LambdaCount1 >= 0
>  	->
> @@ -2071,9 +2061,8 @@
>  	;
>  		error("simplify_info_leave_lambda: Left too many lambdas")
>  	).
> -simplify_info_inside_lambda(
> -		simplify_info(_,_,_,_,_,_,_,_,_,_,_,LambdaCount)) :-
> -	LambdaCount > 0.
> +simplify_info_inside_lambda(SI) :-
> +	SI^lambdas > 0.
>  
>  simplify_info_set_module_info(Info0, ModuleInfo, Info) :-
>  	simplify_info_get_det_info(Info0, DetInfo0),
> @@ -2118,25 +2107,11 @@
>  	simplify_info_get_simplifications(Info, Simplifications),
>  	set__member(extra_common_struct, Simplifications).
>  
> -:- pred simplify_info_get_typeinfo_map(simplify_info::in,
> -		map(tvar, type_info_locn)::out) is det.
> -
> -simplify_info_get_typeinfo_map(Info0, TypeInfoMap) :-
> -	simplify_info_get_det_info(Info0, DetInfo0),
> -	det_info_get_module_info(DetInfo0, ModuleInfo),
> -	det_info_get_pred_id(DetInfo0, ThisPredId),
> -	det_info_get_proc_id(DetInfo0, ThisProcId),
> -	module_info_pred_proc_info(ModuleInfo, ThisPredId, ThisProcId,
> -		_PredInfo, ProcInfo),
> -	proc_info_typeinfo_varmap(ProcInfo, TypeInfoMap).
> -
>  :- pred simplify_info_update_instmap(simplify_info::in, hlds_goal::in,
>  		simplify_info::out) is det.
>  
> -simplify_info_update_instmap(
> -		simplify_info(A, B, C, D, InstMap0, F, G, H, I, J, K, L), Goal,
> -		simplify_info(A, B, C, D, InstMap, F, G, H, I, J, K, L)) :-
> -	update_instmap(Goal, InstMap0, InstMap).
> +simplify_info_update_instmap(SI, Goal, SI^instmap := InstMap) :-
> +	update_instmap(Goal, SI^instmap, InstMap).
>  
>  :- type before_after
>  	--->	before
> Index: compiler/unify_proc.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/unify_proc.m,v
> retrieving revision 1.83
> diff -u -b -r1.83 unify_proc.m
> --- compiler/unify_proc.m	2000/04/18 03:35:36	1.83
> +++ compiler/unify_proc.m	2000/07/29 03:23:06
> @@ -700,8 +700,10 @@
>  unify_proc__quantify_clause_body(HeadVars, Goal, Context, Clauses) -->
>  	unify_proc__info_get_varset(Varset0),
>  	unify_proc__info_get_types(Types0),
> -	{ implicitly_quantify_clause_body(HeadVars, Goal,
> -		Varset0, Types0, Body, Varset, Types, _Warnings) },
> +	unify_proc__info_get_type_info_varmap(TVarMap),
> +	{ TypeInfoLiveness = no },
> +	{ implicitly_quantify_clause_body(HeadVars, Goal, Varset0, Types0,
> +		TVarMap, TypeInfoLiveness, Body, Varset, Types, _Warnings) },
>  	unify_proc__info_set_varset(Varset),
>  	unify_proc__info_set_types(Types),
>  	{ Clauses = [clause([], Body, Context)] }.
> @@ -765,8 +767,10 @@
>  	{ conj_list_to_goal(GoalList, GoalInfo, Goal) },
>  	unify_proc__info_get_varset(Varset0),
>  	unify_proc__info_get_types(Types0),
> -	{ implicitly_quantify_clause_body([H1, H2], Goal,
> -		Varset0, Types0, Body, Varset, Types, _Warnings) },
> +	unify_proc__info_get_type_info_varmap(TVarMap),
> +	{ TypeInfoLiveness = no },
> +	{ implicitly_quantify_clause_body([H1, H2], Goal, Varset0, Types0,
> +		TVarMap, TypeInfoLiveness, Body, Varset, Types, _Warnings) },
>  	unify_proc__info_set_varset(Varset),
>  	unify_proc__info_set_types(Types),
>  	{ Clause = clause([], Body, Context) },
> @@ -820,8 +824,10 @@
>  	{ conj_list_to_goal(GoalList, GoalInfo, Goal) },
>  	unify_proc__info_get_varset(Varset0),
>  	unify_proc__info_get_types(Types0),
> -	{ implicitly_quantify_clause_body([X, Index], Goal,
> -		Varset0, Types0, Body, Varset, Types, _Warnings) },
> +	unify_proc__info_get_type_info_varmap(TVarMap),
> +	{ TypeInfoLiveness = no },
> +	{ implicitly_quantify_clause_body([X, Index], Goal, Varset0, Types0,
> +		TVarMap, TypeInfoLiveness, Body, Varset, Types, _Warnings) },
>  	unify_proc__info_set_varset(Varset),
>  	unify_proc__info_set_types(Types),
>  	{ Clause = clause([], Body, Context) },
> @@ -885,8 +891,10 @@
>  	{ ArgVars = [Res, X, Y] },
>  	unify_proc__info_get_varset(Varset0),
>  	unify_proc__info_get_types(Types0),
> -	{ implicitly_quantify_clause_body(ArgVars, Goal,
> -		Varset0, Types0, Body, Varset, Types, _Warnings) },
> +	unify_proc__info_get_type_info_varmap(TVarMap),
> +	{ TypeInfoLiveness = no },
> +	{ implicitly_quantify_clause_body(ArgVars, Goal, Varset0, Types0,
> +		TVarMap, TypeInfoLiveness, Body, Varset, Types, _Warnings) },
>  	unify_proc__info_set_varset(Varset),
>  	unify_proc__info_set_types(Types),
>  	{ Clause = clause([], Body, Context) }.
> @@ -1288,40 +1296,25 @@
>  
>  :- type unify_proc_info.
>  
> -:- pred unify_proc__info_init(module_info, unify_proc_info).
> -:- mode unify_proc__info_init(in, out) is det.
> -
> -:- pred unify_proc__info_new_var(type, prog_var,
> -		unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_new_var(in, out, in, out) is det.
> -
> -:- pred unify_proc__info_new_named_var(type, string, prog_var,
> -		unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_new_named_var(in, in, out, in, out) is det.
> -
> -:- pred unify_proc__info_extract(unify_proc_info, prog_varset,
> -		map(prog_var, type)).
> -:- mode unify_proc__info_extract(in, out, out) is det.
> -
> -:- pred unify_proc__info_get_varset(prog_varset,
> -		unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_get_varset(out, in, out) is det.
> -
> -:- pred unify_proc__info_set_varset(prog_varset,
> -		unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_set_varset(in, in, out) is det.
> -
> -:- pred unify_proc__info_get_types(map(prog_var, type),
> -		unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_get_types(out, in, out) is det.
> -
> -:- pred unify_proc__info_set_types(map(prog_var, type),
> -		unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_set_types(in, in, out) is det.
> -
> -:- pred unify_proc__info_get_module_info(module_info,
> -					unify_proc_info, unify_proc_info).
> -:- mode unify_proc__info_get_module_info(out, in, out) is det.
> +:- pred unify_proc__info_init(module_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_new_var((type)::in, prog_var::out,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_new_named_var((type)::in, string::in, prog_var::out,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_extract(unify_proc_info::in,
> +	prog_varset::out, vartypes::out) is det.
> +:- pred unify_proc__info_get_varset(prog_varset::out,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_set_varset(prog_varset::in,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_get_types(vartypes::out,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_set_types(vartypes::in,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_get_type_info_varmap(type_info_varmap::out,
> +	unify_proc_info::in, unify_proc_info::out) is det.
> +:- pred unify_proc__info_get_module_info(module_info::out,
> +	unify_proc_info::in, unify_proc_info::out) is det.
>  
>  %-----------------------------------------------------------------------------%
>  
> @@ -1329,46 +1322,36 @@
>  
>  :- type unify_proc_info
>  	--->	unify_proc_info(
> -			prog_varset,
> -			map(prog_var, type),
> -			module_info
> +			varset			::	prog_varset,
> +			vartypes		::	vartypes,
> +			type_info_varmap	::	type_info_varmap,
> +			module_info		::	module_info
>  		).
>  
> -unify_proc__info_init(ModuleInfo, VarTypeInfo) :-
> +unify_proc__info_init(ModuleInfo, UPI) :-
>  	varset__init(VarSet),
>  	map__init(Types),
> -	VarTypeInfo = unify_proc_info(VarSet, Types, ModuleInfo).
> -
> -unify_proc__info_new_var(Type, Var,
> -		unify_proc_info(VarSet0, Types0, ModuleInfo),
> -		unify_proc_info(VarSet, Types, ModuleInfo)) :-
> -	varset__new_var(VarSet0, Var, VarSet),
> -	map__det_insert(Types0, Var, Type, Types).
> -
> -unify_proc__info_new_named_var(Type, Name, Var,
> -		unify_proc_info(VarSet0, Types0, ModuleInfo),
> -		unify_proc_info(VarSet, Types, ModuleInfo)) :-
> -	varset__new_named_var(VarSet0, Name, Var, VarSet),
> -	map__det_insert(Types0, Var, Type, Types).
> -
> -unify_proc__info_extract(unify_proc_info(VarSet, Types, _ModuleInfo),
> -			VarSet, Types).
> -
> -unify_proc__info_get_varset(VarSet, ProcInfo, ProcInfo) :-
> -	ProcInfo = unify_proc_info(VarSet, _Types, _ModuleInfo).
> -
> -unify_proc__info_set_varset(VarSet, unify_proc_info(_VarSet, Types, ModuleInfo),
> -				unify_proc_info(VarSet, Types, ModuleInfo)).
> -
> -unify_proc__info_get_types(Types, ProcInfo, ProcInfo) :-
> -	ProcInfo = unify_proc_info(_VarSet, Types, _ModuleInfo).
> -
> -unify_proc__info_set_types(Types, unify_proc_info(VarSet, _Types, ModuleInfo),
> -				unify_proc_info(VarSet, Types, ModuleInfo)).
> +	map__init(TVarMap),
> +	UPI = unify_proc_info(VarSet, Types, TVarMap, ModuleInfo).
>  
> -unify_proc__info_get_module_info(ModuleInfo, VarTypeInfo, VarTypeInfo) :-
> -	VarTypeInfo = unify_proc_info(_VarSet, _Types, ModuleInfo).
> +unify_proc__info_new_var(Type, Var, UPI,
> +		(UPI^varset := VarSet) ^vartypes := Types) :-
> +	varset__new_var(UPI^varset, Var, VarSet),
> +	map__det_insert(UPI^vartypes, Var, Type, Types).
> +
> +unify_proc__info_new_named_var(Type, Name, Var, UPI,
> +		(UPI^varset := VarSet) ^vartypes := Types) :-
> +	varset__new_named_var(UPI^varset, Name, Var, VarSet),
> +	map__det_insert(UPI^vartypes, Var, Type, Types).
> +
> +unify_proc__info_extract(UPI, UPI^varset, UPI^vartypes).
> +
> +unify_proc__info_get_varset(UPI^varset, UPI, UPI).
> +unify_proc__info_get_types(UPI^vartypes, UPI, UPI).
> +unify_proc__info_get_type_info_varmap(UPI^type_info_varmap, UPI, UPI).
> +unify_proc__info_get_module_info(UPI^module_info, UPI, UPI).
>  
> -% :- end_module unify_proc_info.
> +unify_proc__info_set_varset(VarSet, UPI, UPI^varset := VarSet).
> +unify_proc__info_set_types(Types, UPI, UPI^vartypes := Types).
>  
>  %-----------------------------------------------------------------------------%
> Index: compiler/unique_modes.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/unique_modes.m,v
> retrieving revision 1.61
> diff -u -b -r1.61 unique_modes.m
> --- compiler/unique_modes.m	2000/04/14 08:38:32	1.61
> +++ compiler/unique_modes.m	2000/07/28 09:08:12
> @@ -128,14 +128,15 @@
>  	% 
>  	% Restore the original bag of nondet-live vars
>  	%
> -	mode_info_set_nondet_live_vars(NondetLiveVars0, ModeInfo3, ModeInfo),
> +	mode_info_set_nondet_live_vars(NondetLiveVars0, ModeInfo3, ModeInfo4),
>  
>  	%
>  	% Grab the final instmap, compute the change in insts
>  	% over this goal, and save that instmap_delta in the goal_info.
>  	%
>  	mode_info_get_instmap(ModeInfo, InstMap),
> -	goal_info_get_nonlocals(GoalInfo0, NonLocals),
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals,
> +		ModeInfo4, ModeInfo),
>  	compute_instmap_delta(InstMap0, InstMap, NonLocals, DeltaInstMap),
>  	goal_info_set_instmap_delta(GoalInfo0, DeltaInstMap, GoalInfo),
>  
> @@ -263,12 +264,12 @@
>  unique_modes__check_goal_2(par_conj(List0, SM), GoalInfo0,
>  		par_conj(List, SM)) -->
>  	mode_checkpoint(enter, "par_conj"),
> -	{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  	mode_info_add_live_vars(NonLocals),
>  		% Build a multiset of the nonlocals of the conjuncts
>  		% so that we can figure out which variables must be
>  		% made shared at the start of the parallel conjunction.
> -	{ make_par_conj_nonlocal_multiset(List0, NonLocalsBag) },
> +	make_par_conj_nonlocal_multiset(List0, NonLocalsBag),
>  	unique_modes__check_par_conj(List0, NonLocalsBag, List, InstMapList),
>  	instmap__unify(NonLocals, InstMapList),
>  	mode_info_remove_live_vars(NonLocals),
> @@ -294,7 +295,7 @@
>  		% disjuncts.  But we handle that seperately for each
>  		% disjunct, in unique_modes__check_disj.
>  		%
> -		{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +		mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  		{ goal_info_get_code_model(GoalInfo0, CodeModel) },
>  		% does this disjunction create a choice point?
>  		( { CodeModel = model_non } ->
> @@ -318,10 +319,10 @@
>  unique_modes__check_goal_2(if_then_else(Vs, A0, B0, C0, SM), GoalInfo0, Goal)
>  		-->
>  	mode_checkpoint(enter, "if-then-else"),
> -	{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> -	{ unique_modes__goal_get_nonlocals(A0, A_Vars) },
> -	{ unique_modes__goal_get_nonlocals(B0, B_Vars) },
> -	{ unique_modes__goal_get_nonlocals(C0, C_Vars) },
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
> +	mode_info_get_goal_completed_nonlocals(A0, A_Vars),
> +	mode_info_get_goal_completed_nonlocals(B0, B_Vars),
> +	mode_info_get_goal_completed_nonlocals(C0, C_Vars),
>  	mode_info_dcg_get_instmap(InstMap0),
>  	mode_info_lock_vars(if_then_else, NonLocals),
>  
> @@ -396,7 +397,7 @@
>  	% negation will succeed, and so these variables
>  	% can be accessed again after backtracking.
>  	%
> -	{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +	mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  	{ set__to_sorted_list(NonLocals, NonLocalsList) },
>  	=(ModeInfo),
>  	{ select_live_vars(NonLocalsList, ModeInfo, LiveNonLocals) },
> @@ -500,7 +501,7 @@
>  		{ instmap__init_unreachable(InstMap) },
>  		mode_info_set_instmap(InstMap)
>  	;
> -		{ goal_info_get_nonlocals(GoalInfo0, NonLocals) },
> +		mode_info_get_completed_nonlocals(GoalInfo0, NonLocals),
>  		unique_modes__check_case_list(Cases0, Var, Cases, InstMapList),
>  		instmap__merge(NonLocals, InstMapList, disj)
>  	),
> @@ -656,7 +657,7 @@
>  
>  unique_modes__check_conj([], []) --> [].
>  unique_modes__check_conj([Goal0 | Goals0], [Goal | Goals]) -->
> -	{ unique_modes__goal_get_nonlocals(Goal0, NonLocals) },
> +	mode_info_get_goal_completed_nonlocals(Goal0, NonLocals),
>  	mode_info_remove_live_vars(NonLocals),
>  	unique_modes__check_goal(Goal0, Goal),
>  	mode_info_dcg_get_instmap(InstMap),
> @@ -675,17 +676,20 @@
>  
>  	% make_par_conj_nonlocal_multiset builds a multiset (bag) of all
>  	% the nonlocals of the conjuncts.
> -:- pred make_par_conj_nonlocal_multiset(list(hlds_goal), bag(prog_var)).
> -:- mode make_par_conj_nonlocal_multiset(in, out) is det.
> +:- pred make_par_conj_nonlocal_multiset(list(hlds_goal), bag(prog_var),
> +	mode_info, mode_info).
> +:- mode make_par_conj_nonlocal_multiset(in, out, mode_info_di, mode_info_uo)
> +	is det.
>  
> -make_par_conj_nonlocal_multiset([], Empty) :-
> -	bag__init(Empty).
> -make_par_conj_nonlocal_multiset([G|Gs], NonLocalsMultiSet) :-
> -	make_par_conj_nonlocal_multiset(Gs, NonLocalsMultiSet0),
> -	unique_modes__goal_get_nonlocals(G, NonLocals),
> -	set__to_sorted_list(NonLocals, NonLocalsList),
> -	bag__from_list(NonLocalsList, NonLocalsMultiSet1),
> -	bag__union(NonLocalsMultiSet0, NonLocalsMultiSet1, NonLocalsMultiSet).
> +make_par_conj_nonlocal_multiset([], Empty) -->
> +	{ bag__init(Empty) }.
> +make_par_conj_nonlocal_multiset([Goal | Goals], NonLocalsMultiSet) -->
> +	make_par_conj_nonlocal_multiset(Goals, NonLocalsMultiSet0),
> +	mode_info_get_goal_completed_nonlocals(Goal, NonLocals),
> +	{ set__to_sorted_list(NonLocals, NonLocalsList) },
> +	{ bag__from_list(NonLocalsList, NonLocalsMultiSet1) },
> +	{ bag__union(NonLocalsMultiSet0, NonLocalsMultiSet1,
> +		NonLocalsMultiSet) }.
>  
>  	% To unique-modecheck a parallel conjunction, we find the variables
>  	% that are nonlocal to more than one conjunct and make them shared,
> @@ -738,7 +742,7 @@
>  unique_modes__check_par_conj_1([], [], []) --> [].
>  unique_modes__check_par_conj_1([Goal0 | Goals0], [Goal | Goals],
>  		[InstMap - NonLocals|InstMaps]) -->
> -	{ unique_modes__goal_get_nonlocals(Goal0, NonLocals) },
> +	mode_info_get_goal_completed_nonlocals(Goal0, NonLocals),
>  	mode_info_dcg_get_instmap(InstMap0),
>  	unique_modes__check_goal(Goal0, Goal),
>  	mode_info_dcg_get_instmap(InstMap),
> @@ -825,13 +829,5 @@
>  
>  	mode_info_set_instmap(InstMap0),
>  	unique_modes__check_case_list(Cases0, Var, Cases, InstMaps).
> -
> -%-----------------------------------------------------------------------------%
> -
> -:- pred unique_modes__goal_get_nonlocals(hlds_goal, set(prog_var)).
> -:- mode unique_modes__goal_get_nonlocals(in, out) is det.
> -
> -unique_modes__goal_get_nonlocals(_Goal - GoalInfo, NonLocals) :-
> -	goal_info_get_nonlocals(GoalInfo, NonLocals).
>  
>  %-----------------------------------------------------------------------------%
> Index: compiler/unneeded_code.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/unneeded_code.m,v
> retrieving revision 1.1
> diff -u -b -r1.1 unneeded_code.m
> --- compiler/unneeded_code.m	2000/07/25 09:27:28	1.1
> +++ compiler/unneeded_code.m	2000/07/29 03:25:39
> @@ -196,13 +196,17 @@
>  unneeded_code__process_proc_msg(PredId, ProcId, ProcInfo0, ProcInfo,
>  		ModuleInfo0, ModuleInfo) -->
>  	globals__io_lookup_bool_option(very_verbose, VeryVerbose),
> +	{ module_info_globals(ModuleInfo0, Globals) },
> +	{ body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness) },
>  	( { VeryVerbose = yes } ->
>  		io__write_string("% Removing dead code in "),
> -		hlds_out__write_pred_proc_id(ModuleInfo, PredId, ProcId),
> +		hlds_out__write_pred_proc_id(ModuleInfo0, PredId, ProcId),
>  		io__write_string(": "),
> -		{ unneeded_code__pre_process_proc(ProcInfo0, ProcInfo1) },
> +		{ unneeded_code__pre_process_proc(TypeInfoLiveness,
> +			ProcInfo0, ProcInfo1) },
>  		{ unneeded_code__process_proc(ProcInfo1, ProcInfo,
> -			ModuleInfo0, ModuleInfo, Successful) },
> +			ModuleInfo0, ModuleInfo, TypeInfoLiveness,
> +			Successful) },
>  		(
>  			{ Successful = yes },
>  			io__write_string("done.\n")
> @@ -211,20 +215,23 @@
>  			io__write_string("none found.\n")
>  		)
>  	;
> -		{ unneeded_code__pre_process_proc(ProcInfo0, ProcInfo1) },
> +		{ unneeded_code__pre_process_proc(TypeInfoLiveness,
> +			ProcInfo0, ProcInfo1) },
>  		{ unneeded_code__process_proc(ProcInfo1, ProcInfo,
> -			ModuleInfo0, ModuleInfo, _) }
> +			ModuleInfo0, ModuleInfo, TypeInfoLiveness, _) }
>  	).
>  
> -:- pred unneeded_code__pre_process_proc(proc_info::in, proc_info::out) is det.
> +:- pred unneeded_code__pre_process_proc(bool::in, proc_info::in,
> +	proc_info::out) is det.
>  
> -unneeded_code__pre_process_proc(ProcInfo0, ProcInfo) :-
> +unneeded_code__pre_process_proc(TypeInfoLiveness, ProcInfo0, ProcInfo) :-
>  	proc_info_headvars(ProcInfo0, HeadVars),
>  	proc_info_goal(ProcInfo0, Goal0),
>  	proc_info_varset(ProcInfo0, Varset0),
>  	proc_info_vartypes(ProcInfo0, VarTypes0),
> -	implicitly_quantify_clause_body(HeadVars, Goal0,
> -		Varset0, VarTypes0, Goal, Varset, VarTypes, _Warnings),
> +	proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
> +	implicitly_quantify_clause_body(HeadVars, Goal0, Varset0, VarTypes0,
> +		TVarMap, TypeInfoLiveness, Goal, Varset, VarTypes, _Warnings),
>  	proc_info_set_goal(ProcInfo0, Goal, ProcInfo1),
>  	proc_info_set_varset(ProcInfo1, Varset, ProcInfo2),
>  	proc_info_set_vartypes(ProcInfo2, VarTypes, ProcInfo).
> @@ -263,10 +270,10 @@
>  		).
>  
>  :- pred unneeded_code__process_proc(proc_info::in, proc_info::out,
> -	module_info::in, module_info::out, bool::out) is det.
> +	module_info::in, module_info::out, bool::in, bool::out) is det.
>  
>  unneeded_code__process_proc(ProcInfo0, ProcInfo, ModuleInfo0, ModuleInfo,
> -		Successful) :-
> +		TypeInfoLiveness, Successful) :-
>  	goal_path__fill_slots(ProcInfo0, ModuleInfo0, ProcInfo1),
>  	proc_info_goal(ProcInfo1, Goal0),
>  	proc_info_varset(ProcInfo1, Varset0),
> @@ -301,15 +308,18 @@
>  			% We need to fix up the goal_info by recalculating
>  			% the nonlocal vars and the non-atomic instmap deltas.
>  		proc_info_headvars(ProcInfo0, HeadVars),
> -		implicitly_quantify_clause_body(HeadVars, Goal2,
> -			Varset0, VarTypes0, Goal3, Varset, VarTypes, _Warnings),
> -		recompute_instmap_delta(no, Goal3, Goal, VarTypes, InstMap0,
> -			ModuleInfo0, ModuleInfo1),
> +		proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
> +		implicitly_quantify_clause_body(HeadVars,
> +			Goal2, Varset0, VarTypes0,
> +			TVarMap, TypeInfoLiveness,
> +			Goal3, Varset, VarTypes, _Warnings),
> +		recompute_instmap_delta(no, Goal3, Goal, VarTypes, TVarMap,
> +			InstMap0, ModuleInfo0, ModuleInfo1),
>  		proc_info_set_goal(ProcInfo1, Goal, ProcInfo2),
>  		proc_info_set_varset(ProcInfo2, Varset, ProcInfo3),
>  		proc_info_set_vartypes(ProcInfo3, VarTypes, ProcInfo4),
>  		unneeded_code__process_proc(ProcInfo4, ProcInfo,
> -			ModuleInfo1, ModuleInfo, _),
> +			ModuleInfo1, ModuleInfo, TypeInfoLiveness, _),
>  		Successful = yes
>  	;
>  		ProcInfo = ProcInfo0,
> Index: compiler/unused_args.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/unused_args.m,v
> retrieving revision 1.63
> diff -u -b -r1.63 unused_args.m
> --- compiler/unused_args.m	2000/07/25 09:27:28	1.63
> +++ compiler/unused_args.m	2000/07/29 03:24:36
> @@ -829,6 +829,8 @@
>  		map__det_insert(ProcCallInfo0, proc(PredId, ProcId),
>  		    call_info(NewPredId, NewProcId, PredSymName, UnusedArgs),
>  		    ProcCallInfo),
> +		module_info_globals(ModuleInfo0, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
>  		(
>  			Status0 = exported,
>  			IntermodUnusedArgs = yes(UnusedArgs2)
> @@ -840,7 +842,8 @@
>  				UnusedArgs2, "__ua", exported,
>  				proc(PredId, ProcId), ExtraPredInfo0),
>  			create_call_goal(UnusedArgs, NewPredId, NewProcId,
> -				PredModule, PredName, OldProc0, ExtraProc0),
> +				PredModule, PredName, TypeInfoLiveness,
> +				OldProc0, ExtraProc0),
>  			proc_info_headvars(OldProc0, HeadVars0),
>  			remove_listof_elements(HeadVars0, 1, UnusedArgs2,
>  				IntermodHeadVars),
> @@ -866,7 +869,8 @@
>  		predicate_table_get_preds(PredTable2, Preds0),
>  		pred_info_procedures(PredInfo0, Procs0),
>  		create_call_goal(UnusedArgs, NewPredId, NewProcId,
> -			PredModule, PredName, OldProc0, OldProc),
> +			PredModule, PredName, TypeInfoLiveness,
> +			OldProc0, OldProc),
>  		map__set(Procs0, ProcId, OldProc, Procs),
>  		pred_info_set_procedures(PredInfo0, Procs, PredInfo),
>  		map__det_update(Preds0, PredId, PredInfo, Preds1),
> @@ -965,11 +969,11 @@
>  	% Replace the goal in the procedure with one to call the given
>  	% pred_id and proc_id.
>  :- pred create_call_goal(list(int)::in, pred_id::in, proc_id::in,
> -		module_name::in, string::in, proc_info::in, proc_info::out)
> -		is det.
> +		module_name::in, string::in, bool::in, proc_info::in,
> +		proc_info::out) is det.
>  
>  create_call_goal(UnusedArgs, NewPredId, NewProcId, PredModule,
> -		PredName, OldProc0, OldProc) :-
> +		PredName, TypeInfoLiveness, OldProc0, OldProc) :-
>  	proc_info_headvars(OldProc0, HeadVars),
>  	proc_info_goal(OldProc0, Goal0), 
>  	Goal0 = _GoalExpr - GoalInfo0,
> @@ -984,13 +988,14 @@
>  	GoalExpr = call(NewPredId, NewProcId, NewHeadVars,
>  		      not_builtin, no, qualified(PredModule, PredName)),
>  	Goal1 = GoalExpr - GoalInfo0,
> -	implicitly_quantify_goal(Goal1, Varset0, VarTypes1, NonLocals, 
> +	proc_info_typeinfo_varmap(OldProc0, TVarMap),
> +	implicitly_quantify_goal(Goal1, Varset0, VarTypes1,
> +		TVarMap, TypeInfoLiveness, NonLocals, 
>  			Goal, Varset, VarTypes, _),
>  	proc_info_set_goal(OldProc0, Goal, OldProc1),
>  	proc_info_set_varset(OldProc1, Varset, OldProc2),
>  	proc_info_set_vartypes(OldProc2, VarTypes, OldProc).
>  
> -
>  	% Create a pred_info for an imported pred with a pragma unused_args
>  	% in the .opt file.
>  :- pred make_imported_unused_args_pred_infos(pred_proc_list::in,
> @@ -1151,7 +1156,11 @@
>  		Changed = yes,
>  			% if anything has changed, rerun quantification
>  		set__list_to_set(HeadVars, NonLocals),
> -		implicitly_quantify_goal(Goal1, Varset0, VarTypes0, NonLocals,
> +		proc_info_typeinfo_varmap(ProcInfo0, TVarMap),
> +		module_info_globals(Mod0, Globals),
> +		body_should_use_typeinfo_liveness(Globals, TypeInfoLiveness),
> +		implicitly_quantify_goal(Goal1, Varset0, VarTypes0,
> +			TVarMap, TypeInfoLiveness, NonLocals,
>  						Goal, Varset, VarTypes, _),
>  		proc_info_set_goal(FixedProc2, Goal, FixedProc3),
>  		proc_info_set_varset(FixedProc3, Varset, FixedProc4),
> cvs diff: Diffing compiler/notes
> cvs diff: Diffing debian
> cvs diff: Diffing doc
> cvs diff: Diffing extras
> cvs diff: Diffing extras/aditi
> cvs diff: Diffing extras/cgi
> cvs diff: Diffing extras/clpr
> cvs diff: Diffing extras/clpr/clpr
> cvs diff: Diffing extras/clpr/samples
> 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/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/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/references
> cvs diff: Diffing extras/references/samples
> cvs diff: Diffing extras/references/tests
> cvs diff: Diffing extras/trailed_update
> cvs diff: Diffing extras/trailed_update/samples
> cvs diff: Diffing extras/trailed_update/tests
> 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/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/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 trial
> cvs diff: Diffing util
> --------------------------------------------------------------------------
> mercury-developers mailing list
> Post messages to:       mercury-developers at cs.mu.oz.au
> Administrative Queries: owner-mercury-developers at cs.mu.oz.au
> Subscriptions:          mercury-developers-request at cs.mu.oz.au
> --------------------------------------------------------------------------

-- 
       Tyson Dowd           # 
                            #  Surreal humour isn't everyone's cup of fur.
     trd at cs.mu.oz.au        # 
http://www.cs.mu.oz.au/~trd #
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions:          mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------



More information about the developers mailing list