This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/32552] Runtime failure in SPEC CPU2000 benchmark fma3d and applu
- From: "spark at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 29 Jun 2007 21:41:18 -0000
- Subject: [Bug target/32552] Runtime failure in SPEC CPU2000 benchmark fma3d and applu
- References: <bug-32552-13468@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #1 from spark at gcc dot gnu dot org 2007-06-29 21:41 -------
Below is the email I sent to Jim Wilson asking for help
with the analysis of the bug.
--------
Hi Jim,
This is an analysis of a correctness bug on ia64,
which root cause has to do with your code.
After dataflow merge, Richard Guenther reported
two runtime failures in SPEC CPU2000 programs on ia64.
It turned out to be related to the following code you wrote
(or at least committed, according to svn). From ia64.h:
928 /* A C expression whose value is RTL representing the location
of the incoming
929 return address at the beginning of any function, before the
prologue. This
930 RTL is either a `REG', indicating that the return value is
saved in `REG',
931 or a `MEM' representing a location in the stack. This enables DWARF2
932 unwind info for C++ EH. */
933 #define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (VOIDmode, BR_REG (0))
934
935 /* ??? This is not defined because of three problems.
936 1) dwarf2out.c assumes that DWARF_FRAME_RETURN_COLUMN fits
in one byte.
937 The default value is FIRST_PSEUDO_REGISTER which doesn't.
This can be
938 worked around by setting PC_REGNUM to FR_REG (0) which is
an otherwise
939 unused register number.
940 2) dwarf2out_frame_debug core dumps while processing
prologue insns. We
941 need to refine which insns have RTX_FRAME_RELATED_P set and
which don't.
942 3) It isn't possible to turn off EH frame info by defining
DWARF2_UNIND_INFO
943 to zero, despite what the documentation implies, because it
is tested in
944 a few places with #ifdef instead of #if. */
945 #undef INCOMING_RETURN_ADDR_RTX
Here, because INCOMING_RETURN_ADDR_RTX is ultimately undef'ed,
dataflow doesn't see any definition of the return address register,
and happily treats b0 as not live throughout the function body.
Then, global allocator, guided by this information, allocates
b0 for something else - leading to the return address corruption.
Removing the undef leads to an ICE in dwarf2out.c (probably due to 2
in your comment ?).
Certainly from the new dataflow point of view,
we need this macro to be defined,
because, otherwise, the use of b0 in the return is considered a use without
def.
Previously, flow() didn't consider uninitialized registers
and just having a use of b0 in the return was sufficient,
as it made b0 live across the entire function
thanks to flow's backward only live analysis.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32552