This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: PR 66685: parallel returns being misclassified
- From: Richard Sandiford <richard dot sandiford at arm dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, segher at kernel dot crashing dot org
- Date: Wed, 01 Jul 2015 16:25:14 +0100
- Subject: Re: PR 66685: parallel returns being misclassified
- Authentication-results: sourceware.org; auth=none
- References: <87h9ponuzs dot fsf at e105548-lin dot cambridge dot arm dot com> <CAFiYyc2MRO2kmboSkwv-jCcSfs9S4s5J-r-dovC1iECpoBonOw at mail dot gmail dot com>
Richard Biener <richard.guenther@gmail.com> writes:
> On Wed, Jul 1, 2015 at 10:27 AM, Richard Sandiford
> <richard.sandiford@arm.com> wrote:
>> This patch should restore bootstrap on hppa (and probably other targets
>> besides). The change to use target-insns.def put more stress on the
>> emit()/classify_insn() group of functions, which were missing a case
>> for parallel returns.
>>
>> Tested with a cross-compiler that it fixes the hppa problem. Bootstrap
>> in progress on x86_64-linux-gnu. OK to install?
>
> Ok.
I think this has probably broken bootstrap on powerpc64, where sibcalls
have both calls and returns. The loop picks the last candidate,
which is the return.
Is this patch OK?
Thanks,
Richard
gcc/
PR bootstrap/66685
* rtl.c (classify_insn): Only return JUMP_INSN for parallel returns if
there are no CALLs in the same pattern.
Index: gcc/rtl.c
===================================================================
--- gcc/rtl.c 2015-07-01 16:19:55.055415254 +0100
+++ gcc/rtl.c 2015-07-01 16:19:55.383411635 +0100
@@ -683,17 +683,20 @@ classify_insn (rtx x)
if (GET_CODE (x) == PARALLEL)
{
int j;
+ bool has_return_p = false;
for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
if (GET_CODE (XVECEXP (x, 0, j)) == CALL)
return CALL_INSN;
else if (ANY_RETURN_P (XVECEXP (x, 0, j)))
- return JUMP_INSN;
+ has_return_p = true;
else if (GET_CODE (XVECEXP (x, 0, j)) == SET
&& GET_CODE (SET_DEST (XVECEXP (x, 0, j))) == PC)
return JUMP_INSN;
else if (GET_CODE (XVECEXP (x, 0, j)) == SET
&& GET_CODE (SET_SRC (XVECEXP (x, 0, j))) == CALL)
return CALL_INSN;
+ if (has_return_p)
+ return JUMP_INSN;
}
#ifdef GENERATOR_FILE
if (GET_CODE (x) == MATCH_OPERAND