gcc miscompiles this testcase (reduced from rtorrent) since r111639, compile with -O1 -fstrict-aliasing:
#include <sigc++/bind.h> #include <sigc++/slot.h> static long dummy; struct A { static void *foo (void *p) { return p; } typedef sigc::slot <void *> C; C bar(); }; A::C A::bar () { return sigc::bind (sigc::ptr_fun (&A::foo), &dummy); } int main (void) { A a; if (a.bar ()() != &dummy) abort (); return 0; } The program will crash in operator() because we store garbage instead of function pointer inside A::bar(): --- O1 2006-12-18 18:44:34.000000000 +0300 +++ O1-fstrict-aliasing 2006-12-18 18:44:41.000000000 +0300 @@ -248,8 +248,8 @@ movq sigc::internal::typed_slot_rep<sigc::bind_functor<-1, sigc::pointer_functor1<void*, void*>, long*, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil, sigc::nil> >::dup(void*), 24(%rbx) movq $0, 32(%rbx) movq $0, 40(%rbx) + movq %rbx, 64(%rbx) movq $dummy, 72(%rbx) - movq A::foo(void*), 64(%rbx) movq %rbx, (%rsp) leaq 48(%rbx), %rsi movq %rsp, %rdi I will attach preprocessed and somewhat reduced testcase in a moment. Caused by this patch: Index: gcc/ChangeLog =================================================================== --- gcc/ChangeLog (revision 111638) +++ gcc/ChangeLog (revision 111639) @@ -1,3 +1,8 @@ +2006-03-02 Richard Guenther <[EMAIL PROTECTED]> + + * tree-ssa-alias.c (find_used_portions): Consider taking + the address as making the variable not write-only. + 2006-03-02 Nick Clifton <[EMAIL PROTECTED]> * config.gcc (default_use_cxa_atexit): Extend the description of Index: gcc/tree-ssa-alias.c =================================================================== --- gcc/tree-ssa-alias.c (revision 111638) +++ gcc/tree-ssa-alias.c (revision 111639) @@ -3071,6 +3071,8 @@ find_used_portions (tree *tp, int *walk_ up->minused = 0; up->maxused = TREE_INT_CST_LOW (DECL_SIZE (var)); up->implicit_uses = true; + if (!lhs_p) + up->write_only = false; up_insert (uid, up); *walk_subtrees = 0; -- Summary: [4.2/4.3 regression] miscompilation of sigc++-2.0 based code with -fstrict-aliasing Product: gcc Version: 4.2.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: belyshev at depni dot sinp dot msu dot ru http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30252