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

            Bug ID: 99621
           Summary: [5-11 REGRESSION] [bisected to
                    058e97ecf33ad0dfd926b3876a4bcf59ac9556ff] regression
                    with -m32 -O1 -fcaller-saves -fexpensive-optimizations
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: williambader at hotmail dot com
  Target Milestone: ---

Created attachment 50402
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=50402&action=edit
C program processed by creduce and reformatted

gcc generates incorrect code with -m32 -O1 -fcaller-saves
-fexpensive-optimizations.
It happens in the current git master (which is gcc 11) but dates back to gcc 4.
I have a function in a large program that parses postscript.
Adding any debug printfs or even a call to an empty function in another
compilation module fixes it.
I tracked it down to a combination of -m32 -O1 -fcaller-saves
-fexpensive-optimizations.
I made a small test and used it to do a gcc bisection.
The bisection found 058e97ecf33ad0dfd926b3876a4bcf59ac9556ff , which is 16192
lines long. The commit makes heavy changes to gcc/caller-save.c, which is
probably the problem because the bug requires -fcaller-saves (one of the
optimizations included in -O2) and because adding a call to an empty function
makes it work.
I ran the test program through creduce, and that is what I am posting, along
with a data file that it reads.
In the full program, when I compile with the options to trigger the problem
plus -S with and without an extra function call and then compare the results, I
get
--- bad.s       2021-03-15 20:06:27.701846497 +0000
+++ good.s      2021-03-15 20:06:18.305695766 +0000
@@ -2068,8 +2068,10 @@
        jne     .L570
        fstp    %st(0)
 .L197:
+       fstpl   -13440(%ebp)
+       call    gcc_bug_fix
        fldl    -13512(%ebp)
-       fxch    %st(1)
+       fldl    -13440(%ebp)
        fucomi  %st(1), %st
        fstp    %st(1)
        jp      .L198
It looks like it does the same thing, but I haven't written Intel assembly
since MSDOS days.
Both good and bad compilations run clean with valgrind and with
bounds-checking-gcc-4.0.4. I also get the expected good results with clang.
The strangest part is that a bad executable gets good results under valgrind.

Reply via email to