Microsoft KB Archive/194608

= FIX: Incorrect Code Generated with /Og Optimization =

Article ID: 194608

Article Last Modified on 9/23/2005

-

APPLIES TO


 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q194608



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. This problem was corrected in Visual C++ version 6.0, Service Pack 3 (SP3).



MORE INFORMATION
The following code outputs 0 if compiled with /Og and 1 if compiled with /Od.

Sample Code Workaround One
#include #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 #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;

}

