Dear All,
We are porting the gcc 4.8.1 for our private target .
The compiler pops up with below error .

error: unrecognizable insn:

(insn 22 21 32 6 (set (reg:HI 30 [ D.1532 ])
        (plus:HI (symbol_ref:HI ("stringArray")  <var_decl 0xb751a228
stringArray>)
            (const_int -1 [0xffffffff]))) -1
     (nil))
altcon_014.c:130:1: internal compiler error: in extract_insn, at recog.c:2150
0x836b497 _fatal_insn(char const*, rtx_def const*, char const*, int,
char const*)
        ../../../src/gcc-4.8.1/gcc/rtl-error.c:109
0x836b4e1 _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
        ../../../src/gcc-4.8.1/gcc/rtl-error.c:117
0x8345974 extract_insn(rtx_def*)
        ../../../src/gcc-4.8.1/gcc/recog.c:2150
0x825072e instantiate_virtual_regs_in_insn
        ../../../src/gcc-4.8.1/gcc/function.c:1561
0x825072e instantiate_virtual_regs
        ../../../src/gcc-4.8.1/gcc/function.c:1928

The below is the movhi template defined  in the md file  for  a
HImode operation

define_insn "*movhi"
  [(set (match_operand:HI 0 "general_mov_lhs_operand" "=r,=r,=r,=r,R,A,=b,=r")
        (match_operand:HI 1 "general_mov_operand" "r,R ,A ,I ,r,r,S,S"))]

and respective  predicates are defined  as

(define_predicate "general_mov_lhs_operand"
  (match_code "mem,reg,subreg,const")
{
  /* Any (MEM LABEL_REF) is OK.  That is a pc-relative load.  */
  if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == LABEL_REF)
    return 1;
  /* (MEM SYMBOL_REF) */
  else if(GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == SYMBOL_REF)
        return 1;
  else if(GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == CONST_INT)
        return 1;
  return nonimmediate_operand(op,mode);
})

(define_predicate "general_mov_operand"
  (match_code 
"mem,reg,subreg,symbol_ref,label_ref,const,plus,const_int,const_double")
{
  /* Any (MEM LABEL_REF) is OK.  That is a pc-relative load.  */
  if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == LABEL_REF)
    return 1;
  else if(GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == CONST_INT)
        return 1;
  /* (MEM SYMBOL_REF) */
  else if(GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == SYMBOL_REF)
        return 1;
  return general_operand (op, mode);
})

If we modified the general_mov_operand predicate as

(define_predicate "general_mov_operand"
  (match_code 
"mem,reg,subreg,symbol_ref,label_ref,const,plus,const_int,const_double")
{
  /* Any (MEM LABEL_REF) is OK.  That is a pc-relative load.  */
  if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == LABEL_REF)
    return 1;
  else if(GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == CONST_INT)
        return 1;
  /* (MEM SYMBOL_REF) */
  else if(GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == SYMBOL_REF)
        return 1;
  else if(GET_CODE (op) == PLUS  && GET_CODE (XEXP (op, 0)) == SYMBOL_REF)
        return 1;

  return general_operand (op, mode);
})


The compilation goes smooth ,but I’m not sure why  the general_operand
couldn’t match the error insn.

Any pointer will be appreciate and did our changes to the  predicate
file make  any sense ?

Thank you in advance
~Umesh

Reply via email to