http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55216
Bug #: 55216
Summary: Infinite loop generated on non-infinite code
Classification: Unclassified
Product: gcc
Version: 4.8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: [email protected]
ReportedBy: [email protected]
Attempting to compile this code:
int d[16];
int
SATD (void)
{
int k, satd = 0, dd;
for (dd=d[k=0]; k<16; dd=d[++k])
{
satd += (dd < 0 ? -dd : dd);
}
return satd;
}
with -O2 generates an infinite loop:
.L2:
b .L2
I am using trunk gcc (sync'd to r193173) configured with:
--target=arm-linux-gnueabi --with-cpu=cortex-a15 --with-gnu-as --with-gnu-ld
--enable-__cxa_atexit --disable-libssp --disable-libmudflap
--enable-languages=c,c++,fortran --disable-nls
Although I am pretty sure this is a tree optimization issue and not a target
issue because I see the transformation from a valid loop into an invalid loop
during vrp1.
Specifically, when visiting this PHI node for the last time:
Visiting PHI node: k_1 = PHI <0(2), k_8(4)>
Argument #0 (2 -> 3 executable)
0
Value: [0, 0]
Argument #1 (4 -> 3 executable)
k_8
Value: [1, 15]
vrp_visit_phi_node determines that the range for k_1 is:
k_1: [0,14]
If I'm understanding this correctly, the union of these ranges should give us
[0,15] instead (and would, except that adjust_range_with_scev() overrides it).
This invalid range leads to the belief that the loop exit condition can never
be met.