Knowledge Base

FIX: Incorrect Code Generated with /Og Optimization

Article ID: 194608

Article Last Modified on 9/23/2005


APPLIES TO


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 <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;

   }
				

REFERENCES

service pack 3 sp3

Additional query words: compiler

Keywords: kbbug kbfix kbvc600fix kbqfe kbcodegen kbcompiler kbhotfixserver KB194608