https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121866
Bug ID: 121866
Summary: GCC unable to eliminate loop guard in some cases
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: lis8215 at gmail dot com
Target Milestone: ---
GCC unable to eliminate loop guard IV for code like:
extern const int ex[];
int bad_sum(int len)
{
int sum = 0;
for (int i = 0; i < len; i++)
sum += ex[i];
return sum;
}
but if rewrite function this way:
int good_sum(int len)
{
const int *x = &ex[0];
int sum = 0;
for (int i = 0; i < len; i++)
sum += x[i];
return sum;
}
then it can eliminate IV that corresponds to i variable.
here's the emitted loop assembly for both examples (rv32i):
.L9:
lw a2,0(a5)
addi a4,a4,1
addi a5,a5,4
add a3,a3,a2
bne a0,a4,.L9
.L3:
lw a4,0(a5)
addi a5,a5,4
add a0,a0,a4
bne a5,a3,.L3