BUG: Optimization Causes Code Generation Error In a Conditional Statement
ID: Q236119
|
The information in this article applies to:
-
Microsoft Visual C++, 32-bit Editions, versions 5.0, 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 3 potential ways to work around this bug:
- Turn off global optimization for that function.
- Make the function inline.
- 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.
MORE INFORMATION
The following code demonstrates the problem and resolutions 1 and 3.
// compiler options: cl /Og
#include <iostream>
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) <<endl;
cout << "Result without Optimizer: " << dTry2(100.0) <<endl;
cout << "Result with moved sub-expression: " << dTry3(100.0) <<endl;
}
Additional query words:
Keywords : kbCodeGen kbVC500bug kbVC600bug kbDSupport kbGrpVCCompiler
Version : winnt:5.0,6.0
Platform : winnt
Issue type : kbbug