re PR middle-end/54146 (Very slow compile with attribute((flatten)))
authorRichard Guenther <rguenther@suse.de>
Thu, 16 Aug 2012 14:27:51 +0000 (14:27 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 16 Aug 2012 14:27:51 +0000 (14:27 +0000)
2012-08-16  Richard Guenther  <rguenther@suse.de>

PR middle-end/54146
* tree-ssa-loop-niter.c (find_loop_niter_by_eval): Free the
exit vector.
* ipa-pure-const.c (analyze_function): Use FOR_EACH_LOOP_BREAK.
* cfgloop.h (FOR_EACH_LOOP_BREAK): Fix.
* tree-ssa-structalias.c (handle_lhs_call): Properly free rhsc.
* tree-into-ssa.c (get_ssa_name_ann): Allocate info only when
needed.
* tree-ssa-loop-im.c (analyze_memory_references): Adjust.
(tree_ssa_lim_finalize): Free all mem_refs.
* tree-ssa-sccvn.c (extract_and_process_scc_for_name): Free
scc when bailing out.
* modulo-sched.c (sms_schedule): Use FOR_EACH_LOOP_BREAK.
* ira-build.c (loop_with_complex_edge_p): Free loop exit vector.
* graphite-sese-to-poly.c (scop_ivs_can_be_represented): Use
FOR_EACH_LOOP_BREAK.

From-SVN: r190445

gcc/ChangeLog
gcc/cfgloop.h
gcc/graphite-sese-to-poly.c
gcc/ipa-pure-const.c
gcc/ira-build.c
gcc/modulo-sched.c
gcc/tree-into-ssa.c
gcc/tree-ssa-loop-im.c
gcc/tree-ssa-loop-niter.c
gcc/tree-ssa-sccvn.c
gcc/tree-ssa-structalias.c

index dff3e9abc8083c3975c6e3e734c819fb1f869266..266710f83234659050587cff804dd774025b6885 100644 (file)
@@ -1,3 +1,22 @@
+2012-08-16  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/54146
+       * tree-ssa-loop-niter.c (find_loop_niter_by_eval): Free the
+       exit vector.
+       * ipa-pure-const.c (analyze_function): Use FOR_EACH_LOOP_BREAK.
+       * cfgloop.h (FOR_EACH_LOOP_BREAK): Fix.
+       * tree-ssa-structalias.c (handle_lhs_call): Properly free rhsc.
+       * tree-into-ssa.c (get_ssa_name_ann): Allocate info only when
+       needed.
+       * tree-ssa-loop-im.c (analyze_memory_references): Adjust.
+       (tree_ssa_lim_finalize): Free all mem_refs.
+       * tree-ssa-sccvn.c (extract_and_process_scc_for_name): Free
+       scc when bailing out.
+       * modulo-sched.c (sms_schedule): Use FOR_EACH_LOOP_BREAK.
+       * ira-build.c (loop_with_complex_edge_p): Free loop exit vector.
+       * graphite-sese-to-poly.c (scop_ivs_can_be_represented): Use
+       FOR_EACH_LOOP_BREAK.
+
 2012-08-16  Diego Novillo  <dnovillo@google.com>
 
        PR bootstrap/54281
index 5c03390ab253d9d19859589048ac90444e1cac2b..ed6ef3d5c87e09de2c000ba869c1cb094d864229 100644 (file)
@@ -649,7 +649,7 @@ fel_init (loop_iterator *li, loop_p *loop, unsigned flags)
 
 #define FOR_EACH_LOOP_BREAK(LI) \
   { \
-    VEC_free (int, heap, (LI)->to_visit); \
+    VEC_free (int, heap, (LI).to_visit); \
     break; \
   }
 
index f53be25800464c8536b02bcc99d831c8f00d9889..ded38f5af1a1aea7a244827abcf162cbbb6302f1 100644 (file)
@@ -3122,6 +3122,7 @@ scop_ivs_can_be_represented (scop_p scop)
   loop_iterator li;
   loop_p loop;
   gimple_stmt_iterator psi;
+  bool result = true;
 
   FOR_EACH_LOOP (li, loop, 0)
     {
@@ -3137,11 +3138,16 @@ scop_ivs_can_be_represented (scop_p scop)
 
          if (TYPE_UNSIGNED (type)
              && TYPE_PRECISION (type) >= TYPE_PRECISION (long_long_integer_type_node))
-           return false;
+           {
+             result = false;
+             break;
+           }
        }
+      if (!result)
+       FOR_EACH_LOOP_BREAK (li);
     }
 
-  return true;
+  return result;
 }
 
 /* Builds the polyhedral representation for a SESE region.  */
index 905ae3bece5191ee08e686953d480009cc7eb376..b6810a89bcb73e8ef06a8801452c5816abf08f7a 100644 (file)
@@ -802,7 +802,7 @@ end:
                    if (dump_file)
                      fprintf (dump_file, "    can not prove finiteness of loop %i\n", loop->num);
                    l->looping =true;
-                   break;
+                   FOR_EACH_LOOP_BREAK (li);
                  }
              scev_finalize ();
            }
index d0d4495e07a8593db8ef772839d06357194b887f..dba1d467ad7d8db35639e6b620e0d63a12d49f80 100644 (file)
@@ -1846,15 +1846,21 @@ loop_with_complex_edge_p (struct loop *loop)
   edge_iterator ei;
   edge e;
   VEC (edge, heap) *edges;
+  bool res;
 
   FOR_EACH_EDGE (e, ei, loop->header->preds)
     if (e->flags & EDGE_EH)
       return true;
   edges = get_loop_exit_edges (loop);
+  res = false;
   FOR_EACH_VEC_ELT (edge, edges, i, e)
     if (e->flags & EDGE_COMPLEX)
-      return true;
-  return false;
+      {
+       res = true;
+       break;
+      }
+  VEC_free (edge, heap, edges);
+  return res;
 }
 #endif
 
index 673055eacc5f0e184362064df21894f0147db393..59f8978be73f0bab3c9e1db9da8200beb7872ec1 100644 (file)
@@ -1413,7 +1413,7 @@ sms_schedule (void)
           if (dump_file)
             fprintf (dump_file, "SMS reached max limit... \n");
 
-          break;
+         FOR_EACH_LOOP_BREAK (li);
         }
 
       if (dump_file)
index 073a4881a6284e7f6b331bd7747e8a92163f1206..a3c31799d02497a3425d7b4c21e5b94c98e5195c 100644 (file)
@@ -312,22 +312,21 @@ get_ssa_name_ann (tree name)
   unsigned len = VEC_length (ssa_name_info_p, info_for_ssa_name);
   struct ssa_name_info *info;
 
+  /* Re-allocate the vector at most once per update/into-SSA.  */
   if (ver >= len)
