https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117460

            Bug ID: 117460
           Summary: riscv64 backend emits large relocations due to loop
                    strength reduction
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: aurelien at aurel32 dot net
  Target Milestone: ---

The following code, extracted from lziprecover 1.25~pre1, and compiled with -O2
-mcmodel=medany causes the riscv backend to emit out of range relocation due to
loop strength reduction, whcih then cause issues at link time:


#include <limits.h>
#include <stdbool.h>

bool foo(const char *const arg) {
    const char *const target = "foo";
    if (arg[0] == target[0]) {
        for (int i = 1; i < INT_MAX; ++i) {
            if (arg[i] == 0) return true;
            if (arg[i] != target[i]) break;
        }
    }
    return false;
}

See how both side of the loop, 1 and INT_MAX, end up in the generated code:

.L9:
        addi    a0,a0,1
        lla     a5,.LC0+1
        lla     a2,.LC0+2147483647
        j       .L3


(Thanks to Jessica Clarke for helping understanding the issue)

Reply via email to