[m-rev.] for review: let simplification introduce ground_term_const cons_ids

Peter Wang novalazy at gmail.com
Tue Jun 1 12:09:12 AEST 2021


On Mon, 31 May 2021 16:22:47 +1000 "Zoltan Somogyi" <zoltan.somogyi at runbox.com> wrote:
> For review by Peter, since we discussed this approach
> a couple of weeks ago on m-rev.
> 
> I haven't had time for benchmarking yet, but I intend to get some
> performance numbers in the next day or so.
> 
> Zoltan.

> Let simplify introduce ground_term_const cons_ids.
...
> 
> compiler/simplify_proc.m:
>     Fit the new optimization ino the logic that decides whether

into

>     we need two passes through the procedure body, or just one.
> 
>     Factor out some common code.

> diff --git a/compiler/common.m b/compiler/common.m
> index a23bb8461..d54772b27 100644
> --- a/compiler/common.m
> +++ b/compiler/common.m
> @@ -188,6 +191,16 @@
>  
>  %---------------------------------------------------------------------------%
>  
> +    % This module can implement two optimizations,
> +    % 

This comment is incomplete.

> +:- type common_info
> +    --->    common_info(
> +                maybe(common_struct_info),
> +                maybe(const_struct_info)
> +            ).
> +
> +%---------------------%

> @@ -296,32 +327,152 @@
>                  list(prog_var)
>              ).
>  
> +%---------------------%
> +
> +    % The const struct optimization, if enabled, looks for construction
> +    % unifications X = f(...) where all the RHS arguments are constant terms,
> +    % and replaces them with X = ground_term_const(N), where ground constant
> +    % term #N in the const_struct_db is f(...).
> +    %
> +    % The const_var_map, which maps each variable that contains a
> +    % knownt-to-be-ground term to its representation as an argument

known

> -common_optimise_unification(Unification0, UnifyMode, !GoalExpr, !GoalInfo,
> -        !Common, !Info) :-
> +common_optimise_unification(RHS0, UnifyMode, Unification0, UnifyContext,
> +        !GoalExpr, !GoalInfo, !Common, !Info) :-
>      (
> -        Unification0 = construct(Var, ConsId, ArgVars, _, How, _, SubInfo),
> +        Unification0 = construct(_, _, _, _, _, _, SubInfo),
>          ( if
> -            % There are three tests we have to pass before we even try
> -            % to optimize away a construction. All three usually pass,
> -            % so the order in which we test for them does not matter much.
> +            % The call to common_optimise_construct below will try to perform
> +            % one of two optimizations on this construction unification.
> +            % 
> +            % - The first is replacing a dynamic unification with an
> +            %   assignment whose right hand side is a reference to
> +            %   a constant structure. We try to do this if !.Common
> +            %   contains a const_struct_info.
> +            %
> +            % - The second is to replace the construction with an assignment
> +            %   from a variable that already contains the term that the
> +            %   construction would build. We try to do this if !.Common
> +            %   contains a common_struct_info.
> +            %
> +            % There are two tests that must pass before we can attemp
attempt

> diff --git a/compiler/simplify_goal.m b/compiler/simplify_goal.m
> index 275186dcb..f1704ca8c 100644
> --- a/compiler/simplify_goal.m
> +++ b/compiler/simplify_goal.m
...
> +maybe_handle_stack_flush(BeforeAfter, GoalExpr, !Common) :-
> +    WillFlish = will_flush(BeforeAfter, GoalExpr),
> +    (
> +        WillFlish = yes,
>          common_info_stack_flush(!Common)
> -    else
> -        true
> +    ;
> +        WillFlish = no
>      ).

WillFlush

That looks okay.

Peter


More information about the reviews mailing list