[Bug target/67226] New: Incorrect code generated for tail call, where parameters are structs passed by value, -O2 is used, and target is ARM
jack.d.whitham at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Aug 15 11:31:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67226
Bug ID: 67226
Summary: Incorrect code generated for tail call, where
parameters are structs passed by value, -O2 is used,
and target is ARM
Product: gcc
Version: 5.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: jack.d.whitham at gmail dot com
Target Milestone: ---
Created attachment 36188
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36188&action=edit
Test case to reproduce bug, run "show_bug.sh" on ARMv7 system with GCC 5.2.1
I compiled this code with "gcc (Debian 5.2.1-15) 5.2.1 20150808" on an ARMv7
target (RPi2).
typedef struct assembly_operand_t
{ int type, value, symtype, symflags, marker;
} assembly_operand;
void t2(assembly_operand to, assembly_operand from)
{ if (to.value == from.value) return;
if (to.value == 0) assemblez_1(32, from);
else assemblez_store(to, from);
}
My code calls the function t2 with to.value == 0. If I compile t2 with -O0 or
-O1, assemblez_1 is called as expected with the correct arguments. If I compile
t2 with -O2, the "from" structure is copied incorrectly. The "type" field has
the incorrect value.
I have seen this bug on GCC 4.6.x and 4.7.x as well as 5.2.1 and it seems to
behave the same regardless of whether the target ISA is 32-bit ARM or Thumb.
However it does not occur on x86/x86_64. For ARM targets, it appears that -O2
causes the call to assemblez_1 to be generated as a tail call whereas it is an
ordinary call with -O1/-O0.
In the attached test case the same code is compiled with both -O0 and -O2. Both
copies are then executed. The test case shows that the "from.type" field is
corrupted in the -O2 case. See the "show_bug.sh" script for the command-line
options used.
More information:
This GCC is from https://packages.debian.org/sid/gcc.
# gcc --version
gcc (Debian 5.2.1-15) 5.2.1 20150808
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
More information about the Gcc-bugs
mailing list