This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/39460] strange aliasing warnings compiling pymol under gcc 4.4
- From: "howarth at nitro dot med dot uc dot edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 14 Mar 2009 06:25:02 -0000
- Subject: [Bug middle-end/39460] strange aliasing warnings compiling pymol under gcc 4.4
- References: <bug-39460-11113@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #5 from howarth at nitro dot med dot uc dot edu 2009-03-14 06:25 -------
Well, these two offending inlined routines do have the comments...
/* Only works with aligned 4-byte quantities, will cause a bus error */
/* on some platforms if used on unaligned data. */
static void swap4_aligned(void *v, long ndata) {
int *data = (int *) v;
long i;
int *N;
for (i=0; i<ndata; i++) {
N = data + i;
*N=(((*N>>24)&0xff) | ((*N&0xff)<<24) |
((*N>>8)&0xff00) | ((*N&0xff00)<<8));
}
}
/* Only works with aligned 8-byte quantities, will cause a bus error */
/* on some platforms if used on unaligned data. */
static void swap8_aligned(void *v, long ndata) {
/* Use int* internally to prevent bugs caused by some compilers */
/* and hardware that would potentially load data into an FP reg */
/* and hose everything, such as the old "jmemcpy()" bug in NAMD */
int *data = (int *) v;
long i;
int *N;
int t0, t1;
for (i=0; i<ndata; i++) {
N = data + (i<<1);
t0 = N[0];
t0=(((t0>>24)&0xff) | ((t0&0xff)<<24) |
((t0>>8)&0xff00) | ((t0&0xff00)<<8));
t1 = N[1];
t1=(((t1>>24)&0xff) | ((t1&0xff)<<24) |
((t1>>8)&0xff00) | ((t1&0xff00)<<8));
N[0] = t1;
N[1] = t0;
}
}
Any idea how hard this one is to work around? It unclear if this could be fixed
with a union in any easy manner.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39460