Hi!

take_address_of ICEs if an object has NULL DECL_NAME, the first hunk fixes
that.  But, there is no point creating extra runtime code for clobbers, like
computing the address of the object, passing it from the serial code to the
outlined parallelized routine and then just have a clobber there (not to
mention that in 4.8 indirect clobbers aren't even allowed).  So the patch
also just kills clobbers from the parallelized regions.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.8?

2013-08-18  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/58006
        * tree-parloops.c (take_address_of): Don't ICE if get_name
        returns NULL.
        (eliminate_local_variables_stmt): Remove clobber stmts.

        * g++.dg/opt/pr58006.C: New test.

--- gcc/tree-parloops.c.jj      2013-05-06 17:08:48.000000000 +0200
+++ gcc/tree-parloops.c 2013-08-16 16:35:54.454310095 +0200
@@ -494,9 +494,12 @@ take_address_of (tree obj, tree type, ed
       if (gsi == NULL)
        return NULL;
       addr = TREE_OPERAND (*var_p, 0);
-      name = make_temp_ssa_name (TREE_TYPE (addr), NULL,
-                                get_name (TREE_OPERAND
-                                          (TREE_OPERAND (*var_p, 0), 0)));
+      const char *obj_name
+       = get_name (TREE_OPERAND (TREE_OPERAND (*var_p, 0), 0));
+      if (obj_name)
+       name = make_temp_ssa_name (TREE_TYPE (addr), NULL, obj_name);
+      else
+       name = make_ssa_name (TREE_TYPE (addr), NULL);
       stmt = gimple_build_assign (name, addr);
       gsi_insert_on_edge_immediate (entry, stmt);
 
@@ -694,6 +697,12 @@ eliminate_local_variables_stmt (edge ent
          dta.changed = true;
        }
     }
+  else if (gimple_clobber_p (stmt))
+    {
+      stmt = gimple_build_nop ();
+      gsi_replace (gsi, stmt, false);
+      dta.changed = true;
+    }
   else
     {
       dta.gsi = gsi;
--- gcc/testsuite/g++.dg/opt/pr58006.C.jj       2013-08-16 16:55:49.398132255 
+0200
+++ gcc/testsuite/g++.dg/opt/pr58006.C  2013-08-16 16:54:13.000000000 +0200
@@ -0,0 +1,22 @@
+// PR tree-optimization/58006
+// { dg-do compile }
+// { dg-require-effective-target pthread }
+// { dg-options "-Ofast -ftree-parallelize-loops=2" }
+
+extern "C" float sqrtf (float);
+
+struct S
+{
+  float i, j;
+  float foo () const { return sqrtf (i * i + j * j); }
+  S () : i (1), j (1) {}
+};
+
+void
+bar (int a, int b)
+{
+  int i;
+  float f;
+  for (i = a; i < b; i++)
+    f = S ().foo ();
+}

        Jakub

Reply via email to