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>
* config/aarch64/aarch64.c (aarch64_register_move_cost): Add register
......@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
#include "bb-reorder.h"
#include "shrink-wrap.h"
#include "regcprop.h"
#include "rtl-iter.h"
#ifdef HAVE_simple_return
......@@ -169,7 +170,9 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
{
rtx set, src, dest;
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;
edge live_edge;
......@@ -179,7 +182,34 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
return false;
src = SET_SRC (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.
So keep them in the entry block. */
|| dest == stack_pointer_rtx
......@@ -188,10 +218,13 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn,
return false;
/* Make sure that the source register isn't defined later in BB. */
sregno = REGNO (src);
end_sregno = END_REGNO (src);
if (overlaps_hard_reg_set_p (defs, GET_MODE (src), sregno))
return false;
if (REG_P (src))
{
sregno = REGNO (src);
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. */
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>
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