]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/41282 (Revision 151394 failed to compile mplayer)
authorMartin Jambor <mjambor@suse.cz>
Mon, 7 Sep 2009 17:08:12 +0000 (19:08 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 7 Sep 2009 17:08:12 +0000 (19:08 +0200)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr41282.c [new file with mode: 0644]
gcc/tree-sra.c

index 7ad76cca43baf2d37d18c243c2a4465ce1115622..5329be5c577549f1707a88fff7fefccf34812b15 100644 (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
index 41a90890145bfa6d41f80a084e5e1dff9477c224..166d03dd9bc012415cb33be33f61493872390491 100644 (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
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr41282.c b/gcc/testsuite/gcc.c-torture/compile/pr41282.c
new file mode 100644 (file)
index 0000000..3a0f02d
--- /dev/null
@@ -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;
+}
index a801839043b9d5eda701a2022d40717b366a0e43..431c456e2060b3bbf5f94530d8814dd0608bb836 100644 (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;