------- 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

Reply via email to