Help with reloading
Mohamed Shafi
shafitvm@gmail.com
Wed Dec 15 14:58:00 GMT 2010
Hi,
I am doing a port in GCC 4.5.1.
The target supports storing immediate values into memory location
represented by a symbolic address. So in the move pattern i have given
constraints to represent this.
(define_insn "movqi_op"
[(set (match_operand:QI 0 "nonimmediate_operand" "=!Q,!Q,d,d,d,d,d,d,d,Q,R,S")
(match_operand:QI 1 "general_operand" "I,J,i,W,J,d,Q,R,S,d,d,d"))]
""
"@
st.s32\t%0, %1;
st.u32\t%0, %1;
set\t%0, %1;
set.u32\t%0, %1;
set.u32\t%0, %1;
move\t%0, %1;
ld%u0\t%0, %1;
ld%u0\t%0, %1;
ld%u0\t%0, %1;
st%u0\t%0, %1;
st%u0\t%0, %1;
st%u0\t%0, %1;"
)
where
Q represents symbolic address,
R represents all address formed using SP
S represents all address formed using address registers
I, J,W,i represents various const_ints
d represents general registers.
Whenever reload get a pattern to store const_int to a memory that is
scheduled for reloading, the reload pass will match it with Q
constraints. So to avoid those i added the constrain modifier '!' to
'Q'. But even then there is one particular case that causes trouble.
This happens when reload pass gets a pattern where the destination is
an illegal address and source is a pesudo register (no register
allocated) for which reg_equiv_constant[regno] != 0.
Before IRA pass:
(insn 27 25 33 4 pr23848-3.c:12 (set (mem/s/j:QI (reg/f:PQI 69) [0 S1 A32])
(reg:QI 93)) 7 {movqi_op} (expr_list:REG_DEAD (reg/f:PQI 69)
(expr_list:REG_EQUAL (const_int 49 [0x31])
(nil))))
Just before reloading phase:
(insn 27 25 33 4 pr23848-3.c:12 (set (mem/s/j:QI (reg/f:PQI 12 as0
[69]) [0 S1 A32])
(reg:QI 93)) 7 {movqi_op} (expr_list:REG_DEAD (reg/f:PQI 12 as0 [69])
(expr_list:REG_EQUAL (const_int 0 [0x0])
(nil))))
Since reg93 is not allocated with any register, its replaced with
reg_equiv_constant[regno], and this combination wins the (Q, I)
constraint pair and in that process 'losers' (variable in loop over
alternatives) becomes 0 and hence breaks out and returns. Due to this
compiler crashes with "insn does not satisfy its constraints:" error.
Any pointers in fixing this?
Regards,
Shafi
P.S. When can we merge constraints? What are the criteria to decide
which all constraints to merge
More information about the Gcc
mailing list