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

            Bug ID: 117647
           Summary: Setting break point changes program output
           Product: gcc
           Version: 8.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: debug
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wuz73 at hotmail dot com
  Target Milestone: ---

OS: 4.18.0-477.13.1.el8_8.x86_64 #1 SMP Tue May 30 16:09:32 PDT 2023 x86_64
x86_64 x86_64 GNU/Linux
g++: 8.5.0 20210514 (Red Hat 8.5.0-18.0.2)
gdb: GNU gdb (GDB) Red Hat Enterprise Linux 8.2-19.0.1.el8

While debugging a program, I found that adding a break point can change the
program output! After some maneuver, I finally constructed this code to
reproduce:

<code>
#include <cstdio>
double a=39535.263;
double b=39535.263;
double c=39531.538;
double g=0.32;
int main()
{
    double d=a-b;
    double e=b-c;
    double f=0;
    double w=0.14;
    if(d+e>1e-10)
        f=(d-e)/(d+e);
    g=f*(1-w)+g*w;
    printf("%g\n",g);
}
</code>

After "g++ -g -O2 -mfma", you can check that the output should be -0.8152.
However, if you set a break point on this FMA instruction:

 400520:       c4 e2 f1 99 05 c7 01    vfmadd132sd 0x1c7(%rip),%xmm1,%xmm0 

upon hitting the break point, continue, and you will see an incorrect output
0.0448. I tried hb (hardware-assisted break point) and it is the same. Latest
gdb 15.2 also yields the same error.

I suspect that gdb didn't calculate rip correctly when execute the vfmadd132sd
instruction, as it uses rip.  I tried to break on some other instructions using
rip (vmovsd, vsubsd, vcomisd, vmulsd) and they seem to be OK.

Reply via email to