On Thu, Aug 21, 2014 at 12:34 PM, James Greenhalgh
<james.greenha...@arm.com> wrote:
>
> Hi,
>
> Andrew is quite right, we break the contract for volatile struct copies
> if we start double copying bytes.
>
> But, the generic code will call memcpy - at which point anything could
> happen. So, we must not put out a call to memcpy if either our source or
> destination operands are volatile. The same is true of memset, so also
> disable that call for volatile operands, and add a fallback loop
> implementation.
>
> Bootstrapped on x86, Arm and AArch64 with no issues.
>
> OK?

Umm... using a byte-wise clearing loop is surely always the wrong
thing for an access that _really_ cares about volatile.

I see we do the same for the block-move case... ugh.

I still say we need to solve the issue at language level - that is,
try to figure out what the language standard says about

volatile struct X x, y;

x = y;

or about

struct X { volatile int x; } x, y;

x = y;

where we don't even _have_ MEM_VOLATILE set on x or y.

I expect that most structs have volatile for a bogus reason
anyway and we slow down and enlarge code for no good reason.

So - why bother fixing this?  ISTR reading in the C standard
that structure assignments are expected to compile to memcpy.

Richard.

> Thanks,
> James
>
> ---
> gcc/
>
> 2014-08-21  James Greenhalgh  <james.greenha...@arm.com>
>
>         * expr.c (set_storage_via_loop): New.
>         (emit_block_move_hints): Do not call memcpy with volatile operands.
>         (emit_block_move_via_movmem): Clarify that targets do have to care
>         about volatile operands.
>         (clear_storage_hints): Do not call memset for volatile operands,
>         fall back to a loop implementation.
>
> gcc/testsuite/
>
> 2014-08-21  James Greenhalgh  <james.greenha...@arm.com>
>
>         * gcc.dg/large-volatile-struct-copy-1.c: New.
>         * gcc.dg/large-volatile-struct-set-1.c: Likewise.

Reply via email to