summaryrefslogtreecommitdiff
path: root/gcc/lower-subreg.c
diff options
context:
space:
mode:
authoruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-27 11:10:08 +0000
committeruweigand <uweigand@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-27 11:10:08 +0000
commitb5ca662477a8ebadb83120a5e866515e1daf490f (patch)
treead12fa136c6fb52d55abfe233dc3ee29a13ade19 /gcc/lower-subreg.c
parent562a74e68f41edc47e03c9fbc8b5f40c69daec15 (diff)
downloadgcc-b5ca662477a8ebadb83120a5e866515e1daf490f.tar.gz
ChangeLog:
* lower-subreg.c (enum classify_move_insn): Rename SIMPLE_PSEUDO_REG_MOVE to DECOMPOSABLE_SIMPLE_MOVE. (find_decomposable_subregs): Update. (decompose_multiword_subregs): Add DECOMPOSE_COPIES parameter. Only mark pseudo-to-pseudo copies as DECOMPOSABLE_SIMPLE_MOVE if that parameter is true. (rest_of_handle_lower_subreg): Call decompose_multiword_subregs with DECOMPOSE_COPIES false. (rest_of_handle_lower_subreg2): Call decompose_multiword_subregs with DECOMPOSE_COPIES true. testsuite/ChangeLog: * gcc.dg/lower-subreg-1.c: Disable on arm-*-* targets. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191805 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lower-subreg.c')
-rw-r--r--gcc/lower-subreg.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c
index 4aaaa7754c5..ab4ca36cdcb 100644
--- a/gcc/lower-subreg.c
+++ b/gcc/lower-subreg.c
@@ -440,9 +440,9 @@ enum classify_move_insn
{
/* Not a simple move from one location to another. */
NOT_SIMPLE_MOVE,
- /* A simple move from one pseudo-register to another. */
- SIMPLE_PSEUDO_REG_MOVE,
- /* A simple move involving a non-pseudo-register. */
+ /* A simple move we want to decompose. */
+ DECOMPOSABLE_SIMPLE_MOVE,
+ /* Any other simple move. */
SIMPLE_MOVE
};
@@ -518,7 +518,7 @@ find_decomposable_subregs (rtx *px, void *data)
If this is not a simple copy from one location to another,
then we can not decompose this register. If this is a simple
- copy from one pseudo-register to another, and the mode is right
+ copy we want to decompose, and the mode is right,
then we mark the register as decomposable.
Otherwise we don't say anything about this register --
it could be decomposed, but whether that would be
@@ -537,7 +537,7 @@ find_decomposable_subregs (rtx *px, void *data)
case NOT_SIMPLE_MOVE:
bitmap_set_bit (non_decomposable_context, regno);
break;
- case SIMPLE_PSEUDO_REG_MOVE:
+ case DECOMPOSABLE_SIMPLE_MOVE:
if (MODES_TIEABLE_P (GET_MODE (x), word_mode))
bitmap_set_bit (decomposable_context, regno);
break;
@@ -553,7 +553,7 @@ find_decomposable_subregs (rtx *px, void *data)
enum classify_move_insn cmi_mem = NOT_SIMPLE_MOVE;
/* Any registers used in a MEM do not participate in a
- SIMPLE_MOVE or SIMPLE_PSEUDO_REG_MOVE. Do our own recursion
+ SIMPLE_MOVE or DECOMPOSABLE_SIMPLE_MOVE. Do our own recursion
here, and return -1 to block the parent's recursion. */
for_each_rtx (&XEXP (x, 0), find_decomposable_subregs, &cmi_mem);
return -1;
@@ -1336,11 +1336,11 @@ dump_choices (bool speed_p, const char *description)
}
/* Look for registers which are always accessed via word-sized SUBREGs
- or via copies. Decompose these registers into several word-sized
- pseudo-registers. */
+ or -if DECOMPOSE_COPIES is true- via copies. Decompose these
+ registers into several word-sized pseudo-registers. */
static void
-decompose_multiword_subregs (void)
+decompose_multiword_subregs (bool decompose_copies)
{
unsigned int max;
basic_block bb;
@@ -1438,8 +1438,15 @@ decompose_multiword_subregs (void)
cmi = NOT_SIMPLE_MOVE;
else
{
+ /* We mark pseudo-to-pseudo copies as decomposable during the
+ second pass only. The first pass is so early that there is
+ good chance such moves will be optimized away completely by
+ subsequent optimizations anyway.
+
+ However, we call find_pseudo_copy even during the first pass
+ so as to properly set up the reg_copy_graph. */
if (find_pseudo_copy (set))
- cmi = SIMPLE_PSEUDO_REG_MOVE;
+ cmi = decompose_copies? DECOMPOSABLE_SIMPLE_MOVE : SIMPLE_MOVE;
else
cmi = SIMPLE_MOVE;
}
@@ -1640,7 +1647,7 @@ gate_handle_lower_subreg (void)
static unsigned int
rest_of_handle_lower_subreg (void)
{
- decompose_multiword_subregs ();
+ decompose_multiword_subregs (false);
return 0;
}
@@ -1649,7 +1656,7 @@ rest_of_handle_lower_subreg (void)
static unsigned int
rest_of_handle_lower_subreg2 (void)
{
- decompose_multiword_subregs ();
+ decompose_multiword_subregs (true);
return 0;
}