[m-rev.] fix review: fix bug with ctgc and lcmc in high-level C grades

Julien Fischer juliensf at csse.unimelb.edu.au
Mon Feb 4 14:38:18 AEDT 2008


On Mon, 4 Feb 2008, Peter Wang wrote:

> Estimated hours taken: 4
> Branches: main
>
> Fix a bug with structure reuse and the last-call-modulo-cons optimisation on
> MLDS backends.  When constructing a cell by reusing a dead cell, we didn't
> take into account that the lcmc optimisation needs to assign the address of
> some fields into variables.  Those variables remained unassigned and pointed
> into random memory locations.
>
> Only tested on hlc grades with low-level data.

LCMC is not currently compatible with --high-level-data or the non-C
backends.

> compiler/ml_unify_gen.m:
> 	Fix the bug by generating statements to take the address of reused
> 	cell fields when appropriate.
>
> Index: compiler/ml_unify_gen.m
> ===================================================================
> RCS file: /home/mercury/mercury1/repository/mercury/compiler/ml_unify_gen.m,v
> retrieving revision 1.122
> diff -u -r1.122 ml_unify_gen.m
> --- compiler/ml_unify_gen.m	21 Jan 2008 00:32:52 -0000	1.122
> +++ compiler/ml_unify_gen.m	4 Feb 2008 02:01:31 -0000
> @@ -686,8 +686,8 @@
>         Statement = statement(Stmt, mlds_make_context(Context)),
>
>         ml_gen_field_take_address_assigns(TakeAddrInfos, VarLval, MLDS_Type,
> -            MaybeTag, Context, !.Info, FieldAssigns),
> -        Statements = [Statement | FieldAssigns],
> +            MaybeTag, Context, !.Info, TakeAddrStatements),
> +        Statements = [Statement | TakeAddrStatements],
>         Decls = []
>     ;
>         HowToConstruct = construct_statically(StaticArgs),
> @@ -810,7 +810,7 @@
>
>         ml_gen_type(!.Info, Type, MLDS_DestType),
>         CastVar2Rval = unop(cast(MLDS_DestType), Var2Rval),
> -        Statement = ml_gen_assign(Var1Lval, CastVar2Rval, Context),
> +        AssignStatement = ml_gen_assign(Var1Lval, CastVar2Rval, Context),
>
>         % For each field in the construction unification we need to generate
>         % an rval.  ExtraRvals need to be inserted at the start of the object.
> @@ -818,11 +818,14 @@
>             0, ConsIdTag, Context, ExtraRvalStatements, !Info),
>         % XXX we do more work than we need to here, as some of the cells
>         % may already contain the correct values.
> -        ml_gen_unify_args(ConsId, ArgVars, ArgModes, ArgTypes, Fields, Type,
> -            VarLval, OffSet, ArgNum, ConsIdTag, Context, Statements0, !Info),
> -
> -        Decls = [],
> -        Statements = [Statement | ExtraRvalStatements] ++ Statements0
> +        ml_gen_unify_args_for_reuse(ConsId, ArgVars, ArgModes, ArgTypes,
> +            Fields, TakeAddr, Type, VarLval, OffSet, ArgNum, ConsIdTag,
> +            Context, FieldStatements, TakeAddrInfos, !Info),
> +        ml_gen_field_take_address_assigns(TakeAddrInfos, VarLval, MLDS_Type,
> +            MaybeTag, Context, !.Info, TakeAddrStatements),
> +        Statements = [AssignStatement | ExtraRvalStatements] ++
> +            FieldStatements ++ TakeAddrStatements,
> +        Decls = []
>     ;
>         HowToConstruct = construct_in_region(_RegVar),
>         sorry(this_file, "ml_gen_new_object: " ++
> @@ -1557,6 +1560,59 @@
>     ml_gen_unify_arg(ConsId, Arg, Mode, ArgType, Field, VarType, VarLval,
>         Offset, ArgNum, Tag, Context, !Statements, !Info).
>
> +:- pred ml_gen_unify_args_for_reuse(cons_id::in, prog_vars::in,
> +    list(uni_mode)::in, list(mer_type)::in, list(constructor_arg)::in,
> +    list(int)::in, mer_type::in, mlds_lval::in, int::in, int::in, cons_tag::in,
> +    prog_context::in, statements::out, list(take_addr_info)::out,
> +    ml_gen_info::in, ml_gen_info::out) is det.
> +
> +ml_gen_unify_args_for_reuse(ConsId, Args, Modes, ArgTypes, Fields, TakeAddr,
> +        VarType, VarLval, Offset, ArgNum, Tag, Context,
> +        Statements, TakeAddrInfos, !Info) :-
> +    (
> +        Args = [],
> +        Modes = [],
> +        ArgTypes = [],
> +        Fields = []
> +    ->
> +        Statements = [],
> +        TakeAddrInfos = []
> +    ;
> +        Args = [Arg | Args1],
> +        Modes = [Mode | Modes1],
> +        ArgTypes = [ArgType | ArgTypes1],
> +        Fields = [Field | Fields1]
> +    ->
> +        Offset1 = Offset + 1,
> +        ArgNum1 = ArgNum + 1,
> +        ( TakeAddr = [ArgNum | TakeAddr1] /* ? */ ->

Why is there a question mark there?

> +            ml_gen_unify_args_for_reuse(ConsId, Args1, Modes1, ArgTypes1,
> +                Fields1, TakeAddr1, VarType, VarLval, Offset1, ArgNum1,
> +                Tag, Context, Statements, TakeAddrInfos0, !Info),
> +
> +            FieldType = Field ^ arg_type,
> +            ml_gen_info_get_module_info(!.Info, ModuleInfo),
> +            module_info_get_globals(ModuleInfo, Globals),
> +            globals.lookup_bool_option(Globals, highlevel_data, HighLevelData),
> +            ml_type_as_field(FieldType, ModuleInfo, HighLevelData,
> +                BoxedFieldType),
> +            ml_gen_type(!.Info, FieldType, MLDS_FieldType),
> +            ml_gen_type(!.Info, BoxedFieldType, MLDS_BoxedFieldType),
> +            TakeAddrInfo = take_addr_info(Arg, Offset, MLDS_FieldType,
> +                MLDS_BoxedFieldType),
> +            TakeAddrInfos = [TakeAddrInfo | TakeAddrInfos0]
> +        ;
> +            ml_gen_unify_args_for_reuse(ConsId, Args1, Modes1, ArgTypes1,
> +                Fields1, TakeAddr, VarType, VarLval, Offset1, ArgNum1,
> +                Tag, Context, Statements0, TakeAddrInfos, !Info),
> +            ml_gen_unify_arg(ConsId, Arg, Mode, ArgType, Field,
> +                VarType, VarLval, Offset, ArgNum, Tag, Context,
> +                Statements0, Statements, !Info)

That looks okay otherwise.

Julien.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list