[llvm-dev] SROA and volatile memcpy/memset
Joerg Sonnenberger via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 10 11:29:57 PST 2015
On Tue, Nov 10, 2015 at 01:22:57PM -0600, Krzysztof Parzyszek via llvm-dev wrote:
> On 11/10/2015 1:07 PM, Joerg Sonnenberger via llvm-dev wrote:
> >On Tue, Nov 10, 2015 at 10:41:06AM -0600, Krzysztof Parzyszek via llvm-dev wrote:
> >>I have a customer testcase where SROA splits a volatile memcpy and we end up
> >>generating bad code[1]. While this looks like a bug, simply preventing SROA
> >>from splitting volatile memory intrinsics causes basictest.ll for SROA to
> >>fail. Not only that, but it also seems like handling of volatile memory
> >>transfers was done with some intent.
> >
> >There is no such thing as a volatile memcpy or memset in standard ISO C,
> >so what exactly are you doing and why do you expect it to work that way?
>
> The motivating example has an aggregate copy where the aggregate is
> volatile, followed by a store to one of its members. (This does not have
> anything to do with devices.) SROA expanded this into a series of volatile
> loads and stores, which cannot be coalesced back into fewer instructions.
> This is clearly worse than doing the copy and then the member overwrite.
But a copy and overwrite would violate the volatile rules?
Joerg
More information about the llvm-dev
mailing list