Hi,

Thank you very much, everyone, who gave me useful advice.
I might conclude that extension of GCC for HCQC is
completely unnecessary.

Richard Sandiford <richard.sandif...@linaro.org> writes:
> An alternative to adding a new flag might be to check:
>
>    MEM_EXPR (mem) == get_spill_slot_decl (false)

I think that this method is far better than introducing the flag
`for_spill_p'!
For this approach, the additional code can only be the following 6
lines in final.c.

+
+      if (MEM_P (op) && MEM_EXPR (op) && MEM_EXPR (op) ==
get_spill_slot_decl (false))
+       {
+         HOST_WIDE_INT size = MEM_SIZE (op);
+         fprintf (asm_out_file, " (" HOST_WIDE_INT_PRINT_DEC "-byte spill
slot)", size);
+       }

I implemented this, and it seems to work fine both on AArch64

        ldr     x0, [x29, 192]  // tmp1241, %sfp (8-byte spill slot)
        str     w0, [x29, 204]  // ivtmp_805, %sfp (4-byte spill slot)

and on x86_64

        movsd   8(%rsp), %xmm1  # %sfp (8-byte spill slot), prephitmp_811
        movsd   %xmm0, 16(%rsp) #, %sfp (8-byte spill slot)

The important point here is that "spill slot" is always displayed with
"%sfp" attached.
This is because the object returned by `get_spill_slot_decl' always
points to the following decl tree `d'.

  d = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
                  VAR_DECL, get_identifier ("%sfp"), void_type_node);

This means that "%sfp" is "spill slot" on all target machines.
I checked the source code of GCC, and it seems that only this part of
code uses "%sfp".
This "%sfp" does not express data size, but HCQC can get data size
information from assembly codes in the same line with "%sfp".
Therefore, the conclusion is that it is enough for HCQC to detect
"%sfp" without any extension of GCC.

> But this would bake in the assumption that everything we want to mark
> as a spill slot will use set_mem_attrs_for_spill, whereas the flag
> would allow other MEMs to be marked as spill slots too.

I guess that the effect of the flag can also be realized with the
following code:

  MEM_EXPR (mem) = get_spill_slot_decl (false);

instead of

  MEM_ATTRS (mem).for_spill_p = true;

The only case where `for_spill_p' seems to be useful is where some
optimizations combine a memory area V on the stack for a local
variable and a memory area S for the spill code together and make it
the V only using the result of live range analysis for both memory areas.
In that case, the code

  MEM_ATTRS (V).for_spill_p = true;

holds the original memory expression with this additional flag.
However, it may be a matter of opinion whether this memory region
should be considered spill areas or not.

Best regards,
--
--------------------------------------
Masaki Arai
_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to