Re: HEADS UP: plan to switch many ports over to GCC 12 soon

Rin Okuyama <[email protected]> Tue, 2 Jul 2024 12:24:44 +0900
Newsgroups gmane.os.netbsd.current,gmane.os.netbsd.ports.sh3,gmane.os.netbsd.devel.toolchain
Message-ID <[email protected]>
Hi uwe@, thanks for hints!!

On 2024/07/01 14:38, Valery Ushakov wrote:
> [trimmed the cc list down]
> 
> On Mon, Jul 01, 2024 at 09:59:54 +0900, Rin Okuyama wrote:
> 
>> With in-tree GCC 12.4, kernel crashes just same as 12.3 :(
>>
>> Even a single character is output to console. I tried to
>> drop some features from kernel config to reduce size
>> significantly, but it does not help. On the other hand,
>> same kernel works just fine if compiled by GCC 10.5.
> 
> Are binutils the same?  I'd first rule out section alignment/layout
> issues (cf. netwinder changes to make netbsd-10 work again).

Yes, 2.39 for both. No significant difference for `readelf -a netbsd`.

> I'd compile the kernel with gcc 10, then remove (stow away, really)
> half the object files and compile with gcc 12.  If the result works,
> repeat with the half of the remaining half.  If it doesn't - restore
> the gcc10 objects and bisect them.  I had to this couple of times on
> previous gcc uprqades.

I tried this way, then bisectioning did not work at all! I needed to
restore almost all files to ones compiled by GCC10.

I've found that GCC12 even miscompiles this one for -O1 and higher!

----
short
func(int i)
{

         switch (i) {
         case 0:
                 return 0xdead;
         case 1:
                 return 0xbeaf;
         default:
                 return 1;
         }
}
----
00000000 <func>:
    0:   04 8b           bf      c <func+0xc>
    2:   43 60           mov     r4,r0
    4:   01 88           cmp/eq  #1,r0
    6:   04 89           bt      12 <func+0x12>
    8:   0b 00           rts
    a:   01 e0           mov     #1,r0
    c:   04 90           mov.w   18 <func+0x18>,r0       ! dead
    e:   0b 00           rts
   10:   09 00           nop
   12:   02 90           mov.w   1a <func+0x1a>,r0       ! beaf
   14:   0b 00           rts
   16:   09 00           nop
   18:   ad de           mov.l   2d0 <func+0x2d0>,r14
   1a:   af be           bsr     fffffd7c <func+0xfffffd7c>
----

Apparently, `tst r4,r4` is optimized out by mistake :(

This seems to be hacked around by this patch:

----
--- a/external/gpl3/gcc/dist/gcc/config/sh/sh_treg_combine.cc
+++ b/external/gpl3/gcc/dist/gcc/config/sh/sh_treg_combine.cc
@@ -1528,7 +1528,11 @@ sh_treg_combine::try_optimize_cbranch (rtx_insn 
*insn)
  bool
  sh_treg_combine::gate (function *)
  {
+#if 0
    return optimize > 0;
+#else
+  return false;
+#endif
  }

  unsigned int
----

With this hack, system boots into multiuser with DIAGNOSTIC, and now
it is running full ATF overnight without panic until now.

What I still haven't understood is why this causes the critical
problem for us with GCC 12.4. There are no significant changes b/w
10.5 and 12.4 (and 14.1) for gcc/config/sh. Also, it seems to
work for other Dreamcast community.

(There are one commit b/w 10.5 and 12.4 for sh_treg_combine.cc,
but reverting it does not change the situation.)

Anyway, I will commit the hack and report to upstream, if there's
no regression for ATF.

> Sorry, I sitll haven't moved back most of my small machines from my
> self-isolation lair, so my landisk is currently not here to test.

Never mind! Looking forward to your comeback to sh3 world :)

Thanks,
rin

> -uwe
>