[llvm-dev] SROA and volatile memcpy/memset
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 10 11:22:57 PST 2015
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.
--- test.c ---
typedef struct {
volatile unsigned int value;
} atomic_word_t;
typedef union {
struct {
unsigned char state;
unsigned char priority;
};
atomic_word_t atomic;
unsigned int full;
} mystruct_t;
mystruct_t a;
unsigned int foo(void) {
mystruct_t x;
mystruct_t y;
x.full = a.atomic.value;
y = x;
y.priority = 7;
return y.full;
}
--------------
-Krzysztof
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev
mailing list