From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18333 invoked by alias); 22 Jan 2002 10:56:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 18311 invoked by uid 71); 22 Jan 2002 10:56:01 -0000 Date: Tue, 22 Jan 2002 02:56:00 -0000 Message-ID: <20020122105601.18310.qmail@sources.redhat.com> To: pb@gcc.gnu.org Cc: gcc-prs@gcc.gnu.org, From: Phil Blundell Subject: Re: target/5054: [ARM/Thumb] ICE with -mlong-calls Reply-To: Phil Blundell X-SW-Source: 2002-01/txt/msg00758.txt.bz2 List-Id: The following reply was made to PR target/5054; it has been noted by GNATS. From: Phil Blundell To: gcc-gnats@gcc.gnu.org Cc: Subject: Re: target/5054: [ARM/Thumb] ICE with -mlong-calls Date: 22 Jan 2002 10:50:09 +0000 The problem here seems to be this Thumb pattern: (define_insn "*call_insn" [(call (mem:SI (match_operand:SI 0 "" "X")) (match_operand:SI 1 "" "")) (use (match_operand 2 "" "")) (clobber (reg:SI LR_REGNUM))] "TARGET_THUMB && operands[2] == const0_rtx && (GET_CODE (operands[0]) == SYMBOL_REF)" "bl\\t%a0" [(set_attr "length" "4") (set_attr "type" "call")] ) Note that it checks operands[2], which is the "call type" cookie. This gets set to const1_rtx when -mlong-calls is in effect. The expectation seems to be that the define_expand "call" will transform this into a register-based call, but this is inhibited within arm_is_longcall_p for functions defined elsewhere in the current compilation unit. I guess that the define_expand ought to force operands[2] to const0_rtx when it decides not to do a long call, something like this: if (GET_CODE (callee) != REG && INTVAL (operands[2]) == CALL_LONG) { if (arm_is_longcall_p (operands[0], INTVAL (operands[2]), 0)) XEXP (operands[0], 0) = force_reg (Pmode, callee); else operands[2] = const0_rtx; }