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

            Bug ID: 117770
           Summary: FAIL: g++.dg/torture/pr37922.C   -O3
                    -fomit-frame-pointer -funroll-loops -fpeel-loops
                    -ftracer -finline-functions  execution test
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: danglin at gcc dot gnu.org
  Target Milestone: ---

Created attachment 59698
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59698&action=edit
Reload RTL dump

spawn -ignore SIGHUP /home/dave/gnu/gcc/objdir/gcc/testsuite/g++1/../../xg++
-B/
home/dave/gnu/gcc/objdir/gcc/testsuite/g++1/../../
/home/dave/gnu/gcc/gcc/gcc/te
stsuite/g++.dg/torture/pr37922.C -fdiagnostics-plain-output -nostdinc++
-I/home/
dave/gnu/gcc/objdir/hppa-linux-gnu/libstdc++-v3/include/hppa-linux-gnu
-I/home/d
ave/gnu/gcc/objdir/hppa-linux-gnu/libstdc++-v3/include
-I/home/dave/gnu/gcc/gcc/
libstdc++-v3/libsupc++ -I/home/dave/gnu/gcc/gcc/libstdc++-v3/include/backward
-I
/home/dave/gnu/gcc/gcc/libstdc++-v3/testsuite/util -fmessage-length=0 -O3
-fomit
-frame-pointer -funroll-loops -fpeel-loops -ftracer -finline-functions -fpic
-L/
home/dave/gnu/gcc/objdir/hppa-linux-gnu/./libstdc++-v3/src/.libs
-B/home/dave/gn
u/gcc/objdir/hppa-linux-gnu/./libstdc++-v3/src/.libs
-L/home/dave/gnu/gcc/objdir
/hppa-linux-gnu/./libstdc++-v3/src/.libs
-L/home/dave/gnu/gcc/objdir/hppa-linux-
gnu/./libstdc++-v3/src/experimental/.libs -lm -o ./pr37922.exe
PASS: g++.dg/torture/pr37922.C   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-
loops -ftracer -finline-functions  (test for excess errors)
Setting LD_LIBRARY_PATH to
.:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/./libstdc+
+-v3/src/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/./libstdc++-v3/src/.libs
:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/./libstdc++-v3/src/experimental/.libs:
/home/dave/gnu/gcc/objdir/gcc/testsuite/g++1/../..:.:/home/dave/gnu/gcc/objdir/h
ppa-linux-gnu/./libstdc++-v3/src/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/./libstdc++-v3/src/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/./libstdc++-v3/src/experimental/.libs:/home/dave/gnu/gcc/objdir/gcc/testsuite/g++1/../..:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libstdc++-v3/src/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libssp/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libgomp/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libatomic/.libs:/home/dave/gnu/gcc/objdir/./gcc:/home/dave/gnu/gcc/objdir/./prev-gcc:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libstdc++-v3/src/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libssp/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libgomp/.libs:/home/dave/gnu/gcc/objdir/hppa-linux-gnu/libatomic/.libs:/home/dave/gnu/gcc/objdir/./gcc:/home/dave/gnu/gcc/objdir/./prev-gcc
Execution timeout is: 300
spawn [open ...]
FAIL: g++.dg/torture/pr37922.C   -O3 -fomit-frame-pointer -funroll-loops
-fpeel-loops -ftracer -finline-functions  execution test

dave@mx3210:~/gnu/gcc/objdir/gcc/testsuite/g++1/lra$ ./pr37922.exe
Floating point exception (core dumped)

Reading symbols from pr37922.exe...
(gdb) r
Starting program: /home/dave/gnu/gcc/objdir/gcc/testsuite/g++1/lra/pr37922.exe
warning: Unable to find libthread_db matching inferior's thread library, thread
debugging will not be available.

Program received signal SIGFPE, Arithmetic exception.
$$divoI () at ../../../gcc/libgcc/config/pa/milli64.S:452
452             addit,= 0,arg1,r0       /*  trap if divisor == 0 */
(gdb) bt
#0  $$divoI () at ../../../gcc/libgcc/config/pa/milli64.S:452
#1  0x00010f44 in unsigned int form_t<int>(mat_ref<int, mat_grid>&,
mat_ref<int, mat_grid> const&) ()
#2  0x00010910 in rot_mx_info::rot_mx_info(rot_mx const&) ()
#3  0x0001041c in main ()
(gdb) frame 1
#1  0x00010f44 in unsigned int form_t<int>(mat_ref<int, mat_grid>&,
mat_ref<int, mat_grid> const&) ()
(gdb) disass $pc-48,$pc+16
Dump of assembler code from 0x10f14 to 0x10f54:
   0x00010f14 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1296>:  stw r4,-10(sp)
   0x00010f18 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1300>:  fldw
-10(sp),fr22
   0x00010f1c <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1304>:  xmpyu
fr22,fr4,fr10
   0x00010f20 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1308>:  fstd
fr10,-10(sp)
   0x00010f24 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1312>:  ldw -10(sp),r25
   0x00010f28 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1316>:  ldw -c(sp),r26
   0x00010f2c <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1320>:  add,l
r21,r26,ret1
   0x00010f30 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1324>:  copy r26,r10
   0x00010f34 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1328>:  ldw,s
ret1(r20),r8
   0x00010f38 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1332>:  copy r8,r26
   0x00010f3c <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1336>:  b,l 0x12414
