From f301837ea38782f232b7db3e1e0eb51a03819240 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 15 May 2012 07:21:37 +0000 Subject: [PATCH] gimplify.c (gimplify_init_constructor): Do a block move for very small objects as well. * gimplify.c (gimplify_init_constructor): Do a block move for very small objects as well. From-SVN: r187498 --- gcc/ChangeLog | 5 +++++ gcc/gimplify.c | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df9f0dc09da9..e2f6509e0df7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-05-15 Eric Botcazou + + * gimplify.c (gimplify_init_constructor): Do a block move for very + small objects as well. + 2012-05-15 Bernd Schmidt * ira.c (find_moveable_pseudos): Skip registers whose diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 02e42b8b4198..d7f1f82345b8 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4033,9 +4033,13 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, else align = TYPE_ALIGN (type); + /* Do a block move either if the size is so small as to make + each individual move a sub-unit move on average, or if it + is so large as to make individual moves inefficient. */ if (size > 0 && num_nonzero_elements > 1 - && !can_move_by_pieces (size, align)) + && (size < num_nonzero_elements + || !can_move_by_pieces (size, align))) { if (notify_temp_creation) return GS_ERROR;