From 4a50e99c6531d1d413e75f19c802ba5fd6ab103a Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Mon, 7 Sep 2009 19:08:12 +0200 Subject: [PATCH] re PR middle-end/41282 (Revision 151394 failed to compile mplayer) 2009-09-07 Martin Jambor 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 --- gcc/ChangeLog | 8 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr41282.c | 20 +++++++++ gcc/tree-sra.c | 42 ++++++++++--------- 4 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr41282.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ad76cca43ba..5329be5c5775 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2009-09-07 Martin Jambor + + 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 PR c++/41214 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 41a90890145b..166d03dd9bc0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-09-07 Martin Jambor + + PR middle-end/41282 + * gcc.c-torture/compile/pr41282.c: New test. + 2009-09-07 Thomas Koenig PR fortran/41197 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr41282.c b/gcc/testsuite/gcc.c-torture/compile/pr41282.c new file mode 100644 index 000000000000..3a0f02d63ab1 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr41282.c @@ -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; +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index a801839043b9..431c456e2060 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -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; -- 2.47.2