[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