From: Joseph Myers Date: Wed, 29 Nov 2006 12:49:06 +0000 (+0000) Subject: rs6000.c (rs6000_gimplify_va_arg): If STRICT_ALIGNMENT and the type is more aligned... X-Git-Tag: releases/gcc-4.3.0~8235 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0cfbc62b0b8697c3e248295cd076e91cd890926c;p=thirdparty%2Fgcc.git rs6000.c (rs6000_gimplify_va_arg): If STRICT_ALIGNMENT and the type is more aligned than the saved registers... * config/rs6000/rs6000.c (rs6000_gimplify_va_arg): If STRICT_ALIGNMENT and the type is more aligned than the saved registers, copy via a temporary. From-SVN: r119307 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c838be7693a6..0c02f8bede58 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-11-29 Joseph Myers + + * config/rs6000/rs6000.c (rs6000_gimplify_va_arg): If + STRICT_ALIGNMENT and the type is more aligned than the saved + registers, copy via a temporary. + 2006-11-28 Andrew Pinski PR tree-opt/29984 diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index d52a75951c3f..675af68fe9a3 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -6222,6 +6222,27 @@ rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) append_to_statement_list (t, pre_p); } + if (STRICT_ALIGNMENT + && (TYPE_ALIGN (type) + > (unsigned) BITS_PER_UNIT * (align < 4 ? 4 : align))) + { + /* The value (of type complex double, for example) may not be + aligned in memory in the saved registers, so copy via a + temporary. (This is the same code as used for SPARC.) */ + tree tmp = create_tmp_var (type, "va_arg_tmp"); + tree dest_addr = build_fold_addr_expr (tmp); + + tree copy = build_function_call_expr + (implicit_built_in_decls[BUILT_IN_MEMCPY], + tree_cons (NULL_TREE, dest_addr, + tree_cons (NULL_TREE, addr, + tree_cons (NULL_TREE, size_int (rsize * 4), + NULL_TREE)))); + + gimplify_and_add (copy, pre_p); + addr = dest_addr; + } + addr = fold_convert (ptrtype, addr); return build_va_arg_indirect_ref (addr); }