gcc-4.4 optimization of a program using -O3 leads to incorrect assembly code

Solution Verified - Updated -

Issue

  • gcc-4.4 optimization of a program using -O3 leads to incorrect assembly code
  • The program is as follows:

#include <stdlib.h>

typedef struct bmRecord bmRecord;
struct bmRecord {
    bmRecord    *next;
};

typedef struct bmHeader bmhdr;
struct bmHeader {
    void        *blocklist;
    bmRecord    *freelist;

    int
        nrec,
        datasize,
        realsize,
        blocksize;
};

typedef  struct {
    int         x;
    int         y;
} vPoint;

typedef struct varPoint varPoint;
struct varPoint {
    varPoint    *next;
    vPoint       point;
};

typedef struct varShape varShape;
struct varShape {
    varShape    *next;
    varPoint    *points;
    int          nPoints;
};

static bmhdr    VarPointPool;

int getShape(void *inPtr, int *layer, int *nPoints, vPoint **points)
{
    static vPoint  tmpPoints[4096];
    varPoint      *p, *nextP;
    varShape      *s, **inShapes = inPtr;

    *layer = *nPoints = 0;
    s = *inShapes;
    if( !s ) return 1;

    *points = (vPoint*) tmpPoints;
    for( p = s->points; p; p = nextP ) {
        tmpPoints[(*nPoints)++] = p->point;
        nextP = p->next;
        {
            bmRecord *bm__y;
            bmhdr    *bm__z;

            bm__z = &(VarPointPool);
            bm__y = (bmRecord *) (void *)(p);
            bm__y->next = bm__z->freelist;
            bm__z->freelist = bm__y;
        }
    }
    *inShapes = s->next;
    return 1;
}

int call_getShape(void)
{
    varShape  inPtr1, *inPtr = &inPtr1;
    int       layer=0, nPoints=0;
    vPoint   *pouts[1024];
    varPoint *points = (varPoint *)calloc(1,sizeof(varPoint));

    inPtr->points = points;

    points->next = (varPoint *)calloc(1, sizeof(varPoint));
    points->next->next = 0;

    VarPointPool.freelist = (bmRecord *)0x100;
    getShape( &inPtr, &layer, &nPoints, &pouts[0]);

    return 0;
}

int main(int argc, char *argv[])
{
    call_getShape();
    return 0;
}

Environment

  • Red Hat Enterprise Linux 5.5
  • gcc44

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content