On Sat, 2014-12-27 at 09:51 -0800, H.J. Lu wrote:
> On Sat, Dec 27, 2014 at 9:45 AM, Andrew Haley <a...@redhat.com> wrote:
> > On 27/12/14 16:02, paul_kon...@dell.com wrote:
> >>
> >> In the case of volatile variables, the external interface in
> >> question is the one at the point where that address is implemented —
> >> a memory cell, or memory mapped I/O device on a bus.  So the
> >> required behavior is that load and store operations (read and write
> >> transactions at that interface) occur as written.
> >
> > I believe this is incorrect.  For accesses to reach memory in program
> > order on most architectures would require volatile memory references
> > to emit memory barriers, and the C committee decided not to require
> > that.
> >
> >> If a processor has add instructions that support memory references
> >> (as in x86 and vax, but not mips), such an instruction will perform
> >> a read cycle followed by a write cycle.  So as seen at the critical
> >> interface, the behavior is the same as if you were to do an explicit
> >> load, register add, store sequence.  Therefore the use of a single
> >> add-to-memory is a valid implementation.
> >
> > I agree.
> >
> 
> Can we add a target hook so that combine will allow a single
> add-to-memory instruction for volatile memory reference on
> architectures like x86?

Just don't use 'general_operand' in the predicates.  On SH I had to do
that so that combine would merge sign extending memory loads (expanded
as QI/HImode loads) and explicit sign extensions.

Cheers,
Oleg

Reply via email to