------- Comment #4 from rguenth at gcc dot gnu dot org 2008-05-09 14:09 ------- The following aborts with -O2 --param max-aliased-vops=N with N in [19, 25] on x86_64-unknown-linux-gnu. Symptom is still lim being wrongly applied. If you cannot reproduce it search for the correct N with
for n in `seq 0 5 100`; do g++-4.3 -O2 -S testfoo.cxx -fdump-tree-lim -B/abuild/rguenther/gcc43-g/gcc --param max-aliased-vops=$n; grep lsm testfoo.cxx.095t.lim > /dev/null 2>&1 && echo $n; done extern "C" void abort (void); enum SbxDataType { SbxINTEGER, SbxDECIMAL, SbxBYREF = 0x4000 }; struct SbxValues { union { float nSingle; float* pSingle; }; SbxDataType eType; }; static bool ImpPutDoubleFoo( SbxValues* p) { bool bRet = false; SbxValues aTmp; int count = 0; start: switch( p->eType ) { case SbxINTEGER: if (count++ > 0) abort (); aTmp.pSingle = &p->nSingle; goto direct; case SbxBYREF | SbxDECIMAL: bRet = false; break; direct: aTmp.eType = SbxDataType( p->eType | SbxBYREF ); p = &aTmp; goto start; case SbxBYREF | SbxINTEGER: break; default: bRet =true; } return bRet; } int main( int argc, char** argv ) { SbxValues aTmp; aTmp.eType = SbxINTEGER; if ( ImpPutDoubleFoo( &aTmp ) ) abort (); return 0; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36187