-    {
-      unsigned old_len = VEC_length (ssa_name_info_p, info_for_ssa_name);
-      unsigned new_len = num_ssa_names;
+    VEC_safe_grow_cleared (ssa_name_info_p, heap,
+                          info_for_ssa_name, num_ssa_names);
 
-      VEC_reserve (ssa_name_info_p, heap, info_for_ssa_name,
-                  new_len - old_len);
-      while (len++ < new_len)
-       {
-         struct ssa_name_info *info = XCNEW (struct ssa_name_info);
-         info->age = current_info_for_ssa_name_age;
-         VEC_quick_push (ssa_name_info_p, info_for_ssa_name, info);
-       }
+  /* But allocate infos lazily.  */
+  info = VEC_index (ssa_name_info_p, info_for_ssa_name, ver);
+  if (!info)
+    {
+      info = XCNEW (struct ssa_name_info);
+      info->age = current_info_for_ssa_name_age;
+      info->info.need_phi_state = NEED_PHI_STATE_UNKNOWN;
+      VEC_replace (ssa_name_info_p, info_for_ssa_name, ver, info);
     }
 
-  info = VEC_index (ssa_name_info_p, info_for_ssa_name, ver);
   if (info->age < current_info_for_ssa_name_age)
     {
       info->age = current_info_for_ssa_name_age;
index e40a6e4098dedc2de18d4fce3590ecc5b1332b2e..caffe8250f19c9047a8867f43606834a0e66f691 100644 (file)
@@ -1486,9 +1486,8 @@ free_mem_ref_locs (mem_ref_locs_p accs)
 /* A function to free the mem_ref object OBJ.  */
 
 static void
-memref_free (void *obj)
+memref_free (struct mem_ref *mem)
 {
-  struct mem_ref *const mem = (struct mem_ref *) obj;
   unsigned i;
   mem_ref_locs_p accs;
 
@@ -1728,8 +1727,7 @@ analyze_memory_references (void)
   unsigned i;
   bitmap empty;
 
-  memory_accesses.refs
-         = htab_create (100, memref_hash, memref_eq, memref_free);
+  memory_accesses.refs = htab_create (100, memref_hash, memref_eq, NULL);
   memory_accesses.refs_list = NULL;
   memory_accesses.refs_in_loop = VEC_alloc (bitmap, heap,
                                            number_of_loops ());
@@ -2617,6 +2615,7 @@ tree_ssa_lim_finalize (void)
   basic_block bb;
   unsigned i;
   bitmap b;
+  mem_ref_p ref;
 
   free_aux_for_edges ();
 
@@ -2625,9 +2624,12 @@ tree_ssa_lim_finalize (void)
 
   pointer_map_destroy (lim_aux_data_map);
 
-  VEC_free (mem_ref_p, heap, memory_accesses.refs_list);
   htab_delete (memory_accesses.refs);
 
+  FOR_EACH_VEC_ELT (mem_ref_p, memory_accesses.refs_list, i, ref)
+    memref_free (ref);
+  VEC_free (mem_ref_p, heap, memory_accesses.refs_list);
+
   FOR_EACH_VEC_ELT (bitmap, memory_accesses.refs_in_loop, i, b)
     BITMAP_FREE (b);
   VEC_free (bitmap, heap, memory_accesses.refs_in_loop);
index 4c67c26faf3eb67b618ef065992a72b4d91cab07..38b47b0b656a6cb39f043909ad400fe9b47a2bc9 100644 (file)
@@ -2286,7 +2286,10 @@ find_loop_niter_by_eval (struct loop *loop, edge *exit)
   /* Loops with multiple exits are expensive to handle and less important.  */
   if (!flag_expensive_optimizations
       && VEC_length (edge, exits) > 1)
-    return chrec_dont_know;
+    {
+      VEC_free (edge, heap, exits);
+      return chrec_dont_know;
+    }
 
   FOR_EACH_VEC_ELT (edge, exits, i, ex)
     {
index 5756df330df224735702dfc49667017097aca9a7..216d3f647e9cc7f954b619094e86d56dff4ef728 100644 (file)
@@ -3665,6 +3665,8 @@ extract_and_process_scc_for_name (tree name)
        fprintf (dump_file, "WARNING: Giving up with SCCVN due to "
                 "SCC size %u exceeding %u\n", VEC_length (tree, scc),
                 (unsigned)PARAM_VALUE (PARAM_SCCVN_MAX_SCC_SIZE));
+
+      VEC_free (tree, heap, scc);
       return false;
     }
 
index 162502edcf73913c825f46fff4607d96be045a8d..609ee2c56b3a5d06aaac59878e163ecccc623743 100644 (file)
@@ -3868,9 +3868,11 @@ handle_lhs_call (gimple stmt, tree lhs, int flags, VEC(ce_s, heap) *rhsc,
       tmpc.offset = 0;
       tmpc.type = ADDRESSOF;
       VEC_safe_push (ce_s, heap, rhsc, &tmpc);
+      process_all_all_constraints (lhsc, rhsc);
+      VEC_free (ce_s, heap, rhsc);
     }
-
-  process_all_all_constraints (lhsc, rhsc);
+  else
+    process_all_all_constraints (lhsc, rhsc);
 
   VEC_free (ce_s, heap, lhsc);
 }