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
b984d3c1
Commit
b984d3c1
authored
Jun 23, 2016
by
qinsoon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wont decrement degree of precolored node
parent
eeaecb3f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
14 deletions
+24
-14
src/compiler/backend/reg_alloc/coloring.rs
src/compiler/backend/reg_alloc/coloring.rs
+24
-14
No files found.
src/compiler/backend/reg_alloc/coloring.rs
View file @
b984d3c1
...
...
@@ -20,7 +20,7 @@ pub struct GraphColoring {
pub
colored_nodes
:
Vec
<
Node
>
,
initial
:
Vec
<
Node
>
,
degree
:
HashMap
<
Node
,
i
size
>
,
degree
:
HashMap
<
Node
,
u
size
>
,
worklist_moves
:
Vec
<
Move
>
,
movelist
:
HashMap
<
Node
,
RefCell
<
Vec
<
Move
>>>
,
...
...
@@ -86,11 +86,16 @@ impl GraphColoring {
trace!
(
"Initializing coloring allocator..."
);
// 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
);
self
.precolored
.insert
(
node
);
}
for
reg
in
backend
::
all_usable_regs
()
.iter
()
{
let
reg_id
=
reg
.extract_ssa_id
()
.unwrap
();
let
node
=
self
.ig
.get_node
(
reg_id
);
self
.precolored
.insert
(
node
);
{
let
group
=
backend
::
pick_group_for_reg
(
reg_id
);
self
.colors
.get_mut
(
&
group
)
.unwrap
()
.insert
(
reg_id
);
...
...
@@ -101,8 +106,8 @@ impl GraphColoring {
if
!
self
.ig
.is_colored
(
node
)
{
self
.initial
.push
(
node
);
let
outdegree
=
self
.ig
.outdegree_of
(
node
);
self
.degree
.insert
(
node
,
outdegree
as
isize
);
trace!
(
"{} has
out
degree of {}"
,
self
.node_info
(
node
),
outdegree
);
self
.degree
.insert
(
node
,
outdegree
);
trace!
(
"{} has
a
degree of {}"
,
self
.node_info
(
node
),
outdegree
);
}
}
...
...
@@ -229,9 +234,7 @@ impl GraphColoring {
self
.select_stack
.push
(
node
);
for
m
in
self
.adjacent
(
node
)
.iter
()
{
let
m
=
*
m
;
trace!
(
"decrement degree of its adjacent node {}"
,
self
.node_info
(
m
));
self
.decrement_degree
(
m
);
self
.decrement_degree
(
*
m
);
}
}
...
...
@@ -256,7 +259,7 @@ impl GraphColoring {
adj
}
fn
degree
(
&
self
,
n
:
Node
)
->
i
size
{
fn
degree
(
&
self
,
n
:
Node
)
->
u
size
{
match
self
.degree
.get
(
&
n
)
{
Some
(
d
)
=>
*
d
,
None
=>
0
...
...
@@ -264,10 +267,17 @@ impl GraphColoring {
}
fn
decrement_degree
(
&
mut
self
,
n
:
Node
)
{
if
self
.precolored
.contains
(
&
n
)
{
return
;
}
trace!
(
"decrement degree of {}"
,
self
.node_info
(
n
));
let
d
=
self
.degree
(
n
);
debug_assert!
(
d
!=
0
);
self
.degree
.insert
(
n
,
d
-
1
);
if
d
==
self
.n_regs_for_node
(
n
)
as
isize
{
if
d
==
self
.n_regs_for_node
(
n
)
{
trace!
(
"{}'s degree is K, no longer need to spill it"
,
self
.node_info
(
n
));
let
mut
nodes
=
self
.adjacent
(
n
);
nodes
.insert
(
n
);
...
...
@@ -368,7 +378,7 @@ impl GraphColoring {
}
fn
add_worklist
(
&
mut
self
,
node
:
Node
)
{
if
!
self
.is_move_related
(
node
)
&&
self
.degree
(
node
)
<
self
.n_regs_for_node
(
node
)
as
isize
{
if
!
self
.is_move_related
(
node
)
&&
self
.degree
(
node
)
<
self
.n_regs_for_node
(
node
)
{
self
.worklist_freeze
.remove
(
&
node
);
self
.worklist_simplify
.insert
(
node
);
}
...
...
@@ -378,7 +388,7 @@ impl GraphColoring {
for
t
in
self
.adjacent
(
v
)
.iter
()
{
let
t
=
*
t
;
if
!
self
.precolored
.contains
(
&
t
)
||
self
.degree
(
t
)
<
self
.n_regs_for_node
(
t
)
as
isize
||
self
.degree
(
t
)
<
self
.n_regs_for_node
(
t
)
||
self
.ig
.is_adj
(
t
,
u
)
{
return
false
;
}
...
...
@@ -400,7 +410,7 @@ impl GraphColoring {
let
mut
k
=
0
;
for
n
in
nodes
.iter
()
{
if
self
.precolored
.contains
(
n
)
||
self
.degree
(
*
n
)
>=
self
.n_regs_for_node
(
*
n
)
as
isize
{
if
self
.precolored
.contains
(
n
)
||
self
.degree
(
*
n
)
>=
self
.n_regs_for_node
(
*
n
)
{
k
+=
1
;
}
}
...
...
@@ -444,7 +454,7 @@ impl GraphColoring {
}
if
self
.worklist_freeze
.contains
(
&
u
)
&&
self
.degree
(
u
)
>=
self
.n_regs_for_node
(
u
)
as
isize
{
&&
self
.degree
(
u
)
>=
self
.n_regs_for_node
(
u
)
{
self
.worklist_freeze
.remove
(
&
u
);
self
.worklist_spill
.push
(
u
);
}
...
...
@@ -487,7 +497,7 @@ impl GraphColoring {
if
!
self
.precolored
.contains
(
&
v
)
&&
self
.node_moves
(
v
)
.is_empty
()
&&
self
.degree
(
v
)
<
self
.n_regs_for_node
(
v
)
as
isize
{
&&
self
.degree
(
v
)
<
self
.n_regs_for_node
(
v
)
{
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