regcprop.h: New file.
authorZhenqiang Chen <zhenqiang.chen@linaro.org>
Thu, 15 May 2014 06:54:48 +0000 (06:54 +0000)
committerZhenqiang Chen <zqchen@gcc.gnu.org>
Thu, 15 May 2014 06:54:48 +0000 (06:54 +0000)
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.

From-SVN: r210458

gcc/ChangeLog
gcc/regcprop.c
gcc/regcprop.h [new file with mode: 0644]
gcc/shrink-wrap.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/shrink-wrap-loop.c [new file with mode: 0644]

index daf1d6cb68d596ce63f15ff6fe9ce91abe1f929e..beac3a76047aabfb9c7d5d5518b894a7438d6287 100644 (file)
@@ -1,3 +1,13 @@
+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.
+
 2014-05-15  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
 
        * shrink-wrap.h: Update comment.
index a710cc38bf52f5d68a408dbf163a55a5628a6351..7a5a4f6c6865b462bc1753b60150e67ee734ea59 100644 (file)
@@ -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 (file)
index 0000000..ab54eaf
--- /dev/null
@@ -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  */
index 6f0cd0c99d2ac9a51c7dff8a5feb2fbe6fd939a4..f09cfe7b1f9007452752785d53eb4131ecb882c7 100644 (file)
@@ -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)
index fa968bf51f9feb4239bd7239074e8a9f2dda2376..7df284eb6bd08fc1816ce72e3431efcee11a5945 100644 (file)
@@ -1,3 +1,7 @@
+2014-05-15  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
+
+       * shrink-wrap-loop.c: New test case.
+
 2014-05-14  Alan Lawrence  <alan.lawrence@arm.com>
 
        * gcc.target/arm/simd/vtrnqf32_1.c: New file.
diff --git a/gcc/testsuite/gcc.dg/shrink-wrap-loop.c b/gcc/testsuite/gcc.dg/shrink-wrap-loop.c
new file mode 100644 (file)
index 0000000..17dca4e
--- /dev/null
@@ -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" } } */