re PR middle-end/41282 (Revision 151394 failed to compile mplayer)

2009-09-07  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/41282
	* tree-sra.c (create_artificial_child_access): Return NULL if
	build_ref_for_offset fails.
	(propagate_subacesses_accross_link): Allow build_ref_for_offset
	and create_artificial_child_access to fail.

	* testsuite/gcc.c-torture/compile/pr41282.c: New test.

From-SVN: r151484
This commit is contained in:
Martin Jambor 2009-09-07 19:08:12 +02:00 committed by Martin Jambor
parent e5b258a4c9
commit 4a50e99c65
4 changed files with 56 additions and 19 deletions

View File

@ -1,3 +1,11 @@
2009-09-07 Martin Jambor <mjambor@suse.cz>
PR middle-end/41282
* tree-sra.c (create_artificial_child_access): Return NULL if
build_ref_for_offset fails.
(propagate_subacesses_accross_link): Allow build_ref_for_offset
and create_artificial_child_access to fail.
2009-09-06 Dmitry Gorbachev <d.g.gorbachev@gmail.com>
PR c++/41214

View File

@ -1,3 +1,8 @@
2009-09-07 Martin Jambor <mjambor@suse.cz>
PR middle-end/41282
* gcc.c-torture/compile/pr41282.c: New test.
2009-09-07 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/41197

View File

@ -0,0 +1,20 @@
struct S
{
unsigned int iu;
};
union U
{
struct S s;
signed int is;
};
extern signed int bar ();
struct S foo (void)
{
union U u;
u.is = bar ();
return u.s;
}

View File

@ -1518,9 +1518,9 @@ child_would_conflict_in_lacc (struct access *lacc, HOST_WIDE_INT norm_offset,
/* Create a new child access of PARENT, with all properties just like MODEL
except for its offset and with its grp_write false and grp_read true.
Return the new access. Note that this access is created long after all
splicing and sorting, it's not located in any access vector and is
automatically a representative of its group. */
Return the new access or NULL if it cannot be created. Note that this access
is created long after all splicing and sorting, it's not located in any
access vector and is automatically a representative of its group. */
static struct access *
create_artificial_child_access (struct access *parent, struct access *model,
@ -1528,22 +1528,23 @@ create_artificial_child_access (struct access *parent, struct access *model,
{
struct access *access;
struct access **child;
bool ok;
tree expr = parent->base;;
gcc_assert (!model->grp_unscalarizable_region);
if (!build_ref_for_offset (&expr, TREE_TYPE (expr), new_offset,
model->type, false))
return NULL;
access = (struct access *) pool_alloc (access_pool);
memset (access, 0, sizeof (struct access));
access->base = parent->base;
access->expr = expr;
access->offset = new_offset;
access->size = model->size;
access->type = model->type;
access->grp_write = true;
access->grp_read = false;
access->expr = access->base;
ok = build_ref_for_offset (&access->expr, TREE_TYPE (access->expr),
new_offset, access->type, false);
gcc_assert (ok);
child = &parent->first_child;
while (*child && (*child)->offset < new_offset)
@ -1558,7 +1559,7 @@ create_artificial_child_access (struct access *parent, struct access *model,
/* Propagate all subaccesses of RACC across an assignment link to LACC. Return
true if any new subaccess was created. Additionally, if RACC is a scalar
access but LACC is not, change the type of the latter. */
access but LACC is not, change the type of the latter, if possible. */
static bool
propagate_subacesses_accross_link (struct access *lacc, struct access *racc)
@ -1575,13 +1576,14 @@ propagate_subacesses_accross_link (struct access *lacc, struct access *racc)
if (!lacc->first_child && !racc->first_child
&& is_gimple_reg_type (racc->type))
{
bool ok;
tree t = lacc->base;
lacc->expr = lacc->base;
ok = build_ref_for_offset (&lacc->expr, TREE_TYPE (lacc->expr),
lacc->offset, racc->type, false);
gcc_assert (ok);
lacc->type = racc->type;
if (build_ref_for_offset (&t, TREE_TYPE (t), lacc->offset, racc->type,
false))
{
lacc->expr = t;
lacc->type = racc->type;
}
return false;
}
@ -1615,10 +1617,12 @@ propagate_subacesses_accross_link (struct access *lacc, struct access *racc)
rchild->grp_hint = 1;
new_acc = create_artificial_child_access (lacc, rchild, norm_offset);
if (racc->first_child)
propagate_subacesses_accross_link (new_acc, rchild);
ret = true;
if (new_acc)
{
ret = true;
if (racc->first_child)
propagate_subacesses_accross_link (new_acc, rchild);
}
}
return ret;