aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@linaro.org>2012-09-27 11:10:08 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2012-09-27 11:10:08 +0000
commitc2c47e8ff4a2af743d653110b385a944b3aee8fb (patch)
treead12fa136c6fb52d55abfe233dc3ee29a13ade19 /gcc
parent9472dcecc74b95a5164a57ecb689abf9dab7c5c4 (diff)
downloadgcc-c2c47e8ff4a2af743d653110b385a944b3aee8fb.zip
gcc-c2c47e8ff4a2af743d653110b385a944b3aee8fb.tar.gz
gcc-c2c47e8ff4a2af743d653110b385a944b3aee8fb.tar.bz2
lower-subreg.c (enum classify_move_insn): Rename SIMPLE_PSEUDO_REG_MOVE to DECOMPOSABLE_SIMPLE_MOVE.
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. From-SVN: r191805
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/lower-subreg.c31
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/lower-subreg-1.c2
4 files changed, 37 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b24a62c..fe86a66 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2012-09-27 Ulrich Weigand <ulrich.weigand@linaro.org>
+
+ * 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.
+
2012-09-27 Marek Polacek <polacek@redhat.com>
* doc/gcov.texi (Gcov Data Files): Fix a typo.
diff --git a/gcc/lower-subreg.c b/gcc/lower-subreg.c
index 4aaaa77..ab4ca36 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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c23166e..6225c76 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-27 Ulrich Weigand <ulrich.weigand@linaro.org>
+
+ * gcc.dg/lower-subreg-1.c: Disable on arm-*-* targets.
+
2012-09-27 Jakub Jelinek <jakub@redhat.com>
PR target/54703
diff --git a/gcc/testsuite/gcc.dg/lower-subreg-1.c b/gcc/testsuite/gcc.dg/lower-subreg-1.c
index 63be934..8c7cc2c 100644
--- a/gcc/testsuite/gcc.dg/lower-subreg-1.c
+++ b/gcc/testsuite/gcc.dg/lower-subreg-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { ! { mips64 || { ia64-*-* spu-*-* tilegx-*-* } } } } } */
+/* { dg-do compile { target { ! { mips64 || { arm-*-* ia64-*-* spu-*-* tilegx-*-* } } } } } */
/* { dg-options "-O -fdump-rtl-subreg1" } */
/* { dg-skip-if "" { { i?86-*-* x86_64-*-* } && x32 } { "*" } { "" } } */
/* { dg-require-effective-target ilp32 } */