https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115148
--- Comment #5 from Oleg Endo <olegendo at gcc dot gnu.org> ---
(In reply to John Paul Adrian Glaubitz from comment #4)
> Created attachment 58244 [details]
> Preprocessed source from building read-vorbis.c with gcc-14 and -fverbose-asm
>
> (In reply to Oleg Endo from comment #3)
> > Can you please try to compile with -fverbose-asm .... maybe it will give a
> > first hint as to where the problematic code comes from.
>
> Done. See attached pr115148-preprocessed-source-verbose.tgz.
Thanks!
I was able to reproduce it myself rather easily with my limited setup.
The issue seems to be with the function 'barrier_align' in sh.cc which
determines the alignment following the data table that is emitted in the code.
The following hunk seems to fix the ".align 1" following the short byte table
diff --git a/gcc/config/sh/sh.cc b/gcc/config/sh/sh.cc
index ef3c2e6791d..01349328171 100644
--- a/gcc/config/sh/sh.cc
+++ b/gcc/config/sh/sh.cc
@@ -5755,7 +5755,7 @@ barrier_align (rtx_insn *barrier_or_label)
return ((optimize_size
|| ((unsigned) XVECLEN (pat, 1) * GET_MODE_SIZE (GET_MODE (pat))
<= (unsigned) 1 << (CACHE_LOG - 2)))
- ? 1 : align_jumps.levels[0].log);
+ ? 2 : align_jumps.levels[0].log);
}
rtx_insn *next = next_active_insn (barrier_or_label);
However, I haven't checked for any advert side effects.
The line was modified last time in commit
e1fab8ba2337fd3bdd9c7112fae22d7ab001c2eb by myself, as part of the SH5 removal.
- ? 1 << TARGET_SHMEDIA : align_jumps_log);
+ ? 1 : align_jumps_log)
Before that, TARGET_SHMEDIA used to be defined as follows in sh.h:
#define TARGET_SHMEDIA (TARGET_SH5 && ! TARGET_SH1)
So for anything non-SH5 it should have evaluated to "0", which would produce "1
<< 0" which is "1" for the problematic line above.
Maybe it's just a latent bug that got exposed by some other SH independent
basic block rearrangement optimizations.
Can you please attach the .s file when compiled with GCC 11, just for
comparison/reference.