From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26126 invoked by alias); 5 Dec 2001 16:23:57 -0000 Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org Received: (qmail 26104 invoked from network); 5 Dec 2001 16:23:54 -0000 Received: from unknown (HELO smtp1.port.ru) (194.67.57.11) by sources.redhat.com with SMTP; 5 Dec 2001 16:23:54 -0000 Received: from [194.105.215.6] (helo=mail.ru) by smtp1.port.ru with esmtp (Exim 3.14 #1) id 16Bepr-0009NJ-00; Wed, 05 Dec 2001 19:23:51 +0300 Message-ID: <3C0E5775.1040904@mail.ru> Date: Wed, 05 Dec 2001 08:23:00 -0000 From: dimmy User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:0.9.4) Gecko/20011001 X-Accept-Language: en-us MIME-Version: 1.0 To: Jan Hubicka CC: gcc@gcc.gnu.org Subject: Re: Legitimize address, Please HELP! References: <3C0E1421.1080906@mail.ru> <20011205163059.M30680@atrey.karlin.mff.cuni.cz> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-SW-Source: 2001-12/txt/msg00213.txt.bz2 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 > >