I want a reduced test case for this problem for bugzilla, but don't really know the exact cause. I _think_ code is being improperly optimized away, but I don't know. This function is part of a BigInteger library, and works perfectly upto and including -O2, but produces bogus results at -O3, unless I uncomment the debug_msg() line, which just dumps the contents of 'i' to the screen. I'm guessing that without it, the compiler fails to notice that i's contents are being accessed via the _front8/_back8 pointers, and throws the preceeding 'i' related code away. Heres the code:
void Integer::export_bytes(Data& _buffer, PortMode _mode) const { debug_scope("export_bytes(Data&)"); Integer i(*this,1); if (_mode==SIGNED) { if (*mBack & TOP_BIT) i.grow(1,0); if (sign()<0) i.twoscomplement(); } for (UnsignedW* p=i.mFront; p<=i.mBack; p++) *p = host2little(*p); Unsigned8* _front8 = reinterpret_cast<Unsigned8*>(i.mFront); Unsigned8* _back8 = _front8+(i.mSize*WORD_BYTES)-1; if (_mode==UNSIGNED) while (_back8!=_front8 and *_back8==0) _back8--; else if (mSign==1) while (_back8!=_front8 and *_back8==0 and !(*(_back8-1)&0x80)) _back8--; else while (_back8!=_front8 and *_back8==0xff and *(_back8-1)&0x80) _back8--; //debug_msg(String("Force i\n")+i.dump()); _buffer.assign(_front8, _back8+1); } Any thoughts on how to proceed? Andrew Walrond