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
328f4006
Commit
328f4006
authored
Nov 22, 1999
by
Bernd Schmidt
Committed by
Bernd Schmidt
Nov 22, 1999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reformat load_mems slightly.
From-SVN: r30618
parent
19a027a0
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
140 additions
and
137 deletions
+140
-137
gcc/ChangeLog
+4
-0
gcc/loop.c
+136
-137
No files found.
gcc/ChangeLog
View file @
328f4006
1999
-
11
-
22
Bernd
Schmidt
<
bernds
@cygnus
.
co
.
uk
>
*
loop
.
c
(
load_mems
)
:
Reformat
slightly
.
1999
-
11
-
22
Bruce
Korb
<
autogen
@linuxbox
.
com
*
fixinc
/
mkfisinc
.
sh
(
i
?
86
-*-
linux
):
disable
script
,
run
fixincl
exe
...
...
gcc/loop.c
View file @
328f4006
...
...
@@ -9715,165 +9715,164 @@ load_mems (scan_start, end, loop_top, start)
rtx
p
;
rtx
label
=
NULL_RTX
;
rtx
end_label
=
NULL_RTX
;
/* Nonzero if the next instruction may never be executed. */
int
next_maybe_never
=
0
;
if
(
loop_mems_idx
>
0
)
{
/* Nonzero if the next instruction may never be executed. */
int
next_maybe_never
=
0
;
if
(
loop_mems_idx
==
0
)
return
;
/* Check to see if it's possible that some instructions in the
loop are never executed. */
for
(
p
=
next_insn_in_loop
(
scan_start
,
scan_start
,
end
,
loop_top
);
p
!=
NULL_RTX
&&
!
maybe_never
;
p
=
next_insn_in_loop
(
p
,
scan_start
,
end
,
loop_top
))
/* Check to see if it's possible that some instructions in the
loop are never executed. */
for
(
p
=
next_insn_in_loop
(
scan_start
,
scan_start
,
end
,
loop_top
);
p
!=
NULL_RTX
&&
!
maybe_never
;
p
=
next_insn_in_loop
(
p
,
scan_start
,
end
,
loop_top
))
{
if
(
GET_CODE
(
p
)
==
CODE_LABEL
)
maybe_never
=
1
;
else
if
(
GET_CODE
(
p
)
==
JUMP_INSN
/* If we enter the loop in the middle, and scan
around to the beginning, don't set maybe_never
for that. This must be an unconditional jump,
otherwise the code at the top of the loop might
never be executed. Unconditional jumps are
followed a by barrier then loop end. */
&&
!
(
GET_CODE
(
p
)
==
JUMP_INSN
&&
JUMP_LABEL
(
p
)
==
loop_top
&&
NEXT_INSN
(
NEXT_INSN
(
p
))
==
end
&&
simplejump_p
(
p
)))
{
if
(
GET_CODE
(
p
)
==
CODE_LABEL
)
maybe_never
=
1
;
else
if
(
GET_CODE
(
p
)
==
JUMP_INSN
/* If we enter the loop in the middle, and scan
around to the beginning, don't set maybe_never
for that. This must be an unconditional jump,
otherwise the code at the top of the loop might
never be executed. Unconditional jumps are
followed a by barrier then loop end. */
&&
!
(
GET_CODE
(
p
)
==
JUMP_INSN
&&
JUMP_LABEL
(
p
)
==
loop_top
&&
NEXT_INSN
(
NEXT_INSN
(
p
))
==
end
&&
simplejump_p
(
p
)))
{
if
(
!
condjump_p
(
p
))
/* Something complicated. */
maybe_never
=
1
;
else
/* If there are any more instructions in the loop, they
might not be reached. */
next_maybe_never
=
1
;
}
else
if
(
next_maybe_never
)
if
(
!
condjump_p
(
p
))
/* Something complicated. */
maybe_never
=
1
;
}
else
/* If there are any more instructions in the loop, they
might not be reached. */
next_maybe_never
=
1
;
}
else
if
(
next_maybe_never
)
maybe_never
=
1
;
}
/* Actually move the MEMs. */
for
(
i
=
0
;
i
<
loop_mems_idx
;
++
i
)
{
int
written
=
0
;
rtx
reg
;
rtx
mem
=
loop_mems
[
i
].
mem
;
rtx
mem_list_entry
;
/* Actually move the MEMs. */
for
(
i
=
0
;
i
<
loop_mems_idx
;
++
i
)
if
(
MEM_VOLATILE_P
(
mem
)
||
invariant_p
(
XEXP
(
mem
,
0
))
!=
1
)
/* There's no telling whether or not MEM is modified. */
loop_mems
[
i
].
optimize
=
0
;
/* Go through the MEMs written to in the loop to see if this
one is aliased by one of them. */
mem_list_entry
=
loop_store_mems
;
while
(
mem_list_entry
)
{
int
written
=
0
;
rtx
reg
;
rtx
mem
=
loop_mems
[
i
].
mem
;
rtx
mem_list_entry
;
if
(
MEM_VOLATILE_P
(
mem
)
||
invariant_p
(
XEXP
(
mem
,
0
))
!=
1
)
/* There's no telling whether or not MEM is modified. */
loop_mems
[
i
].
optimize
=
0
;
/* Go through the MEMs written to in the loop to see if this
one is aliased by one of them. */
mem_list_entry
=
loop_store_mems
;
while
(
mem_list_entry
)
if
(
rtx_equal_p
(
mem
,
XEXP
(
mem_list_entry
,
0
)))
written
=
1
;
else
if
(
true_dependence
(
XEXP
(
mem_list_entry
,
0
),
VOIDmode
,
mem
,
rtx_varies_p
))
{
if
(
rtx_equal_p
(
mem
,
XEXP
(
mem_list_entry
,
0
)))
written
=
1
;
else
if
(
true_dependence
(
XEXP
(
mem_list_entry
,
0
),
VOIDmode
,
mem
,
rtx_varies_p
))
{
/* MEM is indeed aliased by this store. */
loop_mems
[
i
].
optimize
=
0
;
break
;
}
mem_list_entry
=
XEXP
(
mem_list_entry
,
1
);
/* MEM is indeed aliased by this store. */
loop_mems
[
i
].
optimize
=
0
;
break
;
}
mem_list_entry
=
XEXP
(
mem_list_entry
,
1
);
}
/* If this MEM is written to, we must be sure that there
are no reads from another MEM that aliases this one. */
if
(
loop_mems
[
i
].
optimize
&&
written
)
{
int
j
;
/* If this MEM is written to, we must be sure that there
are no reads from another MEM that aliases this one. */
if
(
loop_mems
[
i
].
optimize
&&
written
)
{
int
j
;
for
(
j
=
0
;
j
<
loop_mems_idx
;
++
j
)
for
(
j
=
0
;
j
<
loop_mems_idx
;
++
j
)
{
if
(
j
==
i
)
continue
;
else
if
(
true_dependence
(
mem
,
VOIDmode
,
loop_mems
[
j
].
mem
,
rtx_varies_p
))
{
if
(
j
==
i
)
continue
;
else
if
(
true_dependence
(
mem
,
VOIDmode
,
loop_mems
[
j
].
mem
,
rtx_varies_p
))
{
/* It's not safe to hoist loop_mems[i] out of
the loop because writes to it might not be
seen by reads from loop_mems[j]. */
loop_mems
[
i
].
optimize
=
0
;
break
;
}
/* It's not safe to hoist loop_mems[i] out of
the loop because writes to it might not be
seen by reads from loop_mems[j]. */
loop_mems
[
i
].
optimize
=
0
;
break
;
}
}
}
if
(
maybe_never
&&
may_trap_p
(
mem
))
/* We can't access the MEM outside the loop; it might
cause a trap that wouldn't have happened otherwise. */
loop_mems
[
i
].
optimize
=
0
;
if
(
maybe_never
&&
may_trap_p
(
mem
))
/* We can't access the MEM outside the loop; it might
cause a trap that wouldn't have happened otherwise. */
loop_mems
[
i
].
optimize
=
0
;
if
(
!
loop_mems
[
i
].
optimize
)
/* We thought we were going to lift this MEM out of the
loop, but later discovered that we could not. */
continue
;
if
(
!
loop_mems
[
i
].
optimize
)
/* We thought we were going to lift this MEM out of the
loop, but later discovered that we could not. */
continue
;
/* Allocate a pseudo for this MEM. We set REG_USERVAR_P in
order to keep scan_loop from moving stores to this MEM
out of the loop just because this REG is neither a
user-variable nor used in the loop test. */
reg
=
gen_reg_rtx
(
GET_MODE
(
mem
));
REG_USERVAR_P
(
reg
)
=
1
;
loop_mems
[
i
].
reg
=
reg
;
/* Now, replace all references to the MEM with the
corresponding pesudos. */
for
(
p
=
next_insn_in_loop
(
scan_start
,
scan_start
,
end
,
loop_top
);
p
!=
NULL_RTX
;
p
=
next_insn_in_loop
(
p
,
scan_start
,
end
,
loop_top
))
{
rtx_and_int
ri
;
ri
.
r
=
p
;
ri
.
i
=
i
;
for_each_rtx
(
&
p
,
replace_loop_mem
,
&
ri
);
}
/* Allocate a pseudo for this MEM. We set REG_USERVAR_P in
order to keep scan_loop from moving stores to this MEM
out of the loop just because this REG is neither a
user-variable nor used in the loop test. */
reg
=
gen_reg_rtx
(
GET_MODE
(
mem
));
REG_USERVAR_P
(
reg
)
=
1
;
loop_mems
[
i
].
reg
=
reg
;
/* Now, replace all references to the MEM with the
corresponding pesudos. */
for
(
p
=
next_insn_in_loop
(
scan_start
,
scan_start
,
end
,
loop_top
);
p
!=
NULL_RTX
;
p
=
next_insn_in_loop
(
p
,
scan_start
,
end
,
loop_top
))
{
rtx_and_int
ri
;
ri
.
r
=
p
;
ri
.
i
=
i
;
for_each_rtx
(
&
p
,
replace_loop_mem
,
&
ri
);
}
if
(
!
apply_change_group
())
/* We couldn't replace all occurrences of the MEM. */
loop_mems
[
i
].
optimize
=
0
;
else
{
rtx
set
;
if
(
!
apply_change_group
())
/* We couldn't replace all occurrences of the MEM. */
loop_mems
[
i
].
optimize
=
0
;
else
{
rtx
set
;
/* Load the memory immediately before START, which is
the NOTE_LOOP_BEG. */
set
=
gen_move_insn
(
reg
,
mem
);
emit_insn_before
(
set
,
start
);
/* Load the memory immediately before START, which is
the NOTE_LOOP_BEG. */
set
=
gen_move_insn
(
reg
,
mem
);
emit_insn_before
(
set
,
start
);
if
(
written
)
if
(
written
)
{
if
(
label
==
NULL_RTX
)
{
if
(
label
==
NULL_RTX
)
{
/* We must compute the former
right-after-the-end label before we insert
the new one. */
end_label
=
next_label
(
end
);
label
=
gen_label_rtx
();
emit_label_after
(
label
,
end
);
}
/* Store the memory immediately after END, which is
the NOTE_LOOP_END. */
set
=
gen_move_insn
(
copy_rtx
(
mem
),
reg
);
emit_insn_after
(
set
,
label
);
/* We must compute the former
right-after-the-end label before we insert
the new one. */
end_label
=
next_label
(
end
);
label
=
gen_label_rtx
();
emit_label_after
(
label
,
end
);
}
if
(
loop_dump_stream
)
{
fprintf
(
loop_dump_stream
,
"Hoisted regno %d %s from "
,
REGNO
(
reg
),
(
written
?
"r/w"
:
"r/o"
));
print_rtl
(
loop_dump_stream
,
mem
);
fputc
(
'\n'
,
loop_dump_stream
);
}
/* Store the memory immediately after END, which is
the NOTE_LOOP_END. */
set
=
gen_move_insn
(
copy_rtx
(
mem
),
reg
);
emit_insn_after
(
set
,
label
);
}
if
(
loop_dump_stream
)
{
fprintf
(
loop_dump_stream
,
"Hoisted regno %d %s from "
,
REGNO
(
reg
),
(
written
?
"r/w"
:
"r/o"
));
print_rtl
(
loop_dump_stream
,
mem
);
fputc
(
'\n'
,
loop_dump_stream
);
}
}
}
...
...
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