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