DOCUMENT:Q236119 11-FEB-2002 [visualc] TITLE :FIX: Optimization Causes Code Error In Conditional Statement PRODUCT :Microsoft C Compiler PROD/VER::5.0,6.0 OPER/SYS: KEYWORDS:kbCodeGen kbVC500bug kbVC600bug kbDSupport kbGrpDSVCCompiler kbNoUpdate kbgrpdsvc ====================================================================== ------------------------------------------------------------------------------- The information in this article applies to: - Microsoft Visual C++, 32-bit Enterprise Edition, versions 5.0, 6.0 - Microsoft Visual C++, 32-bit Professional Edition, versions 5.0, 6.0 - Microsoft Visual C++, 32-bit Learning Edition, version 6.0 ------------------------------------------------------------------------------- SYMPTOMS ======== The optimizer may generate incorrect code for an if statement that contains identical expressions in both conditional statements. CAUSE ===== The optimizer makes a mistake when trying to move common sub-expressions to a single location. RESOLUTION ========== There are three potential ways to work around this bug: 1. Turn off global optimization for that function. 2. Make the function inline. 3. Move the common expression before the if block. STATUS ====== Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This bug was corrected in Visual Studio 6 Service Pack 4. MORE INFORMATION ================ The following code demonstrates the problem and resolutions 1 and 3. // compiler options: cl /Og #include static long llll = 0; double dTry1(double d) { if (d < 0.0) { llll++; return(0.0); } else { llll++; return(100.0); } } #pragma optimize("g",off) double dTry2(double d) { if (d < 0.0) { llll++; return(0.0); } else { llll++; return(100.0); } } #pragma optimize("",on) double dTry3(double d) { llll++; if (d < 0.0) return(0.0); else return(100.0); } void main(){ using namespace std; cout << "Result with Optimizer: " << dTry1(100.0) <