http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46488

--- Comment #17 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2010-11-28 
12:28:27 UTC ---
It appears that inlining brigade_move into ap_core_input_filter and
ap_core_output_filter at -O3 causes (one of) the latter functions to be
miscompiled with -fstrict-aliasing.

The code uses clever type punning which seems to break C aliasing rules:

/**
 * The Ring Sentinel
 *
 * This is the magic pointer value that occurs before the first and
 * after the last elements in the ring, computed from the address of
 * the ring's head.  The head itself isn't an element, but in order to
 * get rid of all the special cases when dealing with the ends of the
 * ring, we play typecasting games to make it look like one.

[...]

#define APR_RING_SENTINEL(hp, elem, link)                \
    (struct elem *)((char *)(&(hp)->next) - APR_OFFSETOF(struct elem, link))

(hp)->next is struct elem* but it is accessed (its link field) as a struct elem
through various macros:

#define APR_RING_NEXT(ep, link)    (ep)->link.next
#define APR_RING_PREV(ep, link)    (ep)->link.prev

Reply via email to