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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.