BUG: Incorrect Code Generated with /Og Optimization
ID: Q194608
|
The information in this article applies to:
-
Microsoft Visual C++, 32-bit Editions, versions 5.0, 6.0
SYMPTOMS
A code sequence similar to the following generates incorrect code when
compiled with global (/Og) optimization:
( ( ConstantValue << Variable ) + OptimizableValue );
RESOLUTION
You can work around this problem by removing global optimization from the
command line or by disabling global optimization on a per-function basis
with the optimize pragma.
Another workaround is to simplify the code and use a temporary global
variable as illustrated in the MORE INFORMATION section of this article.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed
at the beginning of this article.
MORE INFORMATION
The following code outputs 0 if compiled with /Og and 1 if compiled with
/Od.
Sample Code Workaround One
#include <iostream>
#define SIZE (unsigned int)512
static unsigned int new_depth = 1;
// #pragma optimize("g",off) // Uncomment for Workaround One.
int main()
{
unsigned int result = ( ( 8 << new_depth ) + SIZE - 1 ) / SIZE;
std::cout << "Result = " << result ;
return 0;
}
// #pragma optimize("g",on) // Uncomment for Workaround One.
Sample Code Workaround Two
#include <iostream>
#define SIZE (unsigned int)512
static unsigned int new_depth = 1;
unsigned int result1;
int main()
{
result1 = ( 8 << new_depth );
unsigned int result2 = ( ( result1 + SIZE - 1 ) / SIZE );
std::cout << "Result = " << result2 ;
return 0;
}
Additional query words:
compiler
Keywords : kbCodeGen kbCompiler kbVC500bug kbVC600bug
Version : winnt:5.0,6.0
Platform : winnt
Issue type : kbbug