[m-dev.] for review: --use-local-vars
Tyson Dowd
trd at cs.mu.OZ.AU
Mon Apr 23 19:26:25 AEST 2001
On 23-Apr-2001, Zoltan Somogyi <zs at cs.mu.OZ.AU> wrote:
> On 09-Mar-2001, Fergus Henderson <fjh at cs.mu.OZ.AU> wrote:
> > Otherwise, that looks fine.
>
> Here is the interdiff of the changes I made in response to your comments.
> I will commit this tomorrow unless I hear some objection by then.
I think you should try using interdiff with the -h option, which
generates diffs that are intended for human viewing (although in this
particular change it doesn't make much difference to readability).
>
> Zoltan.
>
> --- compiler/exprn_aux.m
> +++ compiler/exprn_aux.m
> @@ -44,0 +45,9 @@
> + % exprn_aux__substitute_lval_in_instr(OldLval, NewLval, Instr0, Instr,
> + % SubstCount0, SubstCount): substitute all occurrences of OldLval in
> + % Instr0 with NewLval, yielding Instr. Return the number of
> + % substitutions performed as the difference between SubstCount0 and
> + % SubstCount.
> + %
> + % The other exprn_aux__substitute_lval_in_* predicates are similar,
> + % although many do not return substitution counts.
> +
> @@ -224 +233 @@
> - Lval0 = field(_, Rval0, Rval1)
> + Lval0 = field(_MaybeTag, Rval0, Rval1)
> @@ -268 +277 @@
> - Rval0 = unop(_, Rval1),
> + Rval0 = unop(_Unop, Rval1),
> @@ -271 +280 @@
> - Rval0 = binop(_, Rval1, Rval2),
> + Rval0 = binop(_Binop, Rval1, Rval2),
> @@ -284 +293 @@
> -exprn_aux__lval_contains_rval(field(_, Rval0, Rval1), Rval) :-
> +exprn_aux__lval_contains_rval(field(_MaybeTag, Rval0, Rval1), Rval) :-
> @@ -309 +318 @@
> -exprn_aux__vars_in_rval(unop(_, Rval), Vars) :-
> +exprn_aux__vars_in_rval(unop(_Unop, Rval), Vars) :-
> @@ -311 +320 @@
> -exprn_aux__vars_in_rval(binop(_, Rval0, Rval1), Vars) :-
> +exprn_aux__vars_in_rval(binop(_Binop, Rval0, Rval1), Vars) :-
> @@ -318,2 +327,2 @@
> -exprn_aux__vars_in_lval(reg(_, _), []).
> -exprn_aux__vars_in_lval(temp(_, _), []).
> +exprn_aux__vars_in_lval(reg(_Type, _RegNum), []).
> +exprn_aux__vars_in_lval(temp(_Type, _TmpNum), []).
> @@ -325,2 +334,2 @@
> -exprn_aux__vars_in_lval(stackvar(_), []).
> -exprn_aux__vars_in_lval(framevar(_), []).
> +exprn_aux__vars_in_lval(stackvar(_SlotNum), []).
> +exprn_aux__vars_in_lval(framevar(_SlotNum), []).
> @@ -337 +346 @@
> -exprn_aux__vars_in_lval(field(_, Rval0, Rval1), Vars) :-
> +exprn_aux__vars_in_lval(field(_MaybeTag, Rval0, Rval1), Vars) :-
> @@ -347,3 +356,3 @@
> -exprn_aux__vars_in_mem_ref(stackvar_ref(_), []).
> -exprn_aux__vars_in_mem_ref(framevar_ref(_), []).
> -exprn_aux__vars_in_mem_ref(heap_ref(Rval, _, _), Vars) :-
> +exprn_aux__vars_in_mem_ref(stackvar_ref(_SlotNum), []).
> +exprn_aux__vars_in_mem_ref(framevar_ref(_SlotNum), []).
> +exprn_aux__vars_in_mem_ref(heap_ref(Rval, _Tag, _FieldNum), Vars) :-
> @@ -369,3 +377,0 @@
> -:- pred exprn_aux__substitute_lval_in_lval(lval::in, lval::in,
> - lval::in, lval::out, int::in, int::out) is det.
> -
> @@ -373,5 +379,2 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval, Lval0, Lval,
> - 0, _).
> -
> -:- pred exprn_aux__substitute_lval_in_rval(lval::in, lval::in,
> - rval::in, rval::out, int::in, int::out) is det.
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval, Lval0, Lval,
> + 0, _SubstCount).
> @@ -380,2 +383,2 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval, Rval0, Rval,
> - 0, _).
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval, Rval0, Rval,
> + 0, _SubstCount).
> @@ -395 +398 @@
> - Uinstr0 = comment(_),
> + Uinstr0 = comment(_Comment),
> @@ -402 +405,2 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval),
> + exprn_aux__substitute_lval_in_lval_count(OldLval,
> + NewLval),
> @@ -414 +418 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -416 +420 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -437 +441 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -447 +451 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -452 +456 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -454 +458 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -459 +463 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -464 +468 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -469 +473 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -474 +478 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -479 +483 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -492 +496 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -497 +501 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -525 +529 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -534 +538 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -539 +543 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -583 +587 @@
> -exprn_aux__substitute_lval_in_live_lval_info(_, _,
> +exprn_aux__substitute_lval_in_live_lval_info(_OldLval, _NewLval,
> @@ -588 +592,2 @@
> - list__map_foldl(exprn_aux__substitute_lval_in_lval(OldLval, NewLval),
> + list__map_foldl(
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval),
> @@ -598 +603 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval, Rval0, Rval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval, Rval0, Rval,
> @@ -608 +613 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval, Lval0, Lval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval, Lval0, Lval,
> @@ -612 +617,5 @@
> -exprn_aux__substitute_lval_in_rval(OldLval, NewLval, Rval0, Rval, N0, N) :-
> +:- pred exprn_aux__substitute_lval_in_rval_count(lval::in, lval::in,
> + rval::in, rval::out, int::in, int::out) is det.
> +
> +exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval, Rval0, Rval,
> + N0, N) :-
> @@ -615 +624 @@
> - exprn_aux__substitute_lval_in_lval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval,
> @@ -632 +641 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -641 +650 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -646 +655 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -648 +657 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -664 +673 @@
> - MemRef0 = stackvar_ref(_),
> + MemRef0 = stackvar_ref(_SlotNum),
> @@ -668 +677 @@
> - MemRef0 = framevar_ref(_),
> + MemRef0 = framevar_ref(_SlotNum),
> @@ -672,2 +681,2 @@
> - MemRef0 = heap_ref(Rval0, Tag, Slot),
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + MemRef0 = heap_ref(Rval0, Tag, FieldNum),
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -675 +684 @@
> - MemRef = heap_ref(Rval, Tag, Slot)
> + MemRef = heap_ref(Rval, Tag, FieldNum)
> @@ -678 +687,5 @@
> -exprn_aux__substitute_lval_in_lval(OldLval, NewLval, Lval0, Lval, N0, N) :-
> +:- pred exprn_aux__substitute_lval_in_lval_count(lval::in, lval::in,
> + lval::in, lval::out, int::in, int::out) is det.
> +
> +exprn_aux__substitute_lval_in_lval_count(OldLval, NewLval, Lval0, Lval,
> + N0, N) :-
> @@ -683 +696 @@
> - exprn_aux__substitute_lval_in_lval_2(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_lval_count_2(OldLval, NewLval,
> @@ -687 +700 @@
> -:- pred exprn_aux__substitute_lval_in_lval_2(lval::in, lval::in,
> +:- pred exprn_aux__substitute_lval_in_lval_count_2(lval::in, lval::in,
> @@ -690 +703,2 @@
> -exprn_aux__substitute_lval_in_lval_2(OldLval, NewLval, Lval0, Lval, N0, N) :-
> +exprn_aux__substitute_lval_in_lval_count_2(OldLval, NewLval, Lval0, Lval,
> + N0, N) :-
> @@ -692 +706 @@
> - Lval0 = reg(_, _),
> + Lval0 = reg(_Type, _RegNum),
> @@ -716 +730 @@
> - Lval0 = temp(_, _),
> + Lval0 = temp(_Type, _TmpNum),
> @@ -720 +734 @@
> - Lval0 = stackvar(_),
> + Lval0 = stackvar(_SlotNum),
> @@ -724 +738 @@
> - Lval0 = framevar(_),
> + Lval0 = framevar(_SlotNum),
> @@ -729 +743 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -734 +748 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -739 +753 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -744 +758 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -749 +763 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -754 +768 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -756 +770 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -761 +775 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -765 +779 @@
> - Lval0 = lvar(_),
> + Lval0 = lvar(_Var),
> @@ -785 +799 @@
> - exprn_aux__substitute_lval_in_rval(OldLval, NewLval,
> + exprn_aux__substitute_lval_in_rval_count(OldLval, NewLval,
> @@ -805 +819 @@
> - Rval0 = var(_),
> + Rval0 = var(_Var),
> @@ -1081,2 +1095,2 @@
> -exprn_aux__rval_addrs(var(_), [], []).
> -exprn_aux__rval_addrs(create(_, MaybeRvals, _,_,_,_, Reuse),
> +exprn_aux__rval_addrs(var(_Var), [], []).
> +exprn_aux__rval_addrs(create(_, MaybeRvals, _, _, _, _, Reuse),
> @@ -1099 +1113 @@
> -exprn_aux__rval_addrs(unop(_, Rval), CodeAddrs, DataAddrs) :-
> +exprn_aux__rval_addrs(unop(_Unop, Rval), CodeAddrs, DataAddrs) :-
> @@ -1101 +1115 @@
> -exprn_aux__rval_addrs(binop(_, Rval1, Rval2), CodeAddrs, DataAddrs) :-
> +exprn_aux__rval_addrs(binop(_Binop, Rval1, Rval2), CodeAddrs, DataAddrs) :-
> @@ -1112,3 +1126,3 @@
> -exprn_aux__lval_addrs(reg(_, _), [], []).
> -exprn_aux__lval_addrs(stackvar(_Int), [], []).
> -exprn_aux__lval_addrs(framevar(_Int), [], []).
> +exprn_aux__lval_addrs(reg(_Type, _RegNum), [], []).
> +exprn_aux__lval_addrs(stackvar(_SlotNum), [], []).
> +exprn_aux__lval_addrs(framevar(_SlotNum), [], []).
> @@ -1136 +1150 @@
> -exprn_aux__lval_addrs(temp(_, _), [], []).
> +exprn_aux__lval_addrs(temp(_Type, _TmpNum), [], []).
> @@ -1163,3 +1177,4 @@
> -exprn_aux__mem_ref_addrs(stackvar_ref(_), [], []).
> -exprn_aux__mem_ref_addrs(framevar_ref(_), [], []).
> -exprn_aux__mem_ref_addrs(heap_ref(Rval, _, _), CodeAddrs, DataAddrs) :-
> +exprn_aux__mem_ref_addrs(stackvar_ref(_SlotNum), [], []).
> +exprn_aux__mem_ref_addrs(framevar_ref(_SlotNum), [], []).
> +exprn_aux__mem_ref_addrs(heap_ref(Rval, _Tag, _FieldNum),
> + CodeAddrs, DataAddrs) :-
> @@ -1185 +1200 @@
> -exprn_aux__var_lval_to_rval(_, Lval) = lval(Lval).
> +exprn_aux__var_lval_to_rval(_Var, Lval) = lval(Lval).
> --- compiler/options.m
> +++ compiler/options.m
> @@ -778 +778 @@
> - use_local_vars - bool(yes),
> + use_local_vars - bool(no),
> @@ -2561,2 +2560,0 @@
> - "--no-use-local-vars",
> - "\tDisable the use of local variables in C code blocks.",
> @@ -2571,0 +2570,3 @@
> + "--use-local-vars",
> + "\tDisable the transformation to use local variables in C code",
> + "\tblocks whereever possible.",
> --- compiler/trace.m
> +++ compiler/trace.m
> @@ -808,0 +809 @@
> + % compute the set of live lvals at the event
> --- use_local_vars.m
> +++ use_local_vars.m
> @@ -11,2 +11,12 @@
> -% This module transforms the sequence of instructions in a procedure body.
> -% It looks for two patterns. The first is
> +% This module implements an LLDS->LLDS transformation that optimizes the
> +% sequence of instructions in a procedure body by replacing references to
> +% relatively expensive locations: fake registers (Mercury abstract machine
> +% registers that are not mapped to machine registers) or stack slots with
> +% references to cheaper locations: local variables in C blocks, which should
> +% be mapped to machine registers by the C compiler. The C blocks should be
> +% introduced later by wrap_blocks.m, possibly after the LLDS code has been
> +% transformed further. Wrap_blocks will know what local variables to declare
> +% in each block by looking for the temp(_, _) lvals that represent those local
> +% variables.
> +%
> +% This module looks for two patterns. The first is
> @@ -19,2 +29 @@
> -% the fake register with a temporary, which the C compiler can then put into a
> -% real machine register.
> +% the fake register with a local variable.
> @@ -34,5 +43,5 @@
> -% with a temporary, but since this time we cannot be sure that the original
> -% lval will not be referred to, we assign the temporary to the lval as well.
> -% This is a win because the cost of the assignment is less than the savings
> -% from replacing the fake register or stack slot references with temporary
> -% variable references.
> +% with a local variable, but since this time we cannot be sure that the
> +% original lval will not be referred to, we assign the local variable to the
> +% lval as well. This is a win because the cost of the assignment is less than
> +% the savings from replacing the fake register or stack slot references with
> +% local variable references.
> @@ -127 +136 @@
> - \+ CodeAddr = label(_Label)
> + CodeAddr \= label(_Label)
> @@ -260 +269,2 @@
> - % no lvals in their access path.
> + % no lvals in their access path. The NewLvals will be temporaries,
> + % representing local variables in C blocks.
> @@ -262,4 +272,15 @@
> - % This predicate takes a conservative view of what may define OldLval.
> - % For some instruction types, we simply give up. Since these
> - % instruction types are relatively rare, the effect on the performance
> - % of the generated code should be negligible.
> + % When control leaves this instruction sequence via a if_val, goto or
> + % call, the local variables of the block in which this instruction
> + % sequence will go out of scope, so we must stop using them. At points
> + % at which control can enter this instruction sequence, i.e. at labels,
> + % the C block ends, so again we must stop using its local variables.
> + % (Livevals pseudo-instructions occur only immediately before
> + % instructions that cause control transfer, so we stop at them too.)
> + %
> + % Our caller ensures that we can also so stop at any point. By doing so
> + % we may fail to exploit an optimization opportunity, but the code we
> + % generate will still be correct. At the moment we stop at instructions
> + % whose correct handling would be non-trivial and which rarely if ever
> + % appear between the definition and a use of a location we want to
> + % substitute. These include instructions that manipulate stack frames,
> + % the heap, the trail and synchronization data.
> --- doc/user_guide.texi 2001/03/18 23:10:06 1.246
> +++ doc/user_guide.texi 2001/04/20 12:16:19
> @@ -4280,6 +4280,11 @@
> minimize stack consumption, possibly at the expense of speed.
>
> @sp 1
> + at item --use-local-vars
> +Disable the transformation to use local variables in C code
> +blocks whereever possible.
> +
> + at sp 1
> @item --no-optimize-labels
> Disable elimination of dead labels and code.
>
> --- compiler/notes/compiler_design.html 2001/01/19 01:50:32 1.57
> +++ compiler/notes/compiler_design.html 2001/04/20 12:21:58
> @@ -784,6 +784,8 @@
>
> <li> peephole optimization (peephole.m)
>
> +<li> introduction of local C variables (use_local_vars.m) <br>
> +
> <li> value numbering <br>
>
> This is done by value_number.m, which has the following sub-modules:
> @@ -849,10 +851,18 @@
> until the tag is known. (Violations of (b) usually cause
> unaligned accesses, which cause bus errors on many machines.)
> </dl>
> -
> - Several of these modules (and also frameopt, above) use livemap.m,
> - which finds the set of locations live at each label.
> </ul>
> +
> +<p>
> +
> +Several of these optimizations (frameopt, use_local_vars and value numbering)
> +use livemap.m, a module that finds the set of locations live at each label.
> +
> +Use_local_vars and value numbering also introduce
> +references to temporary variables in extended basic blocks
> +in the LLDS representation of the C code.
> +The transformation to insert the block scopes
> +and declare the temporary variables is performed by wrap_blocks.m.
>
> <p>
>
> --------------------------------------------------------------------------
> 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