c++/7944: gcc 3.2: Internal compiler error in
Pop Sébastian
pop@gauvain.u-strasbg.fr
Mon Sep 30 14:04:00 GMT 2002
On Mon, Sep 30, 2002 at 12:45:57PM +0200, Reichelt wrote:
> Hi again,
>
> I just forgot to mention that the bug is probably target-specific:
> I can reproduce it with i686-pc-linux-gnu, but not with
> mips-sgi-irix6.5.
>
Yep, this depends on the number of available registers.
Here is the backtrace:
(gdb) bt
#0 spill_failure (insn=0x4024b0dc, class=GENERAL_REGS) at ../../gcc/gcc/reload1.c:1909
#1 0x082b0e7a in find_reload_regs (chain=0x8545dc8) at ../../gcc/gcc/reload1.c:1846
#2 0x082b0f09 in select_reload_regs () at ../../gcc/gcc/reload1.c:1866
#3 0x082af249 in reload (first=0x401afef4, global=1) at ../../gcc/gcc/reload1.c:1038
#4 0x0834b67e in global_alloc (file=0x0) at ../../gcc/gcc/global.c:578
#5 0x082dc09c in rest_of_compilation (decl=0x40235e00) at ../../gcc/gcc/toplev.c:3284
#6 0x080fe88d in genrtl_finish_function (fn=0x40235e00) at ../../gcc/gcc/cp/semantics.c:2642
#7 0x080fe371 in expand_body (fn=0x40235e00) at ../../gcc/gcc/cp/semantics.c:2465
#8 0x080c8e7b in yyparse () at parse.y:816
#9 0x081264bd in c_common_parse_file (set_yydebug=0) at ../../gcc/gcc/c-lex.c:159
#10 0x082da206 in compile_file () at ../../gcc/gcc/toplev.c:2126
#11 0x082df066 in do_compile () at ../../gcc/gcc/toplev.c:5331
#12 0x082df0bf in toplev_main (argc=3, argv=0xbffffb04) at ../../gcc/gcc/toplev.c:5361
#13 0x0813c3e4 in main (argc=3, argv=0xbffffb04) at ../../gcc/gcc/main.c:35
(gdb)
It fails in the following code :
/* Ignore reloads that got marked inoperative. */
if ((rld[r].out != 0 || rld[r].in != 0 || rld[r].secondary_p)
&& ! rld[r].optional
&& rld[r].regno == -1)
if (! find_reg (chain, i))
{
=> spill_failure (chain->insn, rld[r].class);
failure = 1;
return;
}
}
and down:
/* Handle the failure to find a register to spill.
INSN should be one of the insns which needed this particular spill reg. */
static void
spill_failure (insn, class)
rtx insn;
enum reg_class class;
{
static const char *const reg_class_names[] = REG_CLASS_NAMES;
if (asm_noperands (PATTERN (insn)) >= 0)
error_for_asm (insn, "can't find a register in class `%s' while reloading `asm'",
reg_class_names[class]);
else
{
=> error ("unable to find a register to spill in class `%s'",
reg_class_names[class]);
fatal_insn ("this is the insn:", insn);
}
}
More information about the Gcc-bugs
mailing list