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

Reply via email to