re PR tree-optimization/56294 (BOOT_CFLAGS='-O2 -g -fno-ipa-sra' leads to bootstrap...
authorMartin Jambor <mjambor@suse.cz>
Thu, 28 Feb 2013 12:43:33 +0000 (13:43 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Thu, 28 Feb 2013 12:43:33 +0000 (13:43 +0100)
2013-02-28  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/56294
* tree-sra.c (analyze_access_subtree): Create replacement declarations.
Adjust dumping.
(get_access_replacement): Do not call create_access_replacement.
Assert a replacement exists.
(get_repl_default_def_ssa_name): Create the replacement declaration
itself.

testsuite/
* g++.dg/debug/pr56294.C: New test.

From-SVN: r196340

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/pr56294.C [new file with mode: 0644]
gcc/tree-sra.c

index 3fa3943..55ab6ed 100644 (file)
@@ -1,3 +1,13 @@
+2013-02-28  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/56294
+       * tree-sra.c (analyze_access_subtree): Create replacement declarations.
+       Adjust dumping.
+       (get_access_replacement): Do not call create_access_replacement.
+       Assert a replacement exists.
+       (get_repl_default_def_ssa_name): Create the replacement declaration
+       itself.
+
 2013-02-28  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        * config/arm/arm.c (arm_output_mi_thunk): Call final_start_function and
index 9db519d..08399b9 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-28  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/56294
+       * g++.dg/debug/pr56294.C: New test.
+
 2013-02-28  Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
        * g++.old-deja/g++.pt/ptrmem6.C(main): Add xfail aarch64*-*-*.
diff --git a/gcc/testsuite/g++.dg/debug/pr56294.C b/gcc/testsuite/g++.dg/debug/pr56294.C
new file mode 100644 (file)
index 0000000..204c78e
--- /dev/null
@@ -0,0 +1,30 @@
+// { dg-do compile }
+// { dg-options "-fno-ipa-sra -fcompare-debug" }
+
+struct comp_cost { int cost; unsigned complexity; };
+struct cost_pair { struct iv_cand *cand; };
+struct iv_use { unsigned n_map_members; cost_pair *cost_map; };
+struct iv_cand { unsigned id; };
+
+unsigned gu;
+
+void
+bar (comp_cost, comp_cost)
+{
+}
+
+void
+foo (iv_use *use, iv_cand *cand)
+{
+  unsigned i, s = cand->id & (use->n_map_members - 1);
+  for (i = 0; i < s; i++)
+    if (use->cost_map[i].cand)
+      goto found;
+found:
+  use->cost_map[i].cand = cand;
+  comp_cost elim_cost, express_cost, bound_cost;
+  bar (elim_cost, express_cost);
+  gu = express_cost.complexity;
+}
+
+
index 234dde2..5d55d73 100644 (file)
@@ -2000,8 +2000,7 @@ create_access_replacement (struct access *access)
 static inline tree
 get_access_replacement (struct access *access)
 {
-  if (!access->replacement_decl)
-    access->replacement_decl = create_access_replacement (access);
+  gcc_checking_assert (access->replacement_decl);
   return access->replacement_decl;
 }
 
@@ -2157,7 +2156,6 @@ analyze_access_subtree (struct access *root, struct access *parent,
          || ((root->grp_scalar_read || root->grp_assignment_read)
              && (root->grp_scalar_write || root->grp_assignment_write))))
     {
-      bool new_integer_type;
       /* Always create access replacements that cover the whole access.
          For integral types this means the precision has to match.
         Avoid assumptions based on the integral type kind, too.  */
@@ -2176,22 +2174,19 @@ analyze_access_subtree (struct access *root, struct access *parent,
          root->expr = build_ref_for_offset (UNKNOWN_LOCATION,
                                             root->base, root->offset,
                                             root->type, NULL, false);
-         new_integer_type = true;
-       }
-      else
-       new_integer_type = false;
 
-      if (dump_file && (dump_flags & TDF_DETAILS))
-       {
-         fprintf (dump_file, "Marking ");
-         print_generic_expr (dump_file, root->base, 0);
-         fprintf (dump_file, " offset: %u, size: %u ",
-                  (unsigned) root->offset, (unsigned) root->size);
-         fprintf (dump_file, " to be replaced%s.\n",
-                  new_integer_type ? " with an integer": "");
+         if (dump_file && (dump_flags & TDF_DETAILS))
+           {
+             fprintf (dump_file, "Changing the type of a replacement for ");
+             print_generic_expr (dump_file, root->base, 0);
+             fprintf (dump_file, " offset: %u, size: %u ",
+                      (unsigned) root->offset, (unsigned) root->size);
+             fprintf (dump_file, " to an integer.\n");
+           }
        }
 
       root->grp_to_be_replaced = 1;
+      root->replacement_decl = create_access_replacement (root);
       sth_created = true;
       hole = false;
     }
@@ -2209,15 +2204,7 @@ analyze_access_subtree (struct access *root, struct access *parent,
          if (MAY_HAVE_DEBUG_STMTS)
            {
              root->grp_to_be_debug_replaced = 1;
-             if (dump_file && (dump_flags & TDF_DETAILS))
-               {
-                 fprintf (dump_file, "Marking ");
-                 print_generic_expr (dump_file, root->base, 0);
-                 fprintf (dump_file, " offset: %u, size: %u ",
-                          (unsigned) root->offset, (unsigned) root->size);
-                 fprintf (dump_file, " to be replaced with debug "
-                          "statements.\n");
-               }
+             root->replacement_decl = create_access_replacement (root);
            }
        }
 
@@ -2973,7 +2960,11 @@ sra_modify_constructor_assign (gimple *stmt, gimple_stmt_iterator *gsi)
 static tree
 get_repl_default_def_ssa_name (struct access *racc)
 {
-  return get_or_create_ssa_default_def (cfun, get_access_replacement (racc));
+  gcc_checking_assert (!racc->grp_to_be_replaced &&
+                      !racc->grp_to_be_debug_replaced);
+  if (!racc->replacement_decl)
+    racc->replacement_decl = create_access_replacement (racc);
+  return get_or_create_ssa_default_def (cfun, racc->replacement_decl);
 }
 
 /* Return true if REF has a COMPONENT_REF with a bit-field field declaration