aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-08-16 14:27:51 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-08-16 14:27:51 +0000
commitf5843d08b462559af731ed7bd40f2d8e7a1b47e1 (patch)
tree376f51f58149bf3a9c71811ae304381e607e6ff2
parent0c8036f70a641b1821290e0c7f35c5a911a4a77a (diff)
downloadgcc-f5843d08b462559af731ed7bd40f2d8e7a1b47e1.zip
gcc-f5843d08b462559af731ed7bd40f2d8e7a1b47e1.tar.gz
gcc-f5843d08b462559af731ed7bd40f2d8e7a1b47e1.tar.bz2
re PR middle-end/54146 (Very slow compile with attribute((flatten)))
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
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/cfgloop.h2
-rw-r--r--gcc/graphite-sese-to-poly.c10
-rw-r--r--gcc/ipa-pure-const.c2
-rw-r--r--gcc/ira-build.c10
-rw-r--r--gcc/modulo-sched.c2
-rw-r--r--gcc/tree-into-ssa.c23
-rw-r--r--gcc/tree-ssa-loop-im.c12
-rw-r--r--gcc/tree-ssa-loop-niter.c5
-rw-r--r--gcc/tree-ssa-sccvn.c2
-rw-r--r--gcc/tree-ssa-structalias.c6
11 files changed, 66 insertions, 27 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dff3e9a..266710f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h
index 5c03390..ed6ef3d 100644
--- a/gcc/cfgloop.h
+++ b/gcc/cfgloop.h
@@ -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; \
}
diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c
index f53be25..ded38f5 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -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. */
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index 905ae3b..b6810a8 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -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 ();
}
diff --git a/gcc/ira-build.c b/gcc/ira-build.c
index d0d4495..dba1d46 100644
--- a/gcc/ira-build.c
+++ b/gcc/ira-build.c
@@ -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
diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c
index 673055e..59f8978 100644
--- a/gcc/modulo-sched.c
+++ b/gcc/modulo-sched.c
@@ -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)
diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c
index 073a488..a3c3179 100644
--- a/gcc/tree-into-ssa.c
+++ b/gcc/tree-into-ssa.c
@@ -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;
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index e40a6e4..caffe82 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -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);
diff --git a/gcc/tree-ssa-loop-niter.c b/gcc/tree-ssa-loop-niter.c
index 4c67c26..38b47b0 100644
--- a/gcc/tree-ssa-loop-niter.c
+++ b/gcc/tree-ssa-loop-niter.c
@@ -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)
{
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 5756df3..216d3f6 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -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;
}
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 162502e..609ee2c 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -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);
}