// system: core duo, 2.4 GHz, 64bit debian sid, vanilla kernel 2.6.26.2
// I stumbled over this using gcc 4.3.1 (Debian 4.3.1-8)
// compiler switches: -O3 -mssse3
// there were no compiler warnings / errors.
const int32_t nCC_[16] =
{
3, 2, 2, 1, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0
};
int32_t Residual4x4( int16_t *pAR, int32_t &nCost )
{
int32_t nRun = 0;
for( int i=0 ; i<16 ; ++i )
if ( const int v = pAR[i] ) {
nCost += ( abs(v) > 1 ) ? 16 : nCC_[nRun];
nRun = 0;
} else
++nRun;
}
// the above code calculates nCost uncorrectly (leading to a segfault later on)
// when I use the compiler switch -O2 or replace the conditional assignment by
an if / else
// construct, everything works fine.
// gcc 4.2 works fine too. (-with -O3 -msse2)
--
Summary: conditional evaluation incorrect with -O3
Product: gcc
Version: 4.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: erik dot moller at cycos dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37096