<$$divoI+4>,r31
   0x00010f40 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1340>:  nop
=> 0x00010f44 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1344>:  stw
ret1,-10(sp)
   0x00010f48 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1348>:  cmpb,<>
r0,ret1,0x1117c <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1912>
--Type <RET> for more, q to quit, c to continue without paging--
   0x00010f4c <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1352>:  fldw
-10(sp),fr4R
   0x00010f50 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1356>:  fstw
fr22,-10(sp)
End of assembler dump.

form_t is miscompiled by LRA.  The initialization of register r25 is clobbered
by this floating-point to general register copy:

   0x00010f20 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1308>:  fstd
fr10,-10(sp)
   0x00010f24 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1312>:  ldw -10(sp),r25
   0x00010f28 <_Z6form_tIiEjR7mat_refIT_8mat_gridERKS3_+1316>:  ldw -c(sp),r26

Here is the relevant RTL from the reload pass:

(insn 291 289 3075 78 (set (reg:SI 25 %r25)
        (mem:SI (plus:SI (mult:SI (reg:SI 31 %r31 [353])
                    (const_int 4 [0x4]))
                (reg/f:SI 20 %r20 [orig:415 _57 ] [415])) [1 *_147+0 S4 A32]))
"
/home/dave/gnu/gcc/gcc/gcc/testsuite/g++.dg/torture/pr37922.C":356:17 discrim 4
42 {*pa.md:2195}
     (nil))
(insn 3075 291 3134 78 (set (reg:DI 70 %fr23 [349])
        (mult:DI (zero_extend:DI (reg/v:SI 68 %fr22 [orig:246 _449 ] [246]))
            (zero_extend:DI (reg:SI 74 %fr25 [orig:259 prephitmp_473 ]
[259]))))
 "/home/dave/gnu/gcc/gcc/gcc/testsuite/g++.dg/torture/pr37922.C":309:27 discrim
3 128 {umulsidi3}
     (nil))
(insn 3134 3075 285 78 (set (reg:DI 25 %r25 [349])
        (reg:DI 70 %fr23 [349]))
"/home/dave/gnu/gcc/gcc/gcc/testsuite/g++.dg/to
rture/pr37922.C":309:27 discrim 3 81 {*pa.md:4264}
     (nil))
(insn 285 3134 286 78 (set (reg:SI 31 %r31 [350])
        (plus:SI (reg/v:SI 21 %r21 [orig:202 j ] [202])
            (reg:SI 26 %r26 [orig:349+4 ] [349])))
"/home/dave/gnu/gcc/gcc/gcc/t
estsuite/g++.dg/torture/pr37922.C":309:27 discrim 3 120 {addsi3}
     (nil))
(insn 286 285 284 78 (set (reg:SI 7 %r7 [orig:104 _14 ] [104])
        (mem:SI (plus:SI (mult:SI (reg:SI 31 %r31 [350])
                    (const_int 4 [0x4]))
                (reg/f:SI 20 %r20 [orig:415 _57 ] [415])) [1 *_152+0 S4 A32]))
"
/home/dave/gnu/gcc/gcc/gcc/testsuite/g++.dg/torture/pr37922.C":356:28 discrim 2
42 {*pa.md:2195}
     (nil))
(insn 284 286 290 78 (set (reg:SI 10 %r10 [orig:178 _149 ] [178])
        (reg:SI 26 %r26 [orig:349+4 ] [349]))
"/home/dave/gnu/gcc/gcc/gcc/testsu
ite/g++.dg/torture/pr37922.C":239:16 42 {*pa.md:2195}
     (expr_list:REG_EQUAL (mult:SI (reg/v:SI 68 %fr22 [orig:246 _449 ] [246])
            (reg:SI 74 %fr25 [orig:259 prephitmp_473 ] [259]))
        (nil)))
(insn 290 284 288 78 (set (reg:SI 26 %r26)
        (reg:SI 7 %r7 [orig:104 _14 ] [104]))
"/home/dave/gnu/gcc/gcc/gcc/testsu
ite/g++.dg/torture/pr37922.C":356:17 discrim 4 42 {*pa.md:2195}
     (nil))
(insn 288 290 292 78 (set (reg:SI 8 %r8 [orig:351 _144 ] [351])
        (reg:SI 6 %r6 [orig:416+4 ] [416]))
"/home/dave/gnu/gcc/gcc/gcc/testsuit
e/g++.dg/torture/pr37922.C":239:16 42 {*pa.md:2195}
     (nil))
(insn 292 288 294 78 (parallel [
            (set (reg:SI 29 %r29)
                (div:SI (reg:SI 26 %r26)
                    (reg:SI 25 %r25)))
            (clobber (reg:SI 1 %r1 [354]))
            (clobber (reg:SI 11 %r11 [355]))
            (clobber (reg:SI 26 %r26))
            (clobber (reg:SI 25 %r25))
            (clobber (reg:SI 31 %r31))
        ])
"/home/dave/gnu/gcc/gcc/gcc/testsuite/g++.dg/torture/pr37922.C":356:17 discrim
4 130 {*pa.md:5745}
     (expr_list:REG_EQUAL (div:SI (reg:SI 7 %r7 [orig:104 _14 ] [104])
            (reg:SI 25 %r25))
        (nil)))

As a result r25 is zero and we get a divide by zero exception.

Reply via email to