g++ 4.0 gives an ICE compiling the source below with -O1:
$ ./cc1plus -quiet -O1 x.cc x.cc: In function 'void writeDigi()': x.cc:10: internal compiler error: in merge_alias_info, at tree-ssa-copy.c:217 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. $ It's crashing at the abort() here: 212 if (new_ptr_info->name_mem_tag == NULL_TREE) 213 memcpy (new_ptr_info, orig_ptr_info, sizeof (*new_ptr_info)); 214 else if (orig_ptr_info->name_mem_tag == NULL_TREE) 215 memcpy (orig_ptr_info, new_ptr_info, sizeof (*orig_ptr_info)); 216 else if (orig_ptr_info->name_mem_tag != new_ptr_info->name_mem_tag) 217 abort (); Here are the values that are being compared: (gdb) p *orig_ptr_info $5 = {pt_anything = 0, pt_malloc = 0, value_escapes_p = 0, is_dereferenced = 1, pt_global_mem = 0, pt_vars = 0x400b18a0, name_mem_tag = 0x400baef4} (gdb) p *new_ptr_info $6 = {pt_anything = 0, pt_malloc = 0, value_escapes_p = 0, is_dereferenced = 1, pt_global_mem = 0, pt_vars = 0x400b1880, name_mem_tag = 0x400bae80} (gdb) call debug_tree( orig_ptr_info->name_mem_tag) <var_decl 0x400baef4 NMT.4 type <integer_type 0x4002a4fc int public SI size <integer_cst 0x400223d8 constant invariant 32> unit size <integer_cst 0x40022168 constant invariant 4> align 32 symtab 0 alias set -1 precision 32 min <integer_cst 0x40022390 -2147483648> max <integer_cst 0x400223a8 2147483647> pointer_to_this <pointer_type 0x40038ef4>> addressable used ignored SI file x.cc line 10 size <integer_cst 0x400223d8 32> unit size <integer_cst 0x40022168 4> align 32 context <function_decl 0x400b8a6c writeDigi>> (gdb) call debug_tree( new_ptr_info->name_mem_tag) <var_decl 0x400bae80 NMT.3 type <integer_type 0x4002a4fc int public SI size <integer_cst 0x400223d8 constant invariant 32> unit size <integer_cst 0x40022168 constant invariant 4> align 32 symtab 0 alias set -1 precision 32 min <integer_cst 0x40022390 -2147483648> max <integer_cst 0x400223a8 2147483647> pointer_to_this <pointer_type 0x40038ef4>> addressable used ignored SI file x.cc line 10 size <integer_cst 0x400223d8 32> unit size <integer_cst 0x40022168 4> align 32 context <function_decl 0x400b8a6c writeDigi>> Environment: System: Linux karma 2.6.8.1 #20 Mon Sep 13 23:48:47 EDT 2004 i686 i686 i386 GNU/Linux Architecture: i686 <machine, os, target, libraries (multiple lines)> host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: /home/sss/gcc/gcc/configure --prefix=/usr/local/gcc --enable-threads=posix --enable-long-long --enable-languages=c,c++,f95 How-To-Repeat: Compile with -O1: ------------------------------------------------- struct C { int size() const { return 0;} }; int foo (int); void writeDigi() { C strErgC; int mcdigi ; int* pmcdigi = &mcdigi ; int mcdigi_crosstalk ; if ( foo(0) ) pmcdigi = &mcdigi_crosstalk; int mcdigi_elec_noise ; if ( strErgC.size() > 0 ) { foo(*pmcdigi ); pmcdigi = &mcdigi_elec_noise; } foo(*pmcdigi); } ------------------------------------------------- ------- Additional Comments From snyder at fnal dot gov 2004-11-03 20:43 ------- Fix: <how to correct or work around the problem, if known (multiple lines)> -- Summary: 4.0: ICE in merge_alias_info Product: gcc Version: 0.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: snyder at fnal dot gov CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18291