This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Aliasing: reliable code or not?
- From: Andrew Pinski <pinskia at physics dot uc dot edu>
- To: acahalan at gmail dot com (Albert Cahalan)
- Cc: gcc at gcc dot gnu dot org
- Date: Tue, 28 Nov 2006 22:27:43 -0500 (EST)
- Subject: Re: Aliasing: reliable code or not?
>
> I have code that goes something like this:
>
> char *foo(char *buf){
> *buf++ = 42;
> *((short*)buf) = 0xfeed;
> buf += 2;
> *((int*)buf) = 0x12345678;
> buf += 4;
> *((int*)buf) = 0x12345678;
> buf += 4;
> return buf;
> }
This does violate C aliasing rules.
Here is how I would write it so you can get the best results:
char *foo(char *buf)
{
short temp;
int temp1;
*buf++=42;
temp = 0xfeed;
memcpy(buf, &temp, sizeof(temp));
buf+=sizeof(temp);
temp1 = 0x12345678;
memcpy(buf, &temp1, sizeof(temp1));
buf+=sizeof(temp1);
temp1 = 0x12345678;
memcpy(buf, &temp1, sizeof(temp1));
buf+=sizeof(temp1);
return buf;
}
As using memcpy does not cause a violation of the aliasing rules.
And does the correct thing:
lis 11,0x1234
li 0,42
li 9,-275
ori 11,11,22136
stb 0,0(3)
sth 9,1(3)
stw 11,7(3)
stw 11,3(3)
addi 3,3,11
-- Pinski