From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18538 invoked by alias); 18 May 2017 20:58:54 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 18510 invoked by uid 89); 18 May 2017 20:58:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.8 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy= X-HELO: gcc1-power7.osuosl.org Received: from gcc1-power7.osuosl.org (HELO gcc1-power7.osuosl.org) (140.211.15.137) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 18 May 2017 20:58:51 +0000 Received: by gcc1-power7.osuosl.org (Postfix, from userid 10019) id 4E0461C043A; Thu, 18 May 2017 20:58:51 +0000 (UTC) From: Segher Boessenkool To: gcc-patches@gcc.gnu.org Cc: Segher Boessenkool Subject: [PATCH] cfgcleanup: Ignore clobbers in bb_is_just_return Date: Thu, 18 May 2017 21:20:00 -0000 Message-Id: <8852455d0f86e667cf5adab3310fde9153b29286.1495140549.git.segher@kernel.crashing.org> X-IsSubscribed: yes X-SW-Source: 2017-05/txt/msg01500.txt.bz2 The function bb_is_just_return finds if the BB it is asked about does just a return and nothing else. It currently does not allow clobbers in the block either, which we of course can allow just fine. This patch changes that. Bootstrapped and tested on powerpc64-linux {-m32,-m64} (and tested that the new test fails before the patch, too). Is this okay for trunk? Segher 2017-05-18 Segher Boessenkool * cfgcleanup.c (bb_is_just_return): Allow CLOBBERs. gcc/testsuite/ * gcc.target/powerpc/conditional-return.c: New testcase. --- gcc/cfgcleanup.c | 14 ++++++++------ gcc/testsuite/gcc.target/powerpc/conditional-return.c | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/conditional-return.c diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index f68a964..3e1406c 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -2666,7 +2666,7 @@ trivially_empty_bb_p (basic_block bb) /* Return true if BB contains just a return and possibly a USE of the return value. Fill in *RET and *USE with the return and use insns - if any found, otherwise NULL. */ + if any found, otherwise NULL. All CLOBBERs are ignored. */ static bool bb_is_just_return (basic_block bb, rtx_insn **ret, rtx_insn **use) @@ -2680,13 +2680,15 @@ bb_is_just_return (basic_block bb, rtx_insn **ret, rtx_insn **use) FOR_BB_INSNS (bb, insn) if (NONDEBUG_INSN_P (insn)) { - if (!*ret && ANY_RETURN_P (PATTERN (insn))) + rtx pat = PATTERN (insn); + + if (!*ret && ANY_RETURN_P (pat)) *ret = insn; - else if (!*ret && !*use && GET_CODE (PATTERN (insn)) == USE - && REG_P (XEXP (PATTERN (insn), 0)) - && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0))) + else if (!*ret && !*use && GET_CODE (pat) == USE + && REG_P (XEXP (pat, 0)) + && REG_FUNCTION_VALUE_P (XEXP (pat, 0))) *use = insn; - else + else if (GET_CODE (pat) != CLOBBER) return false; } diff --git a/gcc/testsuite/gcc.target/powerpc/conditional-return.c b/gcc/testsuite/gcc.target/powerpc/conditional-return.c new file mode 100644 index 0000000..6b3ef5f --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/conditional-return.c @@ -0,0 +1,15 @@ +/* Check that a conditional return is used. */ + +/* { dg-do compile } */ +/* { dg-options "-O2 -w" } */ + +/* { dg-final { scan-assembler {\mbeqlr\M} } } */ + + +int f(int x) +{ + if (x) + return x + 31; + + return; +} -- 1.9.3