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