This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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
>
>




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]