https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116244
Jeffrey A. Law <law at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed| |2024-08-06 --- Comment #1 from Jeffrey A. Law <law at gcc dot gnu.org> --- A lot of similarities to the most recent bug on the m68k. We had this prior to ext-dce (from a somewhat reduced testcase, so insn #s won't match): (insn 878 877 881 19 (set (reg:DI 35 [ diff$__r ]) (zero_extend:DI (reg:SI 49 [ _32 ]))) "/notnfs/josmyers/glibc-manual/build/compilers/m68k-linux-gnu-coldfire/gcc/m68k-glibc-linux-gnu/libstdc++-v3/include/bits/chrono.h":574:10 85 {*zero_extendsidi2} (expr_list:REG_DEAD (reg:SI 49 [ _32 ]) (nil))) We know the upper bits aren't needed, so we turn the zero_extend into a subreg: (insn 878 877 881 19 (set (reg:DI 35 [ diff$__r ]) (subreg:DI (reg:SI 49 [ _32 ]) 0)) "/notnfs/josmyers/glibc-manual/build/compilers/m68k-linux-gnu-coldfire/gcc/m68k-glibc-linux-gnu/libstdc++-v3/include/bits/chrono.h":574:10 76 {*m68k.md:1608} (expr_list:REG_DEAD (reg:SI 49 [ _32 ]) (nil))) So far, so good. We assign (reg:SI 49) to d0 resulting in this in the middle of reload: (insn 878 877 1042 19 (set (reg:DI 0 %d0 [orig:35 diff$__r ] [35]) (subreg:DI (reg:SI 0 %d0) 0)) "/notnfs/josmyers/glibc-manual/build/compilers/m68k-linux-gnu-coldfire/gcc/m68k-glibc-linux-gnu/libstdc++-v3/include/bits/chrono.h":574:10 76 {*m68k.md:1608} (expr_list:REG_DEAD (reg:SI 0 %d0 [orig:49 _32 ] [49]) (nil))) We eventually try to simplify the subreg resulting in: (insn 878 877 1042 19 (set (reg:DI 0 %d0 [orig:35 diff$__r ] [35]) (reg:DI -1 [+-4 ])) "/notnfs/josmyers/glibc-manual/build/compilers/m68k-linux-gnu-coldfire/gcc/m68k-glibc-linux-gnu/libstdc++-v3/include/bits/chrono.h":574:10 76 {*m68k.md:1608} (nil)) Which is clearly very bad.