Commit 0cfbc62b by Joseph Myers Committed by Joseph Myers

rs6000.c (rs6000_gimplify_va_arg): If STRICT_ALIGNMENT and the type is more…

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
parent e969dbde
2006-11-29 Joseph Myers <joseph@codesourcery.com>
* 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 <pinskia@gmail.com> 2006-11-28 Andrew Pinski <pinskia@gmail.com>
PR tree-opt/29984 PR tree-opt/29984
......
...@@ -6222,6 +6222,27 @@ rs6000_gimplify_va_arg (tree valist, tree type, tree *pre_p, tree *post_p) ...@@ -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); 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); addr = fold_convert (ptrtype, addr);
return build_va_arg_indirect_ref (addr); return build_va_arg_indirect_ref (addr);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment