This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Legitimize address, Please HELP!
Jan,
return is not missing.
Even some improvements to legitimate_address_p
such as:
-------------------
int
legitimate_address_p (mode, operand, strict)
enum machine_mode mode;
rtx operand;
int strict;
{
rtx xfoob, x = operand;
if (GET_CODE (operand) == PLUS
&& ((GET_CODE (XEXP (operand, 0)) == MEM )
||GET_CODE (XEXP (operand, 1)) == MEM )
)
{
fprintf(stderr,"interesting address mode\n");
goto fail;
}
xfoob = XEXP (operand, 0);
if (GET_CODE (operand) == MEM
&& GET_CODE (xfoob) == PLUS
&& GET_CODE (XEXP (xfoob, 0)) == MEM)
{
fprintf(stderr,"Super interesting address mode\n");
goto fail;
}
if (GET_CODE (operand) == PLUS
&& GET_CODE (XEXP (operand, 0)) == PLUS)
return 0;
/* accept @Rn */
if (GET_CODE (operand) == REG
&&(strict ? REG_OK_FOR_BASE_STRICT_P (x)
: REG_OK_FOR_BASE_NOSTRICT_P (x)))
goto granded;
/* accept address */
if (CONSTANT_ADDRESS_P (operand))
goto granded;
/* accept X(Rn) */
if (GET_CODE (operand) == PLUS
&& GET_CODE (XEXP (operand, 0)) == REG
&& REG_OK_FOR_BASE_P (XEXP (operand, 0))
&& CONSTANT_ADDRESS_P (XEXP (operand, 1))
)
goto granded;
fail:
return 0;
granded:
fprintf(stderr,"legitimate_address_p --- Ok\n");
return 1;
}
do not help.
I thought that it might be cause I defined
frame_pointer_regnum equial to stack pointer.
Now I assigned frame_pointer_regnum to another register and still got
the same error.
This happens only when frame pointer required.
here is the part of RTL dump:
(jump_insn/i 451 450 452 (set (pc)
(if_then_else (ne (cc0)
(const_int 0 [0x0]))
(label_ref 380)
(pc))) 127 {bne} (nil)
(expr_list:REG_BR_PROB (const_int 6001 [0x1771])
(nil)))
*****************/
jne .L402 ; .L402
/*****************
(insn/i 457 946 458 (set (mem/s:HI (plus:HI (reg/v:HI 6 r6 [136])
(const_int 2 [0x2])) 0)
(plus:HI (mem/s:HI (plus:HI (reg/v:HI 6 r6 [136])
(const_int 2 [0x2])) 0)
(mem/s:HI (plus:HI (mem:HI (plus:HI (reg/f:HI 4 r4)
(const_int 22 [0x16])) 0)
(const_int 2 [0x2])) 0))) 37 {*addhi3_3} (nil)
(expr_list:REG_DEAD (reg/v:HI 6 r6 [136])
(nil)))
*****************/
add 2(22(r4)), 2(r6) ; ----- INVALID!!
;; will be output as: add 2(r675750800), 2(r6)
.L401:
/*****************
(insn/i 461 460 462 (set (reg:HI 15 r15)
(mem/s:HI (plus:HI (reg/f:HI 4 r4)
(const_int 2 [0x2])) 0)) 26 {*movhi3} (nil)
(nil))
*****************/
mov 2(r4), r15
So, thank you anyway.
Dmitry
Jan Hubicka wrote:
>>int
>>legitimate_address_p (mode, operand, strict)
>>enum machine_mode mode;
>>rtx operand;
>>int strict;
>>{
>> rtx x = operand;
>>
>> /* accept @Rn */
>> if (GET_CODE (operand) == REG
>> &&(strict ? REG_OK_FOR_BASE_STRICT_P (x)
>> : REG_OK_FOR_BASE_NOSTRICT_P (x)))
>> return 1;
>>
>> /* accept address */
>> if (CONSTANT_ADDRESS_P (operand))
>> return 1;
>>
>> /* accept X(Rn) */
>> if (GET_CODE (operand) == PLUS
>> && GET_CODE (XEXP (operand, 0)) == REG
>> && REG_OK_FOR_BASE_P (XEXP (operand, 0))
>> && CONSTANT_ADDRESS_P (XEXP (operand, 1)))
>> return 1;
>>
>Missing return 0;
>
>>}
>>--------------------------
>>
>>Shall I define something else to prevent invalid address generation or what?
>>
>
>It is normal for invalid addresses to be generated and rejected
>during the compilation.
>If you want to do some special tricks, you may define LEGITIMIZE
>macros, but in your case, it the default behaviour is most probably
>OK. I guess only problem is the missing return :)
>
>Honza
>
>