c/6893: gcc generates invalid code for x86 subarches.

Glen Nakamura glen@imodulo.com
Sat Jun 1 08:48:00 GMT 2002


http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6893

Aloha,

Looks like the testcase you provided has an aliasing problem:
icolor = (int *) tmp;

Strict aliasing does not allow casting from (float *) to (int *)...
You will need to fix your code or compile w/ -fno-strict-aliasing.
See the GCC documentation on -fstrict-aliasing for more information.

Please check if your problem persists with the attached testcase.

- Glen Nakamura

-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>

#define min(a,b) ((a) < (b) ? (a) : (b))

typedef union {
    float f;
    int   i;
} tmp_t;

float source[4];
tmp_t tmp[4];
unsigned char out[4];

extern void inline FtoUB (float *in, char *out, int num)
{
    int         i;
    tmp_t       *icolor;
    tmp_t       *fcolor_to;

    fcolor_to = tmp;

    // shift float to have 8bit fraction at base of number
    for (i = 0; i < num; i += 4) {
        fcolor_to[i    ].f = in[i    ] + 32768.0f;
        fcolor_to[i + 1].f = in[i + 1] + 32768.0f;
        fcolor_to[i + 2].f = in[i + 2] + 32768.0f;
        fcolor_to[i + 3].f = in[i + 3] + 32768.0f;
    }

    icolor = tmp;

    // then read as integer and kill float bits...
    for (i = 0; i < num; i += 4) {
        out[i    ] = (char) min(icolor[i    ].i & 0x7FFFFF, 255);
        out[i + 1] = (char) min(icolor[i + 1].i & 0x7FFFFF, 255);
        out[i + 2] = (char) min(icolor[i + 2].i & 0x7FFFFF, 255);
        out[i + 3] = (char) min(icolor[i + 3].i & 0x7FFFFF, 255);
    }
}

int
main (int argc, char *argv[])
{
    source[0] = atof(argv[1]);
    source[1] = atof(argv[2]);
    source[2] = atof(argv[3]);
    source[3] = atof(argv[4]);

    FtoUB(source, out, 4);

    printf("in: %f %f %f %f\n", source[0], source[1], source[2], source[3]);
    printf("out: %d %d %d %d\n", out[0], out[1], out[2], out[3]);
    exit (0);
}


More information about the Gcc-bugs mailing list