This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: ICE on IA-64 when compiling SPEC 2000 176.gcc at -O1
- From: Reva Cuthbertson <reva at cup dot hp dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Thu, 06 Dec 2001 12:53:34 -0800
- Subject: Re: ICE on IA-64 when compiling SPEC 2000 176.gcc at -O1
- Organization: Hewlett-Packard Co.
- References: <200112060107.RAA16690@moshpit.cup.hp.com> <20011205231530.A9114@redhat.com>
Richard Henderson wrote:
> On Wed, Dec 05, 2001 at 05:07:50PM -0800, Reva Cuthbertson wrote:
> > ... and it happens because the born_index > death_index test fails so
> > we call abort().
>
> This is normally due to register life info being incorrect.
>
> That is, on input to local_alloc some register was reported
> to be set once and never die (certainly possible), yet the
> register does in fact die.
>
> Can't debug this further without a test case.
>
> r~
Richard,
The problem can be seen when compiling the function
output_signed_leb128() in dwarfout.c in the gcc sources.
The function itself has been commented out on the main
branch so the problem does not happen if you compile
dwarfout.c with -O1. However, the function output_signed_leb128()
is part of 176.gcc in SPEC 2000. For convenience, I cut down
output_signed_leb128() into the following test case. Compile
this with -O1 using gcc 3.1 for IA-64 and the internal compiler
error should occur.
static void
output_signed_leb128 (value)
long value;
{
int more;
do
{
unsigned byte = (value & 0x7f);
value >>= 7;
if (((value == 0) && ((byte & 0x40) == 0))
|| ((value == -1) && ((byte & 0x40) == 1)))
more = 0;
}
while (more);
}
Thanks!
Reva