Commit 8c5fdaae by Vladimir Makarov

[multiple changes]

2011-05-24  Vladimir Makarov  <vmakarov@redhat.com>

	PR rtl-optimization/48633
	* ira-build.c (loop_with_eh_edge_p): New function.
	(mark_loops_for_removal): Use it.

2011-05-24  Michael Matz  <matz@gcc.gnu.org>

	PR rtl-optimization/48633
	* g++.dg/pr48633.C: New test.

From-SVN: r174124
parent 113a5be6
2011-05-13 Vladimir Makarov <vmakarov@redhat.com> 2011-05-24 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/48633
* ira-build.c (loop_with_eh_edge_p): New function.
(mark_loops_for_removal): Use it.
2011-05-24 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/48971 PR rtl-optimization/48971
* ira.c (setup_pressure_classes): Don't check register move cost * ira.c (setup_pressure_classes): Don't check register move cost
......
...@@ -1806,6 +1806,25 @@ low_pressure_loop_node_p (ira_loop_tree_node_t node) ...@@ -1806,6 +1806,25 @@ low_pressure_loop_node_p (ira_loop_tree_node_t node)
return true; return true;
} }
/* Return TRUE if LOOP has a EH enter or exit edge. */
static bool
loop_with_eh_edge_p (struct loop *loop)
{
int i;
edge_iterator ei;
edge e;
VEC (edge, heap) *edges;
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->flags & EDGE_EH)
return true;
edges = get_loop_exit_edges (loop);
FOR_EACH_VEC_ELT (edge, edges, i, e)
if (e->flags & EDGE_EH)
return true;
return false;
}
/* Sort loops for marking them for removal. We put already marked /* Sort loops for marking them for removal. We put already marked
loops first, then less frequent loops next, and then outer loops loops first, then less frequent loops next, and then outer loops
next. */ next. */
...@@ -1829,14 +1848,18 @@ loop_compare_func (const void *v1p, const void *v2p) ...@@ -1829,14 +1848,18 @@ loop_compare_func (const void *v1p, const void *v2p)
return l1->loop->num - l2->loop->num; return l1->loop->num - l2->loop->num;
} }
/* Mark loops which should be removed from regional allocation. We /* Mark loops which should be removed from regional allocation. We
remove a loop with low register pressure inside another loop with remove a loop with low register pressure inside another loop with
register pressure. In this case a separate allocation of the loop register pressure. In this case a separate allocation of the loop
hardly helps (for irregular register file architecture it could hardly helps (for irregular register file architecture it could
help by choosing a better hard register in the loop but we prefer help by choosing a better hard register in the loop but we prefer
faster allocation even in this case). We also remove cheap loops faster allocation even in this case). We also remove cheap loops
if there are more than IRA_MAX_LOOPS_NUM of them. */ if there are more than IRA_MAX_LOOPS_NUM of them. Loop with EH
exit or enter edges are removed too because the allocation might
require put pseudo moves on the EH edges (we could still do this
for pseudos with caller saved hard registers in some cases but it
is impossible to say here or during top-down allocation pass what
hard register the pseudos get finally). */
static void static void
mark_loops_for_removal (void) mark_loops_for_removal (void)
{ {
...@@ -1859,8 +1882,9 @@ mark_loops_for_removal (void) ...@@ -1859,8 +1882,9 @@ mark_loops_for_removal (void)
} }
sorted_loops[n++] = &ira_loop_nodes[i]; sorted_loops[n++] = &ira_loop_nodes[i];
ira_loop_nodes[i].to_remove_p ira_loop_nodes[i].to_remove_p
= (low_pressure_loop_node_p (ira_loop_nodes[i].parent) = ((low_pressure_loop_node_p (ira_loop_nodes[i].parent)
&& low_pressure_loop_node_p (&ira_loop_nodes[i])); && low_pressure_loop_node_p (&ira_loop_nodes[i]))
|| loop_with_eh_edge_p (ira_loop_nodes[i].loop));
} }
qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func); qsort (sorted_loops, n, sizeof (ira_loop_tree_node_t), loop_compare_func);
for (i = 0; n - i + 1 > IRA_MAX_LOOPS_NUM; i++) for (i = 0; n - i + 1 > IRA_MAX_LOOPS_NUM; i++)
......
2011-05-24 Michael Matz <matz@gcc.gnu.org>
PR rtl-optimization/48633
* g++.dg/pr48633.C: New test.
2011-05-24 Uros Bizjak <ubizjak@gmail.com> 2011-05-24 Uros Bizjak <ubizjak@gmail.com>
PR target/49133 PR target/49133
......
/* { dg-do compile} */
/* { dg-options "-O2 -fira-region=all -fnon-call-exceptions" } */
extern long double getme (void);
extern void useme (long double);
struct Frame {
long double tmp;
};
void bugme (int n, long double ld1, long double ld2, long double ld3,
long double ld4, long double ld5)
{
Frame f;
int i;
f.tmp = getme();
try {
for (i = 0; i < n; i++)
{
f.tmp += 1.0;
}
} catch (...) {
f.tmp += 1.0;
}
ld1++;
ld2++;
ld3++;
ld4++;
ld5++;
useme (f.tmp);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment