diff mbox

[Committed,1/2] shrink wrap a function with a single loop: copy propagation

Message ID CACgzC7BbcVwcCMHYHJvnVRrVz_bT7=4twSFP9MvJKjzKjctxUg@mail.gmail.com
State New
Headers show

Commit Message

Zhenqiang Chen May 15, 2014, 6:57 a.m. UTC
On 15 May 2014 02:07, Jeff Law <law@redhat.com> wrote:
> On 05/13/14 04:04, Zhenqiang Chen wrote:
>>
>> After reading the code in regcprop.c, I think I should reuse the
>> copyprop_hardreg_forward_1. So rewrite the patch, which is much simple
>> and should handle HAVE_cc0. But not sure we'd handle DEBUG_INSN or
>> not.
>>
>> 2014-05-13  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>>
>>          * regcprop.c (skip_debug_insn_p): New decl.
>>          (replace_oldest_value_reg): Check skip_debug_insn_p.
>>          (copyprop_hardreg_forward_bb_without_debug_insn.): New function.
>>          * shrink-wrap.c (prepare_shrink_wrap):
>>          Call copyprop_hardreg_forward_bb_without_debug_insn.
>>          * function.h (copyprop_hardreg_forward_bb_without_debug_insn):
>>          New prototype.
>>
>> testsuite/ChangeLog:
>> 2014-05-13  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>>
>>          * shrink-wrap-loop.c: New test case.
>
> Basically OK.
>
> Can you create regcprop.h and put the prototype for
> copyprop_hardreg_forward_bb_without_debug_insn in there?
>
> Then include regcprop.h in shrink-wrap.c.
>
> With that change, approved.  Please post the final version for archival
> purposes.

Thanks. Committed @r210458 with the suggested changes.

ChangeLog:
2014-05-15  Zhenqiang Chen  <zhenqiang.chen@linaro.org>

        * regcprop.h: New file.
        * regcprop.c (skip_debug_insn_p): New decl.
        (replace_oldest_value_reg): Check skip_debug_insn_p.
        (copyprop_hardreg_forward_bb_without_debug_insn.): New function.
        * shrink-wrap.c: include regcprop.h
        (prepare_shrink_wrap):
        Call copyprop_hardreg_forward_bb_without_debug_insn.

testsuite/ChangeLog:
2014-05-15  Zhenqiang Chen  <zhenqiang.chen@linaro.org>

        * shrink-wrap-loop.c: New test case.
diff mbox

Patch

diff --git a/gcc/regcprop.c b/gcc/regcprop.c
index a710cc38..7a5a4f6 100644
--- a/gcc/regcprop.c
+++ b/gcc/regcprop.c
@@ -77,6 +77,7 @@  struct value_data
 };
 
 static alloc_pool debug_insn_changes_pool;
+static bool skip_debug_insn_p;
 
 static void kill_value_one_regno (unsigned, struct value_data *);
 static void kill_value_regno (unsigned, unsigned, struct value_data *);
@@ -485,7 +486,7 @@  replace_oldest_value_reg (rtx *loc, enum reg_class cl, rtx insn,
 			  struct value_data *vd)
 {
   rtx new_rtx = find_oldest_value_reg (cl, *loc, vd);
-  if (new_rtx)
+  if (new_rtx && (!DEBUG_INSN_P (insn) || !skip_debug_insn_p))
     {
       if (DEBUG_INSN_P (insn))
 	{
@@ -1112,6 +1113,26 @@  debug_value_data (struct value_data *vd)
 	       vd->e[i].next_regno);
 }
 
+/* Do copyprop_hardreg_forward_1 for a single basic block BB.
+   DEBUG_INSN is skipped since we do not want to involve DF related
+   staff as how it is handled in function pass_cprop_hardreg::execute.
+
+   NOTE: Currently it is only used for shrink-wrap.  Maybe extend it
+   to handle DEBUG_INSN for other uses.  */
+
+void
+copyprop_hardreg_forward_bb_without_debug_insn (basic_block bb)
+{
+  struct value_data *vd;
+  vd = XNEWVEC (struct value_data, 1);
+  init_value_data (vd);
+
+  skip_debug_insn_p = true;
+  copyprop_hardreg_forward_1 (bb, vd);
+  free (vd);
+  skip_debug_insn_p = false;
+}
+
 #ifdef ENABLE_CHECKING
 static void
 validate_value_data (struct value_data *vd)
diff --git a/gcc/regcprop.h b/gcc/regcprop.h
new file mode 100644
index 0000000..ab54eaf
--- /dev/null
+++ b/gcc/regcprop.h
@@ -0,0 +1,27 @@ 
+/* Copy propagation on hard registers.
+   Copyright (C) 1989-2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_REGCPROP_H
+#define GCC_REGCPROP_H
+
+#include "basic-block.h"
+
+extern void copyprop_hardreg_forward_bb_without_debug_insn (basic_block bb);
+
+#endif  /* GCC_REGCPROP_H  */
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
index 6f0cd0c..f09cfe7 100644
--- a/gcc/shrink-wrap.c
+++ b/gcc/shrink-wrap.c
@@ -52,7 +52,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "params.h"
 #include "bb-reorder.h"
 #include "shrink-wrap.h"
-
+#include "regcprop.h"
 
 #ifdef HAVE_simple_return
 
@@ -320,6 +320,15 @@  prepare_shrink_wrap (basic_block entry_block)
   df_ref *ref;
   bool split_p = false;
 
+  if (JUMP_P (BB_END (entry_block)))
+    {
+      /* To have more shrink-wrapping opportunities, prepare_shrink_wrap tries
+	 to sink the copies from parameter to callee saved register out of
+	 entry block.  copyprop_hardreg_forward_bb_without_debug_insn is called
+	 to release some dependences.  */
+      copyprop_hardreg_forward_bb_without_debug_insn (entry_block);
+    }
+
   CLEAR_HARD_REG_SET (uses);
   CLEAR_HARD_REG_SET (defs);
   FOR_BB_INSNS_REVERSE_SAFE (entry_block, insn, curr)
diff --git a/gcc/testsuite/gcc.dg/shrink-wrap-loop.c b/gcc/testsuite/gcc.dg/shrink-wrap-loop.c
new file mode 100644
index 0000000..17dca4e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/shrink-wrap-loop.c
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { { x86_64-*-* } || { arm_thumb2 } } } } */
+/* { dg-options "-O2 -fdump-rtl-pro_and_epilogue"  } */
+
+int foo (int *p1, int *p2);
+
+int
+test (int *p1, int *p2)
+{
+  int *p;
+
+  for (p = p2; p != 0; p++)
+    {
+      if (!foo (p, p1))
+        return 0;
+    }
+
+  return 1;
+}
+/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" "pro_and_epilogue"  } } */
+/* { dg-final { cleanup-rtl-dump "pro_and_epilogue" } } */