re PR libgomp/66714 (ICE in loc_list_from_tree with -g)
authorCesar Philippidis <cesar@codesourcery.com>
Fri, 24 Jul 2015 14:38:43 +0000 (07:38 -0700)
committerCesar Philippidis <cesar@gcc.gnu.org>
Fri, 24 Jul 2015 14:38:43 +0000 (07:38 -0700)
PR 66714

gcc/
* tree-cfg.c (struct replace_decls_d): New struct.
(replace_block_vars_by_duplicates_1): New function.
(replace_block_vars_by_duplicates): Use it to replace the decls
in the value exprs by duplicates.

libgomp/
* testsuite/libgomp.c/pr66714.c: New test.

From-SVN: r226160

gcc/ChangeLog
gcc/tree-cfg.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/pr66714.c [new file with mode: 0644]

index dac9e4a3afd9d8499e4817233b55f0790716f179..87375082ca0d5d5076b7fe484d28337d4664e5e4 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-24  Cesar Philippidis  <cesar@codesourcery.com>
+
+       PR 66714
+       * tree-cfg.c (struct replace_decls_d): New struct.
+       (replace_block_vars_by_duplicates_1): New function.
+       (replace_block_vars_by_duplicates): Use it to replace the decls
+       in the value exprs by duplicates.
+
 2015-07-24  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        * config/aarch64/aarch64-elf-raw.h (LINK_SPEC): Handle -h, -static,
index 66f999e3c42d8d609dfc04dd36285847e69ccb9f..e26454a617d878bae2955bf2fee3d503afe9e042 100644 (file)
@@ -71,6 +71,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "omp-low.h"
 #include "tree-cfgcleanup.h"
 #include "wide-int-print.h"
+#include "gimplify.h"
 
 /* This file contains functions for building the Control Flow Graph (CFG)
    for a function tree.  */
@@ -109,6 +110,13 @@ struct cfg_stats_d
 
 static struct cfg_stats_d cfg_stats;
 
+/* Data to pass to replace_block_vars_by_duplicates_1.  */
+struct replace_decls_d
+{
+  hash_map<tree, tree> *vars_map;
+  tree to_context;
+};
+
 /* Hash table to store last discriminator assigned for each locus.  */
 struct locus_discrim_map
 {
@@ -6853,6 +6861,31 @@ new_label_mapper (tree decl, void *data)
   return m->to;
 }
 
+/* Tree walker to replace the decls used inside value expressions by
+   duplicates.  */
+
+static tree
+replace_block_vars_by_duplicates_1 (tree *tp, int *walk_subtrees, void *data)
+{
+  struct replace_decls_d *rd = (struct replace_decls_d *)data;
+
+  switch (TREE_CODE (*tp))
+    {
+    case VAR_DECL:
+    case PARM_DECL:
+    case RESULT_DECL:
+      replace_by_duplicate_decl (tp, rd->vars_map, rd->to_context);
+      break;
+    default:
+      break;
+    }
+
+  if (IS_TYPE_OR_DECL_P (*tp))
+    *walk_subtrees = false;
+
+  return NULL;
+}
+
 /* Change DECL_CONTEXT of all BLOCK_VARS in block, including
    subblocks.  */
 
@@ -6872,7 +6905,11 @@ replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map,
        {
          if (TREE_CODE (*tp) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (*tp))
            {
-             SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (*tp));
+             tree x = DECL_VALUE_EXPR (*tp);
+             struct replace_decls_d rd = { vars_map, to_context };
+             unshare_expr (x);
+             walk_tree (&x, replace_block_vars_by_duplicates_1, &rd, NULL);
+             SET_DECL_VALUE_EXPR (t, x);
              DECL_HAS_VALUE_EXPR_P (t) = 1;
            }
          DECL_CHAIN (t) = DECL_CHAIN (*tp);
index d8d37cf7329261e62a60417c840f2a99c0cb9ff8..d2189928577b675bb3e3baf9572ff7c5d8cdd9a1 100644 (file)
@@ -1,3 +1,7 @@
+2015-07-24  Cesar Philippidis  <cesar@codesourcery.com>
+
+       * testsuite/libgomp.c/pr66714.c: New test.
+
 2015-07-22  Maxim Blumenthal  <maxim.blumenthal@intel.com>
 
        PR libgomp/66950
diff --git a/libgomp/testsuite/libgomp.c/pr66714.c b/libgomp/testsuite/libgomp.c/pr66714.c
new file mode 100644 (file)
index 0000000..c9af4a9
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do "compile" } */
+/* { dg-additional-options "--param ggc-min-expand=0" } */
+/* { dg-additional-options "--param ggc-min-heapsize=0" } */
+/* { dg-additional-options "-g" } */
+
+/* Minimized from on target-2.c.  */
+
+void
+fn3 (int x)
+{
+  double b[3 * x];
+  int i;
+#pragma omp target
+#pragma omp parallel for
+  for (i = 0; i < x; i++)
+    b[i] += 1;
+}