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.