From patchwork Tue Aug 31 20:13:40 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Fix pessimization with volatile objects From: Eric Botcazou X-Patchwork-Id: 63315 Message-Id: <201008312213.41067.ebotcazou@adacore.com> To: Richard Guenther Cc: gcc-patches@gcc.gnu.org Date: Tue, 31 Aug 2010 22:13:40 +0200 Hi Richard, last January you applied a fix for an issue related to volatile objects: 2010-01-31 Richard Guenther PR middle-end/42898 * gimplify.c (gimplify_init_constructor): For volatile LHS initialize a temporary. on all branches. Unfortunately this pessimizes a relatively common case in Ada, namely the assignment from a constructor with only one element. May I apply the attached patch on all branches as well (after testing)? 2010-08-31 Eric Botcazou * gimplify.c (gimplify_init_constructor): Do not create a temporary for a volatile LHS if the constructor has only one element. Index: gimplify.c =================================================================== --- gimplify.c (revision 163660) +++ gimplify.c (working copy) @@ -3824,11 +3824,12 @@ gimplify_init_constructor (tree *expr_p, } } - /* If the target is volatile and we have non-zero elements - initialize the target from a temporary. */ + /* If the target is volatile, we have non-zero elements and more than + one field to assign, initialize the target from a temporary. */ if (TREE_THIS_VOLATILE (object) && !TREE_ADDRESSABLE (type) - && num_nonzero_elements > 0) + && num_nonzero_elements > 0 + && VEC_length (constructor_elt, elts) > 1) { tree temp = create_tmp_var (TYPE_MAIN_VARIANT (type), NULL); TREE_OPERAND (*expr_p, 0) = temp;