[Bug tree-optimization/30252] New: [4.2/4.3 regression] miscompilation of sigc++-2.0 based code with -fstrict-aliasing
belyshev at depni dot sinp dot msu dot ru
gcc-bugzilla@gcc.gnu.org
Mon Dec 18 15:56:00 GMT 2006
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 <rguenther@suse.de>
+
+ * tree-ssa-alias.c (find_used_portions): Consider taking
+ the address as making the variable not write-only.
+
2006-03-02 Nick Clifton <nickc@redhat.com>
* 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
More information about the Gcc-bugs
mailing list