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