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

            Bug ID: 116799
           Summary: [14 Regression] Miscompiled code on s390x at -O2
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jamessan at jamessan dot com
  Target Milestone: ---

With gcc-14, one of Vim's test_glob2regpat tests started failing on s390x when
compiled with -O2. I've minimized Vim's code down to the simple reproduction
below. When compile correctly this should output "** -> .*" but instead its
showing "** -> $".

Bisecting shows that the problem was introduced by
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111294

int printf(const char *, ...);
long unsigned int strlen(const char *s);

void file_pat_to_reg_pat(const char *pat, char *reg_pat)
{
    const char * pat_end = pat + strlen(pat);

    while (pat[0] == '*' && pat < pat_end - 1)
        pat++;

    const char * endp = pat_end - 1;
    int add_dollar = 1;
    if (endp >= pat)
    {
        while (endp - pat > 0 && *endp == '*')
            endp--;
        add_dollar = 0;
    }

    int i = 0;
    for (const char * p = pat; *p && p <= endp; p++)
    {
        switch (*p)
        {
            case '*':
                reg_pat[i++] = '.';
                reg_pat[i++] = '*';
                while (p[1] == '*')
                    ++p;
                break;
            default:
                reg_pat[i++] = *p;
                break;
        }
    }
    if (add_dollar)
        reg_pat[i++] = '$';
    reg_pat[i] = '\000';
}

int main()
{
    char regpat[7] = {0};
    file_pat_to_reg_pat("**", regpat);
    printf("** -> %s\n", regpat);
    return 0;
}

Reply via email to