That would be a bug. If h1 and h2 were marked __restrict__ then using memcpy to make the assignment is valid, but without that marking h1 may be == h2 so memmove is required.
paul > -----Original Message----- > From: Joakim Tjernlund [mailto:joakim.tjernl...@transmode.se] > Sent: Friday, April 30, 2010 10:15 AM > To: Jan-Benedict Glaw > Cc: gcc@gcc.gnu.org > Subject: Re: memcpy(p,p,len) > > Jan-Benedict Glaw <jbg...@lug-owl.de> wrote on 2010/04/30 16:10:42: > > > > On Fri, 2010-04-30 16:08:15 +0200, Joakim Tjernlund > > <joakim.tjernl...@transmode.se> wrote: > > > Is memcpy supposed to work when the src and dest are the same: > > > memcpy(p, p, 100); > > > > It may work, but you cannot rely on it. Use memmove() alternatively. > > My view too, but gcc 3.4.6 on gcc does this: > struct my_struct { > long a100[100]; > }; > static inline > func(struct my_struct *h1, struct my_struct *h2) > { > *h1 = *h2; > } > mytest(struct my_struct *my_h1) > { > func(my_h1, my_h1); > } > > ------------- > .file "tst.c" > .section ".text" > .align 2 > .globl mytest > .type mytest, @function > mytest: > mflr 0 > stwu 1,-16(1) > mr 4,3 > li 5,400 > stw 0,20(1) > bl memcpy > lwz 0,20(1) > addi 1,1,16 > mtlr 0 > blr > .size mytest, .-mytest > .section .note.GNU-stack,"",@progbits > .ident "GCC: (GNU) 3.4.6 (Gentoo 3.4.6-r2, ssp-3.4.6-1.0, > pie-8.7.9)"