cfgcleanup: Ignore clobbers in bb_is_just_return
authorSegher Boessenkool <segher@kernel.crashing.org>
Mon, 22 May 2017 21:20:51 +0000 (23:20 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Mon, 22 May 2017 21:20:51 +0000 (23:20 +0200)
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.

* cfgcleanup.c (bb_is_just_return): Allow CLOBBERs.

gcc/testsuite/

From-SVN: r248351

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/conditional-return.c [new file with mode: 0644]

index 7bdd6f2c7a769a696ddabebbe6dbfc70783f2fe5..713654d8031cd8c25150f5f703f7eeb3d19c236f 100644 (file)
@@ -1,3 +1,7 @@
+2017-05-22  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * cfgcleanup.c (bb_is_just_return): Allow CLOBBERs.
+
 2017-05-22  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/80809
index f68a964e31e9389944ef9587d99edeb19965b70f..3e1406c114112bf938153428773209d388539bb5 100644 (file)
@@ -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;
       }
 
index 08cfe126d69a049689fedc38453f2f713f2f023c..c55b0eef335ef20539cfadeb8737840163b04887 100644 (file)
@@ -1,3 +1,7 @@
+2017-05-22  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * gcc.target/powerpc/conditional-return.c: New testcase.
+
 2017-05-22  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/p8-vec-xl-xst.c: Fix target string to
diff --git a/gcc/testsuite/gcc.target/powerpc/conditional-return.c b/gcc/testsuite/gcc.target/powerpc/conditional-return.c
new file mode 100644 (file)
index 0000000..6b3ef5f
--- /dev/null
@@ -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;
+}