https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70559
Bug ID: 70559
Summary: Miscompilation of nsTextFormatter.cpp from Firefox
with -Os -fomit-frame-pointer
Product: gcc
Version: 4.9.3
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ipa
Assignee: unassigned at gcc dot gnu.org
Reporter: mh+gcc at glandium dot org
Target Milestone: ---
We've recently switched to GCC 4.8 to build Firefox (yeah, I know...), and
valgrind detected an error that we subsequently identified as what looks like a
GCC codegen/ipa bug. I was able to reproduce with GCC 4.9.3 from Debian
(4.9.3-12) on x86-64. It doesn't reproduce with GCC 5, however.
Command line to reproduce:
$ g++ -std=gnu++11 -g -Os -fomit-frame-pointer -fno-exceptions
nsTextFormatter.ii -S -o nsTextFormatter.s
Look at the resulting assembly, and look at what corresponds to
nsTextFormatter.cpp:857 (search for ".loc 1 857). It looks like the following:
.loc 1 857 0
movl 0(%rbp), %eax
leaq 2(%rbp), %r12
.LVL184:
testw %ax, %ax
je .L526
The corresponding C++ is:
while ((c = *aFmt++) != 0) {
where c is a char16_t and aFmt a const char16_t*.
Note how it's using movl to read *aFmt, instead of movw. Which means it can
read 2 bytes past the end of aFmt (and it does, that's what valgrind complains
about, and it does so while reading at a 2-aligned address, so it's not about
the read being considered safe because always 4-aligned, although it might be a
misevaluation of that).
Building with -fno-omit-frame-pointer, the assembly looks like:
.loc 1 857 0
movw (%r12), %ax
leaq 2(%r12), %r13
.LVL183:
testw %ax, %ax
je .L525