diff options
author | David S. Miller <davem@davemloft.net> | 2011-10-28 05:08:10 +0000 |
---|---|---|
committer | David S. Miller <davem@gcc.gnu.org> | 2011-10-27 22:08:10 -0700 |
commit | 26689420afc4cbc1d22e7e4ba09ee80b1bf7d5f4 (patch) | |
tree | df8b5770aa1ec5147680471d615a15bc06025a27 | |
parent | 53b51666890e927604fab9dcdc0035ab4ce865e9 (diff) | |
download | gcc-26689420afc4cbc1d22e7e4ba09ee80b1bf7d5f4.zip gcc-26689420afc4cbc1d22e7e4ba09ee80b1bf7d5f4.tar.gz gcc-26689420afc4cbc1d22e7e4ba09ee80b1bf7d5f4.tar.bz2 |
Fix illegal register substitutions on big-endian during cprop_reg.
* regcprop.c (copyprop_hardreg_forward_1): Reject the
transformation when we narrow the mode on big endian.
From-SVN: r180600
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/regcprop.c | 8 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 403fb60..54e059e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2011-10-27 David S. Miller <davem@davemloft.net> + + * regcprop.c (copyprop_hardreg_forward_1): Reject the + transformation when we narrow the mode on big endian. + 2011-10-27 Jakub Jelinek <jakub@redhat.com> * config/i386/sse.md (avx_cvtpd2dq256_2, avx_cvttpd2dq256_2, diff --git a/gcc/regcprop.c b/gcc/regcprop.c index ad92a64..b0f0343 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -824,6 +824,14 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd) if (hard_regno_nregs[regno][mode] > hard_regno_nregs[regno][vd->e[regno].mode]) goto no_move_special_case; + + /* And likewise, if we are narrowing on big endian the transformation + is also invalid. */ + if (hard_regno_nregs[regno][mode] + < hard_regno_nregs[regno][vd->e[regno].mode] + && (GET_MODE_SIZE (vd->e[regno].mode) > UNITS_PER_WORD + ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN)) + goto no_move_special_case; } /* If the destination is also a register, try to find a source |