Hi Vladimir,
I am studying IRA in my offer hours because it is marvellous and very
educative.
Did you get a chance to look at the below patch.
The elements of allocno_hard_regs_subnode_index are setup in function
setup_allocno_hard_regs_subnode_index where elements representing subnodes of a
node
are nonegative. I think we can avoid involving the parent itself into the loop
below
because when the loop invariant i == 0, allocno_hard_regs_nodes[i +
node_preorder_num]
will be current node, I guess we are not interested in computing left conflict
subnodes
size of current node's parent in current function context.
Thanks and Regards
Zhouyi
---------- Forwarded message ----------
From: Zhouyi Zhou <[email protected]>
Date: Thu, Mar 12, 2015 at 9:34 AM
Subject: [PATCH V2] IRA: Speed up setup_left_conflict_sizes_p
To: [email protected], [email protected]
Cc: Zhouyi Zhou <[email protected]>, Zhouyi Zhou <[email protected]>
From: Zhouyi Zhou <[email protected]>
In function setup_left_conflict_sizes_p, left conflict subnodes sizes
are computed in a bottom-to-up fashion through the regnodes foreast.
Speed up the process from prevent node itself to involve in this
computation.
I have no write access to GCC SVN repository, if it OK, can you commit
for me?
(Thanks Richard for reviewing)
Bootstrap and regtest scheduled on x86_64 GNU/Linux
Signed-off-by: Zhouyi Zhou <[email protected]>
---
gcc/ChangeLog | 5 +++++
gcc/ira-color.c | 8 +++-----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53f582b..a495dfc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-03-12 Zhouyi Zhou <[email protected]>
+
+ * ira-color.c (setup_left_conflict_sizes_p): Prevent node itself
+ from computing left conflict subnodes size.
+
2015-03-10 Jan Hubicka <[email protected]>
* cgraph.c (cgraph_node::release_body): Free function_in_decl_state.
diff --git a/gcc/ira-color.c b/gcc/ira-color.c
index ff1fe8a..d2d5102 100644
--- a/gcc/ira-color.c
+++ b/gcc/ira-color.c
@@ -938,7 +938,7 @@ setup_left_conflict_sizes_p (ira_allocno_t a)
subnodes[i].left_conflict_subnodes_size = 0;
}
start = node_preorder_num * allocno_hard_regs_nodes_num;
- for (i = data->hard_regs_subnodes_num - 1; i >= 0; i--)
+ for (i = data->hard_regs_subnodes_num - 1; i > 0; i--)
{
int size, parent_i;
allocno_hard_regs_node_t parent;
@@ -948,12 +948,10 @@ setup_left_conflict_sizes_p (ira_allocno_t a)
- subnodes[i].left_conflict_subnodes_size,
subnodes[i].left_conflict_size));
parent = allocno_hard_regs_nodes[i + node_preorder_num]->parent;
- if (parent == NULL)
- continue;
+ gcc_checking_assert(parent);
parent_i
= allocno_hard_regs_subnode_index[start + parent->preorder_num];
- if (parent_i < 0)
- continue;
+ gcc_checking_assert(parent_i >= 0);
subnodes[parent_i].left_conflict_subnodes_size += size;
}
left_conflict_subnodes_size = subnodes[0].left_conflict_subnodes_size;
--
1.7.10.4