public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] cfgcleanup: Ignore clobbers in bb_is_just_return
@ 2017-05-18 21:20 Segher Boessenkool
  2017-05-22  3:47 ` Jeff Law
  0 siblings, 1 reply; 2+ messages in thread
From: Segher Boessenkool @ 2017-05-18 21:20 UTC (permalink / raw)
  To: gcc-patches; +Cc: Segher Boessenkool

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  <segher@kernel.crashing.org>

	* 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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-05-22  2:07 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-18 21:20 [PATCH] cfgcleanup: Ignore clobbers in bb_is_just_return Segher Boessenkool
2017-05-22  3:47 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).