This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: Bug building target libiberty for mips64vrel-elf toolchain
- From: Richard Sandiford <richard at codesourcery dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: echristo at apple dot com, gcc-bugs at gcc dot gnu dot org
- Date: Thu, 29 Mar 2007 08:05:41 +0100
- Subject: Re: Bug building target libiberty for mips64vrel-elf toolchain
- References: <m3ps6s35jf.fsf@redhat.com>
> Hi Eric, Hi Richard,
>
> We recently ran across an ICE building a target libiberty for one of
> the multilibs of the mips64vrel-elf toolchain:
>
> .../libiberty/regex.c: In function 'byte_re_match_2_internal':
> .../libiberty/regex.c:7481: error: insn does not satisfy its constraints:
> (insn 5211 1697 1699 173 .../libiberty/regex.c:6589
> (set (reg:SI 5 $5)
> (lo_sum:SI (reg/f:SI 1104)
> (symbol_ref:SI ("byte_reg_unset_dummy") [flags 0x6] <var_decl 0x2a9860bc60 byte_reg_unset_dummy>))) 204 {*lowsi_mips16} (nil)
> (expr_list:REG_EQUAL (symbol_ref:SI ("byte_reg_unset_dummy") [flags 0x6] <var_decl 0x2a9860bc60 byte_reg_unset_dummy>)
> (nil)))
> .../libiberty/regex.c:7481: internal compiler error: in reload_cse_simplify_operands, at postreload.c:393
> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <URL:http://gcc.gnu.org/bugs.html> for instructions.
> make[3]: *** [regex.o] Error 1
> make[3]: Leaving directory `.../mips64vrel-elf/mips64vrel-elf/mips16/libiberty'
>
>
> This problem does not appear to affect other mips toolchains, but
> that may just be a multilib issue. I found a simple workaround for
> the problem:
>
> Index: gcc/config/mips/mips.c
> ===================================================================
> --- gcc/config/mips/mips.c (revision 123322)
> +++ gcc/config/mips/mips.c (working copy)
> @@ -2269,8 +2269,11 @@ mips_legitimize_const_move (enum machine
> /* Split moves of symbolic constants into high/low pairs. */
> if (splittable_symbolic_operand (src, mode))
> {
> - emit_insn (gen_rtx_SET (VOIDmode, dest, mips_split_symbol (dest, src)));
> - return;
> + if (! TARGET_MIPS16)
> + {
> + emit_insn (gen_rtx_SET (VOIDmode, dest, mips_split_symbol (dest, src)));
> + return;
> + }
> }
>
> if (mips_tls_operand_p (src))
>
>
> But I am pretty sure that this is the wrong solution. Since I am
> not a MIPS expert however I am punting this problem to you guys. :-)
Yeah, I'm afraid it's the wrong solution. ;) It basically disables
small-data load-address operations on MIPS16.
I gather from the insn above that a use of the GP pseudo
register has been introduced during reload. At first blush,
I think the fix is to make mips_split_symbol move
(const (unspec [(const_int 0)] UNSPEC_GP)) into "temp"
when no_new_pseudos. I think the cleanest way to do that
would be to add a new define_expand to generate the move,
and adjust mips16_gp_pseudo_reg accordingly.
I might have time to try a fix this weekend. Please feel free
to file a bug report and assign it to rsandifo@gcc.gnu.org.
Richard