aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2012-10-16 20:32:45 +0000
committerTom de Vries <vries@gcc.gnu.org>2012-10-16 20:32:45 +0000
commitf841b68397bb8b15ea570a7a86c5414f62cc9774 (patch)
tree48512b7be16b93e76a8180a2cb924564b49d714a /gcc/expr.c
parent7181e991b54aaee6a21afb372611523a09a0dc00 (diff)
downloadgcc-f841b68397bb8b15ea570a7a86c5414f62cc9774.zip
gcc-f841b68397bb8b15ea570a7a86c5414f62cc9774.tar.gz
gcc-f841b68397bb8b15ea570a7a86c5414f62cc9774.tar.bz2
2012-10-16 Tom de Vries <tom@codesourcery.com>
* expr.c (move_by_pieces, move_by_pieces_ninsns, can_store_by_pieces) (store_by_pieces_1): Don't enter loop when no more data is left. From-SVN: r192514
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 3043176..8fa19fd 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -966,7 +966,7 @@ move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len,
/* First move what we can in the largest integer mode, then go to
successively smaller modes. */
- while (max_size > 1)
+ while (max_size > 1 && data.len > 0)
{
enum machine_mode mode = widest_int_mode_for_size (max_size);
@@ -1026,7 +1026,7 @@ move_by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
- while (max_size > 1)
+ while (max_size > 1 && l > 0)
{
enum machine_mode mode;
enum insn_code icode;
@@ -2417,7 +2417,7 @@ can_store_by_pieces (unsigned HOST_WIDE_INT len,
{
l = len;
max_size = STORE_MAX_PIECES + 1;
- while (max_size > 1)
+ while (max_size > 1 && l > 0)
{
mode = widest_int_mode_for_size (max_size);
@@ -2612,7 +2612,7 @@ store_by_pieces_1 (struct store_by_pieces_d *data ATTRIBUTE_UNUSED,
/* First store what we can in the largest integer mode, then go to
successively smaller modes. */
- while (max_size > 1)
+ while (max_size > 1 && data->len > 0)
{
enum machine_mode mode = widest_int_mode_for_size (max_size);