[EMAIL PROTECTED] writes: > 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?
I think your code is broken. A reinterpret_cast from foo* to bar* is only well-defined if foo and bar are compatible types or one of {foo,bar} is type char. I can't be sure from your code, but I'm guessing that i.mFront is not declared as a pointer to Unsigned8, but as a pointer to an incompatible type UnsignedW. Andrew.