Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
0de5a32f
Commit
0de5a32f
authored
Feb 25, 2008
by
Ayal Zaks
Committed by
Revital Eres
Feb 25, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SMS: Revisit order of insns within a row
Co-Authored-By: Revital Eres <eres@il.ibm.com> From-SVN: r132615
parent
d4cba6d4
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
39 additions
and
14 deletions
+39
-14
gcc/ChangeLog
+6
-0
gcc/modulo-sched.c
+33
-14
No files found.
gcc/ChangeLog
View file @
0de5a32f
2008-02-25 Ayal Zaks <zaks@il.ibm.com>
Revital Eres <eres@il.ibm.com>
* modulo-sched.c (calculate_must_precede_follow): Address TODO
regarding the order of two dependent insns in the same row.
2008-02-25 Eric Botcazou <ebotcazou@adacore.com>
2008-02-25 Eric Botcazou <ebotcazou@adacore.com>
* stor-layout.c (layout_decl): Do not bump the alignment of a
* stor-layout.c (layout_decl): Do not bump the alignment of a
...
...
gcc/modulo-sched.c
View file @
0de5a32f
...
@@ -1587,18 +1587,17 @@ get_sched_window (partial_schedule_ptr ps, int *nodes_order, int i,
...
@@ -1587,18 +1587,17 @@ get_sched_window (partial_schedule_ptr ps, int *nodes_order, int i,
/* Calculate MUST_PRECEDE/MUST_FOLLOW bitmaps of U_NODE; which is the
/* Calculate MUST_PRECEDE/MUST_FOLLOW bitmaps of U_NODE; which is the
node currently been scheduled. At the end of the calculation
node currently been scheduled. At the end of the calculation
MUST_PRECEDE/MUST_FOLLOW contains all predecessors/successors of U_NODE
MUST_PRECEDE/MUST_FOLLOW contains all predecessors/successors of
which are in SCHED_NODES (already scheduled nodes) and scheduled at
U_NODE which are (1) already scheduled in the first/last row of
the same row as the first/last row of U_NODE's scheduling window.
U_NODE's scheduling window, (2) whose dependence inequality with U
becomes an equality when U is scheduled in this same row, and (3)
whose dependence latency is zero.
The first and last rows are calculated using the following parameters:
The first and last rows are calculated using the following parameters:
START/END rows - The cycles that begins/ends the traversal on the window;
START/END rows - The cycles that begins/ends the traversal on the window;
searching for an empty cycle to schedule U_NODE.
searching for an empty cycle to schedule U_NODE.
STEP - The direction in which we traverse the window.
STEP - The direction in which we traverse the window.
II - The initiation interval.
II - The initiation interval. */
TODO: We can add an insn to the must_precede/must_follow bitmap only
if it has tight dependence to U and they are both scheduled in the
same row. The current check is more conservative and content with
the fact that both U and the insn are scheduled in the same row. */
static
void
static
void
calculate_must_precede_follow
(
ddg_node_ptr
u_node
,
int
start
,
int
end
,
calculate_must_precede_follow
(
ddg_node_ptr
u_node
,
int
start
,
int
end
,
...
@@ -1607,7 +1606,6 @@ calculate_must_precede_follow (ddg_node_ptr u_node, int start, int end,
...
@@ -1607,7 +1606,6 @@ calculate_must_precede_follow (ddg_node_ptr u_node, int start, int end,
{
{
ddg_edge_ptr
e
;
ddg_edge_ptr
e
;
int
first_cycle_in_window
,
last_cycle_in_window
;
int
first_cycle_in_window
,
last_cycle_in_window
;
int
first_row_in_window
,
last_row_in_window
;
gcc_assert
(
must_precede
&&
must_follow
);
gcc_assert
(
must_precede
&&
must_follow
);
...
@@ -1621,18 +1619,27 @@ calculate_must_precede_follow (ddg_node_ptr u_node, int start, int end,
...
@@ -1621,18 +1619,27 @@ calculate_must_precede_follow (ddg_node_ptr u_node, int start, int end,
first_cycle_in_window
=
(
step
==
1
)
?
start
:
end
-
step
;
first_cycle_in_window
=
(
step
==
1
)
?
start
:
end
-
step
;
last_cycle_in_window
=
(
step
==
1
)
?
end
-
step
:
start
;
last_cycle_in_window
=
(
step
==
1
)
?
end
-
step
:
start
;
first_row_in_window
=
SMODULO
(
first_cycle_in_window
,
ii
);
last_row_in_window
=
SMODULO
(
last_cycle_in_window
,
ii
);
sbitmap_zero
(
must_precede
);
sbitmap_zero
(
must_precede
);
sbitmap_zero
(
must_follow
);
sbitmap_zero
(
must_follow
);
if
(
dump_file
)
if
(
dump_file
)
fprintf
(
dump_file
,
"
\n
must_precede: "
);
fprintf
(
dump_file
,
"
\n
must_precede: "
);
/* Instead of checking if:
(SMODULO (SCHED_TIME (e->src), ii) == first_row_in_window)
&& ((SCHED_TIME (e->src) + e->latency - (e->distance * ii)) ==
first_cycle_in_window)
&& e->latency == 0
we use the fact that latency is non-negative:
SCHED_TIME (e->src) - (e->distance * ii) <=
SCHED_TIME (e->src) + e->latency - (e->distance * ii)) <=
first_cycle_in_window
and check only if
SCHED_TIME (e->src) - (e->distance * ii) == first_cycle_in_window */
for
(
e
=
u_node
->
in
;
e
!=
0
;
e
=
e
->
next_in
)
for
(
e
=
u_node
->
in
;
e
!=
0
;
e
=
e
->
next_in
)
if
(
TEST_BIT
(
sched_nodes
,
e
->
src
->
cuid
)
if
(
TEST_BIT
(
sched_nodes
,
e
->
src
->
cuid
)
&&
(
SMODULO
(
SCHED_TIME
(
e
->
src
),
ii
)
==
first_row_in_window
))
&&
((
SCHED_TIME
(
e
->
src
)
-
(
e
->
distance
*
ii
))
==
first_cycle_in_window
))
{
{
if
(
dump_file
)
if
(
dump_file
)
fprintf
(
dump_file
,
"%d "
,
e
->
src
->
cuid
);
fprintf
(
dump_file
,
"%d "
,
e
->
src
->
cuid
);
...
@@ -1643,9 +1650,21 @@ calculate_must_precede_follow (ddg_node_ptr u_node, int start, int end,
...
@@ -1643,9 +1650,21 @@ calculate_must_precede_follow (ddg_node_ptr u_node, int start, int end,
if
(
dump_file
)
if
(
dump_file
)
fprintf
(
dump_file
,
"
\n
must_follow: "
);
fprintf
(
dump_file
,
"
\n
must_follow: "
);
/* Instead of checking if:
(SMODULO (SCHED_TIME (e->dest), ii) == last_row_in_window)
&& ((SCHED_TIME (e->dest) - e->latency + (e->distance * ii)) ==
last_cycle_in_window)
&& e->latency == 0
we use the fact that latency is non-negative:
SCHED_TIME (e->dest) + (e->distance * ii) >=
SCHED_TIME (e->dest) - e->latency + (e->distance * ii)) >=
last_cycle_in_window
and check only if
SCHED_TIME (e->dest) + (e->distance * ii) == last_cycle_in_window */
for
(
e
=
u_node
->
out
;
e
!=
0
;
e
=
e
->
next_out
)
for
(
e
=
u_node
->
out
;
e
!=
0
;
e
=
e
->
next_out
)
if
(
TEST_BIT
(
sched_nodes
,
e
->
dest
->
cuid
)
if
(
TEST_BIT
(
sched_nodes
,
e
->
dest
->
cuid
)
&&
(
SMODULO
(
SCHED_TIME
(
e
->
dest
),
ii
)
==
last_row_in_window
))
&&
((
SCHED_TIME
(
e
->
dest
)
+
(
e
->
distance
*
ii
))
==
last_cycle_in_window
))
{
{
if
(
dump_file
)
if
(
dump_file
)
fprintf
(
dump_file
,
"%d "
,
e
->
dest
->
cuid
);
fprintf
(
dump_file
,
"%d "
,
e
->
dest
->
cuid
);
...
...
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