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