aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2012-10-16 20:32:45 +0000
committerTom de Vries <tom@codesourcery.com>2012-10-16 20:32:45 +0000
commit8ae8a669c976f4013fae5f923c35cae99be4401b (patch)
tree48512b7be16b93e76a8180a2cb924564b49d714a
parentcac6eec6927223c82fd9e04c88b9deaa3ce682c9 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@192514 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c8
2 files changed, 9 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0b14270ee51..14b817d840c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+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.
+
2012-10-16 Joern Rennecke <joern.rennecke@embecosm.com>
* loop-doloop.c (doloop_modify): Pass doloop_end pattern to
diff --git a/gcc/expr.c b/gcc/expr.c
index 30431763649..8fa19fd5ce1 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);