[m-rev.] problems with abs for int{8,16,32}

Julien Fischer jfischer at opturion.com
Thu Feb 15 15:24:41 AEDT 2018


On Thu, 15 Feb 2018, Zoltan Somogyi wrote:

> On Thu, 15 Feb 2018 14:53:16 +1100 (AEDT), Julien Fischer <jfischer at opturion.com> wrote:
>> They are *not* fine in asm_fast.gc, you weren't trying hard enough ;-)
>> (Try compiling with -O0.)
>
> :-)
>
>>> I checked, and the abs operation on e.g. min_int8 throws
>>> an exception, as expected, when invoked directly from main,
>>> but the exception vanishes when invoked from within a try block.
>>>
>>> Julien, I think fixing this is up to you. I am attaching my cut-down
>>> test case to save you a bit of work.
>>
>> The issue here is the handling of sub-word sized types in scalar common
>> data; the runtime machinery for doing looks up in common data cannot
>> handle fields being less than a word in size.  The fix here is to ensure
>> that an field in static data are at least a word in size (which is
>> indeed precisely how the MLDS backend handles it).
>>
>> I'll post a fix for this in the next couple of days.
>
> I am probably more familiar with the common data system than you are.
> If you can describe the problem to me in more detail, I can maybe fix it

The attached program (a very cut-down version of the arith_int8 test
case), contains this:

     main(!IO) :-
         As = [-128i8],
         foo(As, !IO).

In the generated C code for it we have this:

     struct mercury_type_1 {
         int8_t f1;
         MR_Word * f2;
     };
     MR_STATIC_LINKAGE const struct mercury_type_1 mercury_common_1[];

     ...

     static const struct mercury_type_1 mercury_common_1[1] =
     {
     {
       INT8_C(-128),
      MR_tbmkword(0, 0)
     },
     };

The type of the field 'f1' in the struct above needs to be an MR_Word.
(That's fine since 8-, 16- and 32-bit integers will always fit in an
MR_Word.)

Uncommenting the code in the diff below fixes the int8 case.  (Extending
it to the other affected types is trivial.)  In practice, it would be
nice to emit a cast to MR_Word before the int8_t constant as well.

diff --git a/compiler/llds_out_global.m b/compiler/llds_out_global.m
index 2d9c0cf..72ff6ae 100644
--- a/compiler/llds_out_global.m
+++ b/compiler/llds_out_global.m
@@ -526,6 +526,8 @@ output_cons_arg_types([Type | Types], Indent, ArgNum, !IO) :-
      ( if Type = lt_float then
          % Ensure float structure members are word-aligned.
          io.write_string("MR_Float_Aligned", !IO)
+    %else if Type = lt_int(int_type_int8) then
+    %    io.write_string("MR_Word", !IO)
      else
          output_llds_type(Type, !IO)
      ),

> while waiting for Peter's review of my change to du_type_layout.m.
> Or, if Peter can't do the review, I can trade the fix for a review by you.

I will take a look this evening, assuming Peter hasn't got to it by
then.

Julien.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: arith_int8.m
Type: application/vnd.wolfram.mathematica.package
Size: 1661 bytes
Desc: 
URL: <http://lists.mercurylang.org/archives/reviews/attachments/20180215/2fd969ac/attachment.bin>


More information about the reviews mailing list