Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mu-impl-fast
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
40
Issues
40
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
mu
mu-impl-fast
Commits
5bcd1a10
Commit
5bcd1a10
authored
Jun 22, 2016
by
qinsoon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[wip] degree of nodes is an isize instead of usize (since we may have it decremented from 0 degree)
parent
c6054d60
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
27 additions
and
14 deletions
+27
-14
src/compiler/backend/reg_alloc/coloring.rs
src/compiler/backend/reg_alloc/coloring.rs
+27
-14
No files found.
src/compiler/backend/reg_alloc/coloring.rs
View file @
5bcd1a10
...
...
@@ -23,7 +23,7 @@ pub struct GraphColoring <'a> {
colored_nodes
:
Vec
<
Node
>
,
initial
:
Vec
<
Node
>
,
degree
:
HashMap
<
Node
,
u
size
>
,
degree
:
HashMap
<
Node
,
i
size
>
,
worklist_moves
:
Vec
<
Move
>
,
movelist
:
HashMap
<
Node
,
RefCell
<
Vec
<
Move
>>>
,
...
...
@@ -84,9 +84,16 @@ impl <'a> GraphColoring <'a> {
coloring
}
fn
node_info
(
&
self
,
node
:
Node
)
->
String
{
let
reg
=
self
.ig
.get_temp_of
(
node
);
format!
(
"{:?}/Reg {}"
,
node
,
reg
)
}
fn
init
(
&
mut
self
)
{
trace!
(
"Initializing coloring allocator..."
);
COALESCING
.store
(
true
,
Ordering
::
Relaxed
);
// for all machine registers
for
reg
in
backend
::
all_regs
()
.iter
()
{
let
reg_id
=
reg
.extract_ssa_id
()
.unwrap
();
let
node
=
self
.ig
.get_node
(
reg_id
);
...
...
@@ -101,7 +108,9 @@ impl <'a> GraphColoring <'a> {
for
node
in
self
.ig
.nodes
()
{
if
!
self
.ig
.is_colored
(
node
)
{
self
.initial
.push
(
node
);
self
.degree
.insert
(
node
,
self
.ig
.outdegree_of
(
node
));
let
outdegree
=
self
.ig
.outdegree_of
(
node
);
self
.degree
.insert
(
node
,
outdegree
as
isize
);
trace!
(
"{} has outdegree of {}"
,
self
.node_info
(
node
),
outdegree
);
}
}
...
...
@@ -141,6 +150,7 @@ impl <'a> GraphColoring <'a> {
}
fn
make_work_list
(
&
mut
self
)
{
trace!
(
"Making work list from initials..."
);
while
!
self
.initial
.is_empty
()
{
let
node
=
self
.initial
.pop
()
.unwrap
();
...
...
@@ -151,10 +161,13 @@ impl <'a> GraphColoring <'a> {
degree
>=
n_regs
}
{
trace!
(
"{} 's degree >= reg number limit (K), push to spill list"
,
self
.node_info
(
node
));
self
.worklist_spill
.push
(
node
);
}
else
if
self
.is_move_related
(
node
)
{
trace!
(
"{} is move related, push to freeze list"
,
self
.node_info
(
node
));
self
.worklist_freeze
.insert
(
node
);
}
else
{
trace!
(
"{} has small degree and not move related, push to simplify list"
,
self
.node_info
(
node
));
self
.worklist_simplify
.insert
(
node
);
}
}
...
...
@@ -212,15 +225,15 @@ impl <'a> GraphColoring <'a> {
}
fn
simplify
(
&
mut
self
)
{
// remove next element from worklist_simplify
let
node
=
{
let
next
=
self
.worklist_simplify
.iter
()
.next
()
.unwrap
()
.clone
();
self
.worklist_simplify
.take
(
&
next
)
.unwrap
()
};
// remove next element from worklist_simplify, we know its not empty
let
node
=
hashset_utils
::
pop_first
(
&
mut
self
.worklist_simplify
)
.unwrap
();
trace!
(
"Simplifying {}"
,
self
.node_info
(
node
));
self
.select_stack
.push
(
node
);
for
m
in
self
.adjacent
(
node
)
{
trace!
(
"decrement degree of its adjacent node {}"
,
self
.node_info
(
m
));
self
.decrement_degree
(
m
);
}
}
...
...
@@ -246,7 +259,7 @@ impl <'a> GraphColoring <'a> {
adj
}
fn
degree
(
&
self
,
n
:
Node
)
->
u
size
{
fn
degree
(
&
self
,
n
:
Node
)
->
i
size
{
match
self
.degree
.get
(
&
n
)
{
Some
(
d
)
=>
*
d
,
None
=>
0
...
...
@@ -257,7 +270,7 @@ impl <'a> GraphColoring <'a> {
let
d
=
self
.degree
(
n
);
self
.degree
.insert
(
n
,
d
-
1
);
if
d
==
self
.n_regs_for_node
(
n
)
{
if
d
==
self
.n_regs_for_node
(
n
)
as
isize
{
let
mut
nodes
=
self
.adjacent
(
n
);
nodes
.insert
(
n
);
self
.enable_moves
(
nodes
);
...
...
@@ -341,7 +354,7 @@ impl <'a> GraphColoring <'a> {
}
fn
add_worklist
(
&
mut
self
,
node
:
Node
)
{
if
!
self
.is_move_related
(
node
)
&&
self
.degree
(
node
)
<
self
.n_regs_for_node
(
node
)
{
if
!
self
.is_move_related
(
node
)
&&
self
.degree
(
node
)
<
self
.n_regs_for_node
(
node
)
as
isize
{
self
.worklist_freeze
.remove
(
&
node
);
self
.worklist_simplify
.insert
(
node
);
}
...
...
@@ -350,7 +363,7 @@ impl <'a> GraphColoring <'a> {
fn
ok
(
&
self
,
u
:
Node
,
v
:
Node
)
->
bool
{
for
t
in
self
.adjacent
(
v
)
{
if
!
self
.precolored
.contains
(
&
t
)
||
self
.degree
(
t
)
<
self
.n_regs_for_node
(
t
)
||
self
.degree
(
t
)
<
self
.n_regs_for_node
(
t
)
as
isize
||
self
.ig
.is_adj
(
t
,
u
)
{
return
false
;
}
...
...
@@ -368,7 +381,7 @@ impl <'a> GraphColoring <'a> {
let
mut
k
=
0
;
for
n
in
nodes
{
if
self
.precolored
.contains
(
n
)
||
self
.degree
(
*
n
)
>=
self
.n_regs_for_node
(
*
n
)
{
if
self
.precolored
.contains
(
n
)
||
self
.degree
(
*
n
)
>=
self
.n_regs_for_node
(
*
n
)
as
isize
{
k
+=
1
;
}
}
...
...
@@ -411,7 +424,7 @@ impl <'a> GraphColoring <'a> {
}
if
self
.worklist_freeze
.contains
(
&
u
)
&&
self
.degree
(
u
)
>=
self
.n_regs_for_node
(
u
)
{
&&
self
.degree
(
u
)
>=
self
.n_regs_for_node
(
u
)
as
isize
{
self
.worklist_freeze
.remove
(
&
u
);
self
.worklist_spill
.push
(
u
);
}
...
...
@@ -454,7 +467,7 @@ impl <'a> GraphColoring <'a> {
if
!
self
.precolored
.contains
(
&
v
)
&&
self
.node_moves
(
v
)
.is_empty
()
&&
self
.degree
(
v
)
<
self
.n_regs_for_node
(
v
)
{
&&
self
.degree
(
v
)
<
self
.n_regs_for_node
(
v
)
as
isize
{
self
.worklist_freeze
.remove
(
&
v
);
self
.worklist_simplify
.insert
(
v
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment