re PR c/8081 (ICE with variably sized types returned from nested functions)

2012-01-13  Richard Guenther  <rguenther@suse.de>

	PR middle-end/8081
	* gimplify.c (gimplify_modify_expr_rhs): For calls with a
	variable-sized result always use RSO.

	* gcc.dg/torture/pr8081.c: New testcase.

From-SVN: r183153
This commit is contained in:
Richard Guenther 2012-01-13 12:05:27 +00:00 committed by Richard Biener
parent b9b16ad409
commit aabb90e5ad
4 changed files with 42 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2012-01-13 Richard Guenther <rguenther@suse.de>
PR middle-end/8081
* gimplify.c (gimplify_modify_expr_rhs): For calls with a
variable-sized result always use RSO.
2012-01-12 DJ Delorie <dj@redhat.com>
* cfgexpand.c (convert_debug_memory_address): Allow any valid

View File

@ -4417,6 +4417,11 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p,
/* It's OK to use the target directly if it's being
initialized. */
use_target = true;
else if (variably_modified_type_p (TREE_TYPE (*to_p), NULL_TREE))
/* Always use the target and thus RSO for variable-sized types.
GIMPLE cannot deal with a variable-sized assignment
embedded in a call statement. */
use_target = true;
else if (TREE_CODE (*to_p) != SSA_NAME
&& (!is_gimple_variable (*to_p)
|| needs_to_live_in_memory (*to_p)))

View File

@ -1,3 +1,8 @@
2012-01-13 Richard Guenther <rguenther@suse.de>
PR middle-end/8081
* gcc.dg/torture/pr8081.c: New testcase.
2012-01-13 Georg-Johann Lay <avr@gjlay.de>
* gcc.dg/pr46309.c: Set branch cost to greater 1 for avr.

View File

@ -0,0 +1,26 @@
/* { dg-do run } */
extern void abort (void);
int
main (int argc, char **argv)
{
int size = 10;
typedef struct
{
char val[size];
}
block;
block a, b;
block __attribute__((noinline))
retframe_block ()
{
return *(block *) &b;
}
b.val[0] = -1;
b.val[9] = -2;
a=retframe_block ();
if (a.val[0] != -1
|| a.val[9] != -2)
abort ();
return 0;
}