Commit 2b63a3ac by Jiong Wang Committed by Jiong Wang

Improve prepare_shrink_wrap to sink more instructions

  gcc/
    * shrink-wrap.c (move_insn_for_shrink_wrap): Add further check when
    !REG_P (src) to release more instruction sink opportunities.

  gcc/testsuite/
    * gcc.target/aarch64/shrink_wrap_symbol_ref_1.c: New testcase.

From-SVN: r215563
parent 8919453c
2014-09-24 Jiong Wang <jiong.wang@arm.com>
* shrink-wrap.c (move_insn_for_shrink_wrap): Add further check when
!REG_P (src) to release more instruction sink opportunities.
2014-09-24 Wilco Dijkstra <wilco.dijkstra@arm.com> 2014-09-24 Wilco Dijkstra <wilco.dijkstra@arm.com>
* config/aarch64/aarch64.c (aarch64_register_move_cost): Add register * config/aarch64/aarch64.c (aarch64_register_move_cost): Add register
...@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
#include "bb-reorder.h" #include "bb-reorder.h"
#include "shrink-wrap.h" #include "shrink-wrap.h"
#include "regcprop.h" #include "regcprop.h"
#include "rtl-iter.h"
#ifdef HAVE_simple_return #ifdef HAVE_simple_return
...@@ -169,7 +170,9 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn, ...@@ -169,7 +170,9 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
{ {
rtx set, src, dest; rtx set, src, dest;
bitmap live_out, live_in, bb_uses, bb_defs; bitmap live_out, live_in, bb_uses, bb_defs;
unsigned int i, dregno, end_dregno, sregno, end_sregno; unsigned int i, dregno, end_dregno;
unsigned int sregno = FIRST_PSEUDO_REGISTER;
unsigned int end_sregno = FIRST_PSEUDO_REGISTER;
basic_block next_block; basic_block next_block;
edge live_edge; edge live_edge;
...@@ -179,7 +182,34 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn, ...@@ -179,7 +182,34 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
return false; return false;
src = SET_SRC (set); src = SET_SRC (set);
dest = SET_DEST (set); dest = SET_DEST (set);
if (!REG_P (dest) || !REG_P (src)
if (!REG_P (src))
{
unsigned int reg_num = 0;
unsigned int nonconstobj_num = 0;
rtx src_inner = NULL_RTX;
subrtx_var_iterator::array_type array;
FOR_EACH_SUBRTX_VAR (iter, array, src, ALL)
{
rtx x = *iter;
if (REG_P (x))
{
reg_num++;
src_inner = x;
}
else if (!CONSTANT_P (x) && OBJECT_P (x))
nonconstobj_num++;
}
if (nonconstobj_num > 0
|| reg_num > 1)
src = NULL_RTX;
else if (reg_num == 1)
src = src_inner;
}
if (!REG_P (dest) || src == NULL_RTX
/* STACK or FRAME related adjustment might be part of prologue. /* STACK or FRAME related adjustment might be part of prologue.
So keep them in the entry block. */ So keep them in the entry block. */
|| dest == stack_pointer_rtx || dest == stack_pointer_rtx
...@@ -188,10 +218,13 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn, ...@@ -188,10 +218,13 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
return false; return false;
/* Make sure that the source register isn't defined later in BB. */ /* Make sure that the source register isn't defined later in BB. */
sregno = REGNO (src); if (REG_P (src))
end_sregno = END_REGNO (src); {
if (overlaps_hard_reg_set_p (defs, GET_MODE (src), sregno)) sregno = REGNO (src);
return false; end_sregno = END_REGNO (src);
if (overlaps_hard_reg_set_p (defs, GET_MODE (src), sregno))
return false;
}
/* Make sure that the destination register isn't referenced later in BB. */ /* Make sure that the destination register isn't referenced later in BB. */
dregno = REGNO (dest); dregno = REGNO (dest);
......
2014-09-24 Jiong Wang <jiong.wang@arm.com>
* gcc.target/aarch64/shrink_wrap_symbol_ref_1.c: New testcase.
2014-09-24 Marek Polacek <polacek@redhat.com> 2014-09-24 Marek Polacek <polacek@redhat.com>
PR c/61405 PR c/61405
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-rtl-pro_and_epilogue" } */
extern char *asm_out_file;
extern void default_elf_asm_output_ascii (char *, const char *, int);
void
assemble_string (const char *p, int size)
{
int pos = 0;
int maximum = 2000;
while (pos < size)
{
int thissize = size - pos;
if (thissize > maximum)
thissize = maximum;
default_elf_asm_output_ascii (asm_out_file, p, thissize);;
pos += thissize;
p += thissize;
}
}
/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" "pro_and_epilogue" } } */
/* { dg-final { cleanup-rtl-dump "pro_and_epilogue" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment