Hello, > On Wednesday 08 June 2005 12:01, Nick Burrett wrote: > > $ ./cc1 -quiet test.c -mthumb -O2 > > ../../bug.c: In function ?foo?: > > ../../bug.c:3: internal compiler error: in create_mem_ref, at > > tree-ssa-address.c:585 > > Please submit a full bug report, > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ;-) > > > And some more information in the mean time: > > Starting program: /home/steven/devel/build-test/gcc/cc1 -mthumb t.c -O > foo > > Breakpoint 1, fancy_abort (file=0xa19258 > "../../mainline/gcc/tree-ssa-address.c", line=585, > function=0xa192d3 "create_mem_ref") at diagnostic.c:588 > 588 internal_error ("in %s, at %s:%d", function, trim_filename (file), > line); > (gdb) up > #1 0x00000000005930da in create_mem_ref (bsi=0x7fbfffd370, > type=0x2a95896750, addr=0x7fbfffd390) > at tree-ssa-address.c:585 > 585 gcc_unreachable (); > (gdb) p debug_generic_stmt(bsi.tsi.ptr.stmt) > # VUSE <TMT.0D.1208_18>; > c1D.1197_10 = *s1D.1192_27; > > $12 = void > (gdb) p parts > $13 = {symbol = 0x0, base = 0x0, index = 0x2a95981380, step = 0x0, offset = > 0x0}
a patch, I will submit it once passes regtesting (only the tree-ssa-address.c:addr_for_mem_ref part is important, but I have rather changed also the tree-ssa-loop-ivopts.c parts that could cause similar problems). Zdenek Index: tree-ssa-address.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-ssa-address.c,v retrieving revision 2.1 diff -c -3 -p -r2.1 tree-ssa-address.c *** tree-ssa-address.c 7 Jun 2005 12:01:28 -0000 2.1 --- tree-ssa-address.c 8 Jun 2005 14:34:35 -0000 *************** addr_for_mem_ref (struct mem_address *ad *** 198,205 **** templates_initialized = true; sym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup ("test_symbol")); ! bse = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER); ! idx = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER + 1); for (i = 0; i < 32; i++) gen_addr_rtx ((i & 16 ? sym : NULL_RTX), --- 198,205 ---- templates_initialized = true; sym = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup ("test_symbol")); ! bse = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1); ! idx = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 2); for (i = 0; i < 32; i++) gen_addr_rtx ((i & 16 ? sym : NULL_RTX), Index: tree-ssa-loop-ivopts.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/tree-ssa-loop-ivopts.c,v retrieving revision 2.78 diff -c -3 -p -r2.78 tree-ssa-loop-ivopts.c *** tree-ssa-loop-ivopts.c 7 Jun 2005 22:44:56 -0000 2.78 --- tree-ssa-loop-ivopts.c 8 Jun 2005 14:34:35 -0000 *************** add_cost (enum machine_mode mode) *** 3149,3156 **** start_sequence (); force_operand (gen_rtx_fmt_ee (PLUS, mode, ! gen_raw_REG (mode, FIRST_PSEUDO_REGISTER), ! gen_raw_REG (mode, FIRST_PSEUDO_REGISTER + 1)), NULL_RTX); seq = get_insns (); end_sequence (); --- 3149,3156 ---- start_sequence (); force_operand (gen_rtx_fmt_ee (PLUS, mode, ! gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1), ! gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 2)), NULL_RTX); seq = get_insns (); end_sequence (); *************** multiply_by_cost (HOST_WIDE_INT cst, enu *** 3221,3228 **** (*cached)->cst = cst; start_sequence (); ! expand_mult (mode, gen_raw_REG (mode, FIRST_PSEUDO_REGISTER), GEN_INT (cst), ! NULL_RTX, 0); seq = get_insns (); end_sequence (); --- 3221,3228 ---- (*cached)->cst = cst; start_sequence (); ! expand_mult (mode, gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1), ! gen_int_mode (cst, mode), NULL_RTX, 0); seq = get_insns (); end_sequence (); *************** multiplier_allowed_in_address_p (HOST_WI *** 3247,3253 **** if (!valid_mult) { ! rtx reg1 = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER); rtx addr; HOST_WIDE_INT i; --- 3247,3253 ---- if (!valid_mult) { ! rtx reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1); rtx addr; HOST_WIDE_INT i; *************** get_address_cost (bool symbol_present, b *** 3305,3316 **** HOST_WIDE_INT i; initialized = true; ! reg1 = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER); addr = gen_rtx_fmt_ee (PLUS, Pmode, reg1, NULL_RTX); for (i = 1; i <= 1 << 20; i <<= 1) { ! XEXP (addr, 1) = GEN_INT (i); if (!memory_address_p (Pmode, addr)) break; } --- 3305,3316 ---- HOST_WIDE_INT i; initialized = true; ! reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1); addr = gen_rtx_fmt_ee (PLUS, Pmode, reg1, NULL_RTX); for (i = 1; i <= 1 << 20; i <<= 1) { ! XEXP (addr, 1) = gen_int_mode (i, Pmode); if (!memory_address_p (Pmode, addr)) break; } *************** get_address_cost (bool symbol_present, b *** 3319,3325 **** for (i = 1; i <= 1 << 20; i <<= 1) { ! XEXP (addr, 1) = GEN_INT (-i); if (!memory_address_p (Pmode, addr)) break; } --- 3319,3325 ---- for (i = 1; i <= 1 << 20; i <<= 1) { ! XEXP (addr, 1) = gen_int_mode (-i, Pmode); if (!memory_address_p (Pmode, addr)) break; } *************** get_address_cost (bool symbol_present, b *** 3368,3377 **** { acost = 0; ! addr = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER); ! reg1 = gen_raw_REG (Pmode, FIRST_PSEUDO_REGISTER + 1); if (ratio_p) ! addr = gen_rtx_fmt_ee (MULT, Pmode, addr, GEN_INT (rat)); if (var_present) addr = gen_rtx_fmt_ee (PLUS, Pmode, addr, reg1); --- 3368,3377 ---- { acost = 0; ! addr = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1); ! reg1 = gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 2); if (ratio_p) ! addr = gen_rtx_fmt_ee (MULT, Pmode, addr, gen_int_mode (rat, Pmode)); if (var_present) addr = gen_rtx_fmt_ee (PLUS, Pmode, addr, reg1); *************** get_address_cost (bool symbol_present, b *** 3383,3392 **** base = gen_rtx_fmt_e (CONST, Pmode, gen_rtx_fmt_ee (PLUS, Pmode, base, ! GEN_INT (off))); } else if (offset_p) ! base = GEN_INT (off); else base = NULL_RTX; --- 3383,3392 ---- base = gen_rtx_fmt_e (CONST, Pmode, gen_rtx_fmt_ee (PLUS, Pmode, base, ! gen_int_mode (off, Pmode))); } else if (offset_p) ! base = gen_int_mode (off, Pmode); else base = NULL_RTX;