[llvm-dev] Change memcpy/memmove/memset to have dest and source alignment attributes
Ralf Jung via llvm-dev
llvm-dev at lists.llvm.org
Mon Apr 2 08:59:25 PDT 2018
Hi Daniel,
a quick question (and kind-of a follow-up to
<https://lists.llvm.org/pipermail/llvm-dev/2017-July/115665.html>): Do the
pointers have to be aligned even if the size is 0? It would be nice to have
this stated explicitly in the LangRef.
Kind regards,
Ralf
On 26.03.2018 22:43, Daniel Neilson via llvm-dev wrote:
> Hi all,
> A quick note just to let people know that as of this past Friday my go at this
> work has been fully landed. It ended up being a back-burner item, so it took
> longer than I would have liked to get completed. None the less, the changes made
> were:
> 1) The IRBuilders in LLVM, Clang, and Polly were all updated to create only the
> new form of the memory intrinsics.
> 2) All LLVM passes to understand the new forms of the intrinsics; modulo the
> notes below.
> 3) The IRBuilder APIs for creating the old-style memcpy/memmove/memset forms and
> the MemIntrinsicInst API for getting/setting the old generic/conservative
> alignment have all been eliminated.
>
> There are a few places where the LLVM pass updates were conservative, and could
> potentially be made more aggressive by a motivated individual — list below.
>
> All that remains is for interested folk to enhance lowering of small
> memcpy/memmove into load/store sequences. The lowering in SelectionDAG currently
> just conservatively uses the MinAlign() of the source & dest alignments as the
> alignment for the loads and stores. I suspect that we could do better by
> teaching the lowering that the source & dest can have different alignments.
>
> Note that, also, the createMem[Cpy|Move]Loop type functions used in the
> LowerMemIntrinsics pass are also now invoked with different source & dest
> alignments by LowerMemIntrinsics, rather than the same alignment for both, so
> these helpers will now be invoked with more information than they have in the
> past; I’m guessing that it’s possible they could do better with this
> information. For example, createMemMoveLoop() doesn’t even use the alignments
> it’s given at all right now, and the neither of the createMemCpyLoop*()
> functions try to set the alignments on the loads & stores it creates.
>
> Passes that have conservative alignments after updating:
> - SelectionDAG
> - AArch64FastISel
> - ARMFastISel
> - MemorySanitizer
> - MemCpyOpt : Call slot optimization
> - InlineFunction : HandleByValArgumentInit
> - LowerMemIntrinsics (see note above)
>
> Cheers,
> Daniel
>
> ---
> Daniel Neilson, Ph.D.
> Azul Systems
>
>
>> On Jan 2, 2018, at 2:11 PM, Daniel Neilson via llvm-dev
>> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>
>> Good day all,
>> I’ve spent a few days resurrecting the circa-2015 work on removing the
>> explicit alignment argument (4th arg) from the @llvm.memcpy/memmove/memset
>> intrinsics in favour of using the alignment attribute on the pointer args of
>> calls to the intrinsic. This work was first proposed back in August 2015 by
>> Lang Hames:
>> http://lists.llvm.org/pipermail/llvm-dev/2015-August/089384.html (item 2)
>> and an attempt at landing the work was made by Pete Cooper in November 2015,
>> but then backed out due to unspecified bot failures:
>> http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20151109/312083.html
>>
>> I’ve prepared changes for LLVM, Clang, and Polly that are now up for review:
>> * https://reviews.llvm.org/D41675 (LLVM part)
>> * https://reviews.llvm.org/D41676 (polly part)
>> * https://reviews.llvm.org/D41677 (Clang part)
>>
>> Importantly for those maintaining downstream users of the LLVM API, this
>> changes the prototypes for the @llvm.memcpy/memmove/memset intrinsics and
>> changes the IRBuilder API for creating memcpy and memmove calls.
>>
>> For example, IR which used to read:
>> call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 100, i32 4,
>> i1 false)
>> will now read
>> call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %dest, i8* align 4 %src,
>> i32 100, i1 false)
>>
>> The LLVM change includes auto upgrade of the old IR. However, match
>> expressions in IR tests and calls to IRBuilder’s CreateMemCpy & CreateMemMove
>> will need to be updated.
>>
>> My plan is to post another note to the list when the change is landed, and
>> stable.
>>
>> Comments? Concerns?
>>
>> -Daniel
>>
>> ---
>> Daniel Neilson, Ph.D.
>> Azul Systems
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
More information about the llvm-dev
mailing list