Hi,

Function split_live_ranges_for_shrink_wrap has code

  if (!flag_shrink_wrap)
    return false;

But flag_shrink_wrap is TRUE by default when optimize > 0 even if the
port does not support shrink-wrap. To make sure shrink-wrap is
enabled, "HAVE_simple_return" must be defined and "HAVE_simple_return"
must be TRUE.

Please refer function.c and shrink-wrap.c on how shrink-wrap is
enabled in thread_prologue_and_epilogue_insns.

To make the check easy, the patch defines a MICRO:
SUPPORT_SHRINK_WRAP_P and replace the uses in ira.c and ifcvt.c

Bootstrap and no make check regression on X86-64.

OK for trunk?

Thanks!
-Zhenqiang

ChangeLog:
2014-08-14  Zhenqiang Chen  <zhenqiang.c...@arm.com>

        * shrink-wrap.h: #define SUPPORT_SHRINK_WRAP_P.
        * ira.c: #include "shrink-wrap.h"
        (split_live_ranges_for_shrink_wrap): Use SUPPORT_SHRINK_WRAP_P.
        * ifcvt.c: #include "shrink-wrap.h"
        (dead_or_predicable): Use SUPPORT_SHRINK_WRAP_P.

testsuite/ChangeLog:
2014-08-14  Zhenqiang Chen  <zhenqiang.c...@arm.com>

        * gcc.target/arm/split-live-ranges-for-shrink-wrap.c: New test.

diff --git a/gcc/shrink-wrap.h b/gcc/shrink-wrap.h
index bccfb31..31ce2d4 100644
--- a/gcc/shrink-wrap.h
+++ b/gcc/shrink-wrap.h
@@ -45,6 +45,9 @@ extern edge get_unconverted_simple_return (edge, bitmap_head,
 extern void convert_to_simple_return (edge entry_edge, edge orig_entry_edge,
                                      bitmap_head bb_flags, rtx returnjump,
                                      vec<edge> unconverted_simple_returns);
+#define SUPPORT_SHRINK_WRAP_P (flag_shrink_wrap && HAVE_simple_return)
+#else
+#define SUPPORT_SHRINK_WRAP_P false
 #endif

 #endif  /* GCC_SHRINK_WRAP_H  */
diff --git a/gcc/ira.c b/gcc/ira.c
index ccc6c79..8d58b60 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -392,6 +392,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "lra.h"
 #include "dce.h"
 #include "dbgcnt.h"
+#include "shrink-wrap.h"

 struct target_ira default_target_ira;
 struct target_ira_int default_target_ira_int;
@@ -4775,7 +4776,7 @@ split_live_ranges_for_shrink_wrap (void)
   bitmap_head need_new, reachable;
   vec<basic_block> queue;

-  if (!flag_shrink_wrap)
+  if (!SUPPORT_SHRINK_WRAP_P)
     return false;

   bitmap_initialize (&need_new, 0);
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index e44c1dc..c44e1c2 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -42,6 +42,7 @@
 #include "df.h"
 #include "vec.h"
 #include "dbgcnt.h"
+#include "shrink-wrap.h"

 #ifndef HAVE_conditional_move
 #define HAVE_conditional_move 0
@@ -4239,14 +4240,13 @@ dead_or_predicable (basic_block test_bb,
basic_block merge_bb,
        if (NONDEBUG_INSN_P (insn))
          df_simulate_find_defs (insn, merge_set);

-#ifdef HAVE_simple_return
       /* If shrink-wrapping, disable this optimization when test_bb is
         the first basic block and merge_bb exits.  The idea is to not
         move code setting up a return register as that may clobber a
         register used to pass function parameters, which then must be
         saved in caller-saved regs.  A caller-saved reg requires the
         prologue, killing a shrink-wrap opportunity.  */
-      if ((flag_shrink_wrap && HAVE_simple_return && !epilogue_completed)
+      if ((SUPPORT_SHRINK_WRAP_P && !epilogue_completed)
          && ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb == test_bb
          && single_succ_p (new_dest)
          && single_succ (new_dest) == EXIT_BLOCK_PTR_FOR_FN (cfun)
@@ -4293,7 +4293,6 @@ dead_or_predicable (basic_block test_bb,
basic_block merge_bb,
            }
          BITMAP_FREE (return_regs);
        }
-#endif
     }

  no_body:

Reply via email to