summaryrefslogtreecommitdiff
path: root/gcc/ipa-split.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-03 21:10:31 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2011-01-03 21:10:31 +0000
commite65564abcea990cab3ee81cd7935477c5291871f (patch)
tree069c88ce4bc2a19d51a18963f63af0db3b473c26 /gcc/ipa-split.c
parentc983166332284b7e36d9f0225f15121f2f9fd73a (diff)
downloadgcc-e65564abcea990cab3ee81cd7935477c5291871f.tar.gz
PR tree-optimization/47148
* ipa-split.c (split_function): Convert arguments to DECL_ARG_TYPE if possible. * gcc.c-torture/execute/pr47148.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168441 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-split.c')
-rw-r--r--gcc/ipa-split.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index 1a553522153..fabd6d11bd9 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -1,5 +1,5 @@
/* Function splitting pass
- Copyright (C) 2010
+ Copyright (C) 2010, 2011
Free Software Foundation, Inc.
Contributed by Jan Hubicka <jh@suse.cz>
@@ -943,6 +943,9 @@ split_function (struct split_point *split_point)
tree retval = NULL, real_retval = NULL;
bool split_part_return_p = false;
gimple last_stmt = NULL;
+ bool conv_needed = false;
+ unsigned int i;
+ tree arg;
if (dump_file)
{
@@ -959,7 +962,16 @@ split_function (struct split_point *split_point)
SSA_NAME_VERSION (gimple_default_def (cfun, parm))))
bitmap_set_bit (args_to_skip, num);
else
- VEC_safe_push (tree, heap, args_to_pass, gimple_default_def (cfun, parm));
+ {
+ arg = gimple_default_def (cfun, parm);
+ if (TYPE_MAIN_VARIANT (DECL_ARG_TYPE (parm))
+ != TYPE_MAIN_VARIANT (TREE_TYPE (arg)))
+ {
+ conv_needed = true;
+ arg = fold_convert (DECL_ARG_TYPE (parm), arg);
+ }
+ VEC_safe_push (tree, heap, args_to_pass, arg);
+ }
/* See if the split function will return. */
FOR_EACH_EDGE (e, ei, return_bb->preds)
@@ -1056,6 +1068,14 @@ split_function (struct split_point *split_point)
/* Produce the call statement. */
gsi = gsi_last_bb (call_bb);
+ if (conv_needed)
+ FOR_EACH_VEC_ELT (tree, args_to_pass, i, arg)
+ if (!is_gimple_val (arg))
+ {
+ arg = force_gimple_operand_gsi (&gsi, arg, true, NULL_TREE,
+ false, GSI_NEW_STMT);
+ VEC_replace (tree, args_to_pass, i, arg);
+ }
call = gimple_build_call_vec (node->decl, args_to_pass);
gimple_set_block (call, DECL_INITIAL (current_function_decl));