Bug#1130962: m68k: Miscompilation at -O2
Camm Maguire <[email protected]>
| Newsgroups | gmane.linux.debian.devel.gcc |
|---|---|
| Message-ID | <87y0jr53gh.fsf__42913.8201217697$1773667188$gmane$org@glory.maguirefamily.org> |
Package: gcc-15 X-Debbugs-Cc: [email protected] Version: 15.2.0-13 Severity: important Tags: upstream Dear Maintainer, At -O2 gcc miscompiles the following snippet of C code V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); as the gdb transcript below demonstrates. In particular, the starting address of _y, which should be V2048, is offset by 4 bytes. The problem vanishes at -O1. ============================================================================= (gdb) b 17163 Breakpoint 4 at 0x23b04f2: file pcl_gcl/gcl_pcl_dfun.c, line 17163. (gdb) c Continuing. Breakpoint 4, LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun (V2046=0xe44078, V2047=0x1888b10) at pcl_gcl/gcl_pcl_dfun.c:17163 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b04f2 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+514>: moveal %a3@,%a0 (gdb) p/x fcall.valp $35 = 0x0 (gdb) p V2048 $36 = -1073746348 (gdb) p/x V2048 $37 = 0xbfffee54 (gdb) p *(ul *)0xbfffee54@4 $38 = {0, 2027206421, 3221221104, 819826} (gdb) p/x *(ul *)0xbfffee54@4 $39 = {0x0, 0x78d4b715, 0xbfffeef0, 0xc8272} (gdb) p vs_top-vs_base $40 = 3 (gdb) i reg a3 a3 0x79f114 0x79f114 (gdb) p vs_base $41 = (object *) 0x79f114 (gdb) si 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b04f4 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+516>: addql #8,%sp (gdb) i reg sp sp 0xbfffed30 0xbfffed30 (gdb) si 0x023b04f6 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b04f6 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+518>: tstl %a4 (gdb) i reg a4 a4 0xbfffee54 0xbfffee54 (gdb) si 0x023b04f8 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b04f8 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+520>: beqs 0x23b052c <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+572> (gdb) si 0x023b04fa 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b04fa <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+522>: cmpl %d3,%d2 (gdb) i reg d3 d3 0x79f120 7991584 (gdb) i reg d2 d2 0x79f118 7991576 (gdb) p _x $42 = <optimized out> (gdb) p vs_top $43 = (object *) 0x79f120 (gdb) si 0x023b04fc 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b04fc <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+524>: bccw 0x23b08de <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+1518> (gdb) 0x023b0500 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b0500 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+528>: moveal %d2,%a1 (gdb) i reg d2 d2 0x79f118 7991576 (gdb) i reg a1 a1 0x4200000 0x4200000 (gdb) si 0x023b0502 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b0502 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+530>: movel %a4,%d0 (gdb) i reg a4 a4 0xbfffee54 0xbfffee54 (gdb) i reg d0 d0 0x4355d20 70606112 (gdb) si 0x023b0504 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b0504 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+532>: subql #4,%d0 (gdb) i reg d0 d0 0xbfffee54 -1073746348 (gdb) si 0x023b0506 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b0506 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+534>: subl %a3,%d0 (gdb) i reg d0 d0 0xbfffee50 -1073746352 (gdb) i reg a3 a3 0x79f114 0x79f114 (gdb) si 0x023b0508 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b0508 <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+536>: movel %a1@+,%a1@(0,%d0:l) (gdb) i reg d0 d0 0xbf85fd3c -1081737924 (gdb) i reg a1 a1 0x79f118 0x79f118 (gdb) i reg d0 d0 0xbf85fd3c -1081737924 (gdb) p *(ul *)0xbfffee54@4 $44 = {0, 2027206421, 3221221104, 819826} (gdb) p/s *(ul *)0xbfffee54@4 $45 = {0, 2027206421, 3221221104, 819826} (gdb) p/x *(ul *)0xbfffee54@4 $46 = {0x0, 0x78d4b715, 0xbfffeef0, 0xc8272} (gdb) p *(ul *)0x79f118 $47 = 7704728 (gdb) p/x *(ul *)0x79f118 $48 = 0x759098 (gdb) si 0x023b050c 17163 V2083= ({register object _z=vs_base[0];register object *_x=vs_base+1,*_y=(object *)V2048;if (!_y) vs_top=base; else {for(;_x<vs_top;) *_y++=*_x++;if (_x>vs_top) _y--;vs_top=_y;}_z;}); 1: x/i $pc => 0x23b050c <LI148__MAKE_FINAL_ACCESSOR_DFUN__pcl_dfun+540>: cmpal %d3,%a1 (gdb) p/x *(ul *)0xbfffee54@4 $49 = {0x0, 0x759098, 0xbfffeef0, 0xc8272} (gdb) q ============================================================================= -- System Information: Debian Release: forky/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: m68k Kernel: Linux 6.12.48+deb13-amd64 (SMP w/8 CPU threads; PREEMPT) Kernel taint flags: TAINT_WARN Locale: LANG=C, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /usr/bin/dash Init: unable to detect Versions of packages gcc-15 depends on: ii binutils 2.46-2 ii cpp-15 15.2.0-13 ii gcc-15-base 15.2.0-13 ii gcc-15-m68k-linux-gnu 15.2.0-13 Versions of packages gcc-15 recommends: ii libc6-dev 2.42-5 Versions of packages gcc-15 suggests: pn gcc-15-doc <none> pn gcc-15-locales <none> -- no debconf information