diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b24a62cc9b3..fe86a66f6bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2012-09-27 Ulrich Weigand + + * 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 * doc/gcov.texi (Gcov Data Files): Fix a typo. 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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c23166ee24a..6225c761d7b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-09-27 Ulrich Weigand + + * gcc.dg/lower-subreg-1.c: Disable on arm-*-* targets. + 2012-09-27 Jakub Jelinek PR target/54703 diff --git a/gcc/testsuite/gcc.dg/lower-subreg-1.c b/gcc/testsuite/gcc.dg/lower-subreg-1.c index 63be934054e..8c7cc2c098b 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 } */