internal compiler error: in df_reg_chain_mark

Andreas Geißler setjem@googlemail.com
Mon Jul 9 12:31:00 GMT 2012


Hi,
i have a problem again. When i am trying to compile the libgcc, with
my own define_insn "movmem" ,i get this error:

make log:

/u/Bachelorarbeit/gcc/gcc/build/./gcc/xgcc
-B/u/Bachelorarbeit/gcc/gcc/build/./gcc/
-B/u/Bachelorarbeit/GCC/gcc/menmic/bin/
-B/u/Bachelorarbeit/GCC/gcc/menmic/lib/ -isystem
/u/Bachelorarbeit/GCC/gcc/menmic/include -isystem
/u/Bachelorarbeit/GCC/gcc/menmic/sys-include    -g -O2 -O2  -g -O2
-DIN_GCC -DCROSS_DIRECTORY_STRUCTURE  -W -Wall -Wwrite-strings
-Wcast-qual -Wstrict-prototypes -Wmissing-prototypes
-Wold-style-definition  -isystem ./include   -g  -DIN_LIBGCC2
-D__GCC_FLOAT_NOT_NEEDED -fno-stack-protector -Dinhibit_libc  -I. -I.
-I../.././gcc -I../../../gcc-4.6.2/libgcc
-I../../../gcc-4.6.2/libgcc/. -I../../../gcc-4.6.2/libgcc/../gcc
-I../../../gcc-4.6.2/libgcc/../include  -DHAVE_CC_TLS -DUSE_EMUTLS -o
unwind-dw2-fde.o -MT unwind-dw2-fde.o -MD -MP -MF unwind-dw2-fde.dep
-fexceptions -c ../../../gcc-4.6.2/libgcc/../gcc/unwind-dw2-fde.c
emit_block_move_via_movmem
../../../gcc-4.6.2/libgcc/../gcc/unwind-dw2-fde.c: In function 'search_object':
../../../gcc-4.6.2/libgcc/../gcc/unwind-dw2-fde.c:992:1: internal
compiler error: in df_reg_chain_mark, at df-scan.c:4231
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [unwind-dw2-fde.o] Error 1
make[2]: Leaving directory `/u/Bachelorarbeit/gcc/gcc/build/menmic/libgcc'
make[1]: *** [all-target-libgcc] Error 2
make[1]: Leaving directory `/u/Bachelorarbeit/gcc/gcc/build'
make: *** [all] Error 2


df-scan.c:

      ...
      /* If there are no def-use or use-def chains, make sure that all
	 of the chains are clear.  */
      if (!df_chain)
	gcc_assert (!DF_REF_CHAIN (ref));

      /* Check to make sure the ref is in the correct chain.  */
      gcc_assert (DF_REF_REGNO (ref) == regno);
      if (is_def)
	gcc_assert (DF_REF_REG_DEF_P (ref));
      else
	gcc_assert (!DF_REF_REG_DEF_P (ref));

      if (is_eq_use)
	gcc_assert ((DF_REF_FLAGS (ref) & DF_REF_IN_NOTE));
      else
	gcc_assert ((DF_REF_FLAGS (ref) & DF_REF_IN_NOTE) == 0);
<----------------- Error --------------------

      if (DF_REF_NEXT_REG (ref))
	gcc_assert (DF_REF_PREV_REG (DF_REF_NEXT_REG (ref)) == ref);
     ...


The problem is solved if i remove the emit_insn(gen_ldri(tmp_reg)); in
the movmem instruction, so i think it has to do with my define_insn
"ldri":


.md:

(define_insn "ldri"
   [(set (match_operand:SI 0 "pseudo_register_operand" "")
         (mem:SI (post_modify:SI (reg:SI REG_RAR)
                          (plus  (reg:SI REG_RAR)
                                 (const_int 4) ))))]
   ""
   "ldri\t%0"
   [(set_attr "length" "1")]
)

;; True for register that is pseudo register.
(define_predicate "pseudo_register_operand"
  (and (match_code "reg")
       (match_test "!HARD_REGISTER_P (op)")))


But i don't see any mistake here. And if i use the memcpy function in
normal c programm with the same type of operants, i get no errors and
it work perfectly.
I would be very grateful if someone could help me.

Best regards,
Andreas



More information about the Gcc-help mailing list