mirror of git://gcc.gnu.org/git/gcc.git
re PR target/47148 (likely wrong code bug)
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. From-SVN: r168441
This commit is contained in:
parent
1ac12fa2a7
commit
371556eeb7
|
|
@ -1,5 +1,9 @@
|
||||||
2011-01-03 Jakub Jelinek <jakub@redhat.com>
|
2011-01-03 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/47148
|
||||||
|
* ipa-split.c (split_function): Convert arguments to
|
||||||
|
DECL_ARG_TYPE if possible.
|
||||||
|
|
||||||
PR tree-optimization/47155
|
PR tree-optimization/47155
|
||||||
* tree-ssa-ccp.c (bit_value_binop_1): Use r1type instead of type
|
* tree-ssa-ccp.c (bit_value_binop_1): Use r1type instead of type
|
||||||
when computing uns.
|
when computing uns.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/* Function splitting pass
|
/* Function splitting pass
|
||||||
Copyright (C) 2010
|
Copyright (C) 2010, 2011
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
Contributed by Jan Hubicka <jh@suse.cz>
|
Contributed by Jan Hubicka <jh@suse.cz>
|
||||||
|
|
||||||
|
|
@ -943,6 +943,9 @@ split_function (struct split_point *split_point)
|
||||||
tree retval = NULL, real_retval = NULL;
|
tree retval = NULL, real_retval = NULL;
|
||||||
bool split_part_return_p = false;
|
bool split_part_return_p = false;
|
||||||
gimple last_stmt = NULL;
|
gimple last_stmt = NULL;
|
||||||
|
bool conv_needed = false;
|
||||||
|
unsigned int i;
|
||||||
|
tree arg;
|
||||||
|
|
||||||
if (dump_file)
|
if (dump_file)
|
||||||
{
|
{
|
||||||
|
|
@ -959,7 +962,16 @@ split_function (struct split_point *split_point)
|
||||||
SSA_NAME_VERSION (gimple_default_def (cfun, parm))))
|
SSA_NAME_VERSION (gimple_default_def (cfun, parm))))
|
||||||
bitmap_set_bit (args_to_skip, num);
|
bitmap_set_bit (args_to_skip, num);
|
||||||
else
|
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. */
|
/* See if the split function will return. */
|
||||||
FOR_EACH_EDGE (e, ei, return_bb->preds)
|
FOR_EACH_EDGE (e, ei, return_bb->preds)
|
||||||
|
|
@ -1056,6 +1068,14 @@ split_function (struct split_point *split_point)
|
||||||
|
|
||||||
/* Produce the call statement. */
|
/* Produce the call statement. */
|
||||||
gsi = gsi_last_bb (call_bb);
|
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);
|
call = gimple_build_call_vec (node->decl, args_to_pass);
|
||||||
gimple_set_block (call, DECL_INITIAL (current_function_decl));
|
gimple_set_block (call, DECL_INITIAL (current_function_decl));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
2011-01-03 Jakub Jelinek <jakub@redhat.com>
|
2011-01-03 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR tree-optimization/47148
|
||||||
|
* gcc.c-torture/execute/pr47148.c: New test.
|
||||||
|
|
||||||
PR tree-optimization/47155
|
PR tree-optimization/47155
|
||||||
* gcc.c-torture/execute/pr47155.c: New test.
|
* gcc.c-torture/execute/pr47155.c: New test.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
/* PR tree-optimization/47148 */
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
bar (unsigned x, unsigned y)
|
||||||
|
{
|
||||||
|
if (y >= 32)
|
||||||
|
return x;
|
||||||
|
else
|
||||||
|
return x >> y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned a = 1, b = 1;
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
foo (unsigned char x, unsigned y)
|
||||||
|
{
|
||||||
|
if (!y)
|
||||||
|
return;
|
||||||
|
unsigned c = (0x7000U / (x - 2)) ^ a;
|
||||||
|
unsigned d = bar (a, a);
|
||||||
|
b &= ((a - d) && (a - 1)) + c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
foo (1, 1);
|
||||||
|
foo (-1, 1);
|
||||||
|
if (b && ((unsigned char) -1) == 255)
|
||||||
|
__builtin_abort ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue