In the following test1() code the SUCCESS branch is never reached when I
optimize the code with -O2. If I add -O2 -fno-tree-vrp or just use -O0, the
SUCCESS branch is executed as expected.
int test1()
{
int vint = 1, *v, i;
QVector<int *> vect;
vect.push_back(&vint);
vect.push_back(&vint);
vect.push_back(&vint);
vect.push_back(&vint);
for(i = 0; i < vect.size(); i++) {
v = vect.at(i);
if (i >= 3 && i <= 4) {
printf("%s SUCCESS\n", __FUNCTION__);
return 0;
}
printf("v: %p\n", v);
}
fprintf(stderr, "%s FAIL!\n", __FUNCTION__);
return 0;
}
This test2() is a modified test case where the if - statement gets its
comparison parameter via an int variable. This works with -O2.
int test2()
{
int vint = 1, *v, i, low = 3;
QVector<int *> vect;
vect.push_back(&vint);
vect.push_back(&vint);
vect.push_back(&vint);
vect.push_back(&vint);
for(i = 0; i < vect.size(); i++) {
v = vect.at(i);
if (i >= low && i <= 4) {
printf("%s SUCCESS\n", __FUNCTION__);
return 0;
}
printf("v: %p\n", v);
}
printf("%s FAIL!\n", __FUNCTION__);
return 0;
}
Attached is the preprocessed code qvector.ii and the output of the command line
used to build it. If you compile qvector.ii with -O0 or -O2 you'll see the
results.
--
Summary: c++ -O2 optimizes away a branch inside a loop (-ftree-
vrp maybe)
Product: gcc
Version: 4.4.1
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: tree-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: juha dot kallioinen at nokia dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43537