Indu Bhagat <indu.bha...@oracle.com> writes:
> On 4/15/25 9:21 AM, Richard Sandiford wrote:
>> Indu Bhagat <indu.bha...@oracle.com> writes:
>>> Store Allocation Tags (st2g) is an Armv8.5-A memory tagging (MTE)
>>> instruction. It stores an allocation tag to two tag granules of memory.
>>>
>>> TBD:
>>>    - Not too sure what is the best way to generate the st2g yet; A
>>>      subsequent patch will emit them in one of the target hooks.
>> 
>> Regarding the previous thread about this:
>> 
>>      https://gcc.gnu.org/pipermail/gcc-patches/2024-November/668671.html
>> 
>
> Apologies for this one again slipping through the cracks.
>
>> and your question about whether all types of store tag instructions
>> should be volatile: if we went for that approach, then yeah, I think so.
>> 
>> As I mentioned there, I don't think we should use (unspec ...) memory
>> addresses.
>> 
>> But thinking more about it: can we guarantee that GCC will only use
>> these instruction patterns with base registers that are aligned to
>> 16 bytes?  If so, then perhaps an alternative would be to model
>> them as read-modify-write operations to the whole granule (even though
>> the actual instructions leave normal memory untouched and only change
>> the tags).  That is, rather than:
>> 
>
> I think so. Each stack var is assigned a granule of its own (16-bytes); 
> for alloca, we align explicitly; and each pointer is based off the SP 
> (which is also 16-byte aligned for AAPCS64).  IIRC, FEAT_MTE*  are 
> available in AArch64 only.
>
> BTW, the aarch64.md file has this comment for stg:
> ";; STG doesn't align the address but aborts with alignment fault
> ;; when the address is not 16-byte aligned."

Ah, yeah.  So using a read-modify-rewrite TImode memory operation
should be fine in that case.

> Just curious: the same should be true for all MTE load/store tag 
> instructions, isnt it ?  I cant seem to find the above specific 
> information in the ARM MTE instruction specification  "Arm Architecture 
> Reference Manual for A-profile architecture."...

In the pseudocode, this is done in the AArch64.MemTag accesses.  E.g:

AArch64.MemTag[bits(64) address, AccessDescriptor accdesc_in] = bits(4) value
    assert accdesc_in.tagaccess && !accdesc_in.tagchecked;

    AddressDescriptor memaddrdesc;
    AccessDescriptor accdesc = accdesc_in;

    constant boolean aligned = IsAligned(address, TAG_GRANULE);

    // Stores of allocation tags must be aligned
    if !aligned then
        constant FaultRecord fault = AlignmentFault(accdesc, address);
        AArch64.Abort(fault);

Thanks,
Richard

Reply via email to