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

--- Comment #5 from Sergei Trofimovich <slyfox at gcc dot gnu.org> ---
(In reply to H.J. Lu from comment #3)
> This may be fixed by r15-1954.

Great find! That fix repairs `zlib` and `perl` for me.

Here is the extracted example from zlib-1.3.1 for completeness in case it's
useful to have a generic C example for test suite:

// $ cat compress.c
typedef unsigned long uLong;
typedef unsigned int uInt;

struct s {
    unsigned int ai;
    unsigned int ao;
};
__attribute__((noipa))
static void init_struct(struct s * p) {
    p->ai = 0;
    p->ao = 0;
}
__attribute__((noipa))
static void do_struct(struct s * p, uLong sourceLen, uLong destLen) {
    uLong left = destLen;
    const uInt max = (uInt)-1;

    if (p->ao == 0) {
        p->ao = left > (uLong)max ? max : (uInt)left;
        left -= p->ao;
    }
    if (p->ai == 0) {
        p->ai = sourceLen > (uLong)max ? max : (uInt)sourceLen;
        sourceLen -= p->ai;
    }
}
__attribute__((noipa))
static void check_struct(struct s * p) {
    if (p->ai != 0xe) __builtin_trap();
    if (p->ao != 0xea60) __builtin_trap();
}

int main(void) {
    struct s v;
    init_struct(&v);
    do_struct(&v, 0xe, 0xea60);
    check_struct(&v);
    return 0;
}

Crashing with gcc r15-1936-g80e446e829d818:

$ gcc -O2 -o bug compress.c && ./bug
Illegal instruction (core dumped)
$ gcc -O1 -o bug compress.c && ./bug
<ok>

Reply via email to