Bug 11059 - [3.3 regression] empty union optimization ice
Summary: [3.3 regression] empty union optimization ice
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: rtl-optimization (show other bugs)
Version: 3.3
: P2 normal
Target Milestone: 3.3.1
Assignee: roger
URL:
Keywords: ice-on-valid-code
Depends on:
Blocks:
 
Reported: 2003-06-02 05:04 UTC by John Lenz
Modified: 2003-07-13 21:41 UTC (History)
1 user (show)

See Also:
Host: i386-debian-linux-gnu
Target: i386-linux-gnu
Build: i386-debian-linux-gnu
Known to work:
Known to fail:
Last reconfirmed: 2003-07-05 23:24:14


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description John Lenz 2003-06-02 05:04:47 UTC
I have narrowed the seg fault down to the small file
union uni {};

int main() {
  uni *h;
  h = (uni *)new uni();
}

When compiling that file with optimizations turned on
gcc -O2 seg.cxx
seg.cxx: In function `int main()':
seg.cxx:5: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.

The error happens on both gcc 3.3 and 3.2.  Compiling without any optimizations
works fine.  Changing the untion to "union uni { int a; };" does not produce the
error.

I am using gcc from Debian GNU/Linux on i386.

gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/3.3/specs
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared --with-system-zlib
--enable-nls --without-included-gettext --enable-__cxa_atexit
--enable-clocale=gnu --enable-debug --enable-java-gc=boehm
--enable-java-awt=xlib --enable-objc-gc i386-linux
Thread model: posix
gcc version 3.3 (Debian)

gcc-3.2 -v
Reading specs from /usr/lib/gcc-lib/i386-linux/3.2.3/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,objc,ada
--prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info
--with-gxx-include-dir=/usr/include/c++/3.2 --enable-shared --with-system-zlib
--enable-nls --without-included-gettext --enable-__cxa_atexit
--enable-clocale=gnu --enable-java-gc=boehm --enable-objc-gc i386-linux
Thread model: posix
gcc version 3.2.3

John
Comment 1 Andrew Pinski 2003-06-02 05:09:59 UTC
It worked on 3.0.4 and 2.95.3 but fails on mainline (20030601), 3.3.1 (20030526) and 
3.2.3.
Comment 2 CVS Commits 2003-07-07 18:54:31 UTC
Subject: Bug 11059

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	sayle@gcc.gnu.org	2003-07-07 18:54:28

Modified files:
	gcc            : ChangeLog expr.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/opt: emptyunion.C 

Log message:
	PR optimization/11059
	* expr.c (can_store_by_pieces): Return true if length is zero.
	(store_by_pieces): If length is zero and endp is two, abort,
	othwerise, if length is zero and endp is not two, return "to".
	(clear_by_pieces): Do nothing if length is zero.
	(clear_storage): Do nothing if length is zero.
	(store_constructor): Simplify code when size is zero, or the
	target has already been cleared.  This avoids emitting a
	blockage instruction when initializing empty structures.
	
	* g++.dg/opt/emptyunion.C: New testcase.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.380&r2=2.381
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/expr.c.diff?cvsroot=gcc&r1=1.565&r2=1.566
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2846&r2=1.2847
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/emptyunion.C.diff?cvsroot=gcc&r1=NONE&r2=1.1

Comment 3 Andrew Pinski 2003-07-11 14:44:37 UTC
This is a regression only in 3.3 now.
Comment 4 CVS Commits 2003-07-13 21:37:52 UTC
Subject: Bug 11059

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_3-branch
Changes by:	sayle@gcc.gnu.org	2003-07-13 21:37:49

Modified files:
	gcc            : ChangeLog expr.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/opt: emptyunion.C 

Log message:
	PR optimization/11059
	* expr.c (can_store_by_pieces): Return true if length is zero.
	(store_by_pieces): Do nothing if length is zero.
	(clear_by_pieces): Do nothing if length is zero.
	(clear_storage): Do nothing if length is zero.
	(store_constructor): Simplify code when size is zero, or the
	target has already been cleared.  This avoids emitting a
	blockage instruction when initializing empty structures.
	
	* g++.dg/opt/emptyunion.C: New testcase.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.16114.2.653&r2=1.16114.2.654
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/expr.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.498.2.18&r2=1.498.2.19
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.2261.2.228&r2=1.2261.2.229
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/emptyunion.C.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=NONE&r2=1.1.6.1

Comment 5 Andrew Pinski 2003-07-13 21:40:41 UTC
Fixed by the above patch in 3.3.1 and the mainline.
Comment 6 CVS Commits 2003-07-16 11:42:42 UTC
Subject: Bug 11059

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-3_2-rhl8-branch
Changes by:	jakub@gcc.gnu.org	2003-07-16 11:42:39

Modified files:
	gcc            : ChangeLog expr.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/opt: emptyunion.C 

Log message:
	2003-07-07  Roger Sayle  <roger@eyesopen.com>
	
	PR optimization/11059
	* expr.c (can_store_by_pieces): Return true if length is zero.
	(store_by_pieces): If length is zero and endp is two, abort,
	othwerise, if length is zero and endp is not two, return "to".
	(clear_by_pieces): Do nothing if length is zero.
	(clear_storage): Do nothing if length is zero.
	(store_constructor): Simplify code when size is zero, or the
	target has already been cleared.  This avoids emitting a
	blockage instruction when initializing empty structures.
	
	2003-07-07  Roger Sayle  <roger@eyesopen.com>
	
	PR optimization/11059
	* g++.dg/opt/emptyunion.C: New testcase.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.13152.2.657.2.27.2.143&r2=1.13152.2.657.2.27.2.144
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/expr.c.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.423.2.19.4.1.2.16&r2=1.423.2.19.4.1.2.17
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=1.1672.2.166.2.8.2.57&r2=1.1672.2.166.2.8.2.58
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/opt/emptyunion.C.diff?cvsroot=gcc&only_with_tag=gcc-3_2-rhl8-branch&r1=NONE&r2=1.1.8.1