[m-rev.] for review: insert extra arguments in reused objects

Peter Wang novalazy at gmail.com
Tue Jan 15 15:48:29 AEDT 2008


Branches: main

compiler/ml_unify_gen.m:
	ml_gen_new_object may be passed extra arguments to be inserted at the
	start of the object to be constructed, e.g. secondary tags.  This was
	not respected when reusing dead cells.  Fix that (for low-level data
	only).

	Add a cast when assigning one variable to another when reusing cells.
	This was causing C compiler warnings.

Index: compiler/ml_unify_gen.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/ml_unify_gen.m,v
retrieving revision 1.119
diff -u -r1.119 ml_unify_gen.m
--- compiler/ml_unify_gen.m	30 Dec 2007 08:23:49 -0000	1.119
+++ compiler/ml_unify_gen.m	15 Jan 2008 04:41:28 -0000
@@ -764,9 +764,9 @@
             MaybeConsId = no,
             unexpected(this_file, "ml_gen_new_object: unknown cons id")
         ),
+        ml_variable_type(!.Info, ReuseVar, ReuseType),
         list.map(
             (pred(ReuseConsId::in, ReusePrimTag::out) is det :-
-                ml_variable_type(!.Info, ReuseVar, ReuseType),
                 ml_cons_id_to_tag(!.Info, ReuseConsId,
                     ReuseType, ReuseConsIdTag),
                 ml_tag_offset_and_argnum(ReuseConsIdTag, ReusePrimTag,
@@ -799,18 +799,21 @@
                 unop(std_unop(strip_tag), lval(Var2Lval)))
         ),
 
-        Statement = ml_gen_assign(Var1Lval, Var2Rval, Context),
+        ml_gen_type(!.Info, Type, MLDS_DestType),
+        CastVar2Rval = unop(cast(MLDS_DestType), Var2Rval),
+        Statement = ml_gen_assign(Var1Lval, CastVar2Rval, Context),
 
         % For each field in the construction unification we need to generate
-        % an rval.
+        % an rval.  ExtraRvals need to be inserted at the start of the object.
+        ml_gen_extra_arg_assign(ExtraRvals, ExtraTypes, Type, VarLval,
+            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 | Statements0]
+        Statements = [Statement | ExtraRvalStatements] ++ Statements0
     ;
         HowToConstruct = construct_in_region(_RegVar),
         sorry(this_file, "ml_gen_new_object: " ++
@@ -1303,6 +1306,43 @@
             MLDS_Types, TakeAddrInfos, !MayUseAtomic, !Info)
     ).
 
+    % Generate assignment statements for each of ExtraRvals into the object at
+    % VarLval, beginning at Offset.
+    %
+:- pred ml_gen_extra_arg_assign(list(mlds_rval)::in,
+    list(mlds_type)::in, mer_type::in, mlds_lval::in, int::in, cons_tag::in,
+    prog_context::in, statements::out, ml_gen_info::in, ml_gen_info::out)
+    is det.
+
+ml_gen_extra_arg_assign([], [], _, _, _, _, _, [], !Info).
+ml_gen_extra_arg_assign([ExtraRval | ExtraRvals], [ExtraType | ExtraTypes],
+        VarType, VarLval, Offset, ConsIdTag, Context,
+        [Statement | Statements], !Info) :-
+    ml_gen_info_get_module_info(!.Info, ModuleInfo),
+    module_info_get_globals(ModuleInfo, Globals),
+    globals.lookup_bool_option(Globals, highlevel_data, HighLevelData),
+    (
+        HighLevelData = no
+    ;
+        HighLevelData = yes,
+        sorry(this_file, "ml_gen_extra_arg_assign: high-level data")
+    ),
+
+    ml_gen_type(!.Info, VarType, MLDS_VarType),
+    FieldId = offset(const(mlconst_int(Offset))),
+    MaybePrimaryTag = get_primary_tag(ConsIdTag),
+    FieldLval = field(MaybePrimaryTag, lval(VarLval), FieldId,
+        ExtraType, MLDS_VarType),
+    Statement = ml_gen_assign(FieldLval, ExtraRval, Context),
+
+    ml_gen_extra_arg_assign(ExtraRvals, ExtraTypes, VarType, VarLval,
+        Offset + 1, ConsIdTag, Context, Statements, !Info).
+
+ml_gen_extra_arg_assign([_ | _], [], _, _, _, _, _, _, !Info) :-
+    unexpected(this_file, "ml_gen_extra_arg_assign: length mismatch").
+ml_gen_extra_arg_assign([], [_ | _], _, _, _, _, _, _, !Info) :-
+    unexpected(this_file, "ml_gen_extra_arg_assign: length mismatch").
+
 %-----------------------------------------------------------------------------%
 
     % Generate a deterministic deconstruction. In a deterministic

--------------------------------------------------------------------------
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