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
bfa30b22
Commit
bfa30b22
authored
32 years ago
by
Richard Kenner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
*** empty log message ***
From-SVN: r961
parent
3351cb00
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
125 additions
and
44 deletions
+125
-44
gcc/cccp.c
+14
-8
gcc/integrate.c
+2
-1
gcc/reload.c
+82
-14
gcc/reload1.c
+16
-10
gcc/tree.c
+11
-11
No files found.
gcc/cccp.c
View file @
bfa30b22
...
...
@@ -333,9 +333,6 @@ static enum {dump_none, dump_only, dump_names, dump_definitions}
where they are defined. */
static
int
debug_output
=
0
;
/* Holds local startup time. */
static
struct
tm
*
timebuf
=
NULL
;
/* Nonzero indicates special processing used by the pcp program. The
special effects of this mode are:
...
...
@@ -3433,6 +3430,17 @@ handle_directive (ip, op)
return
0
;
}
static
struct
tm
*
timestamp
()
{
static
struct
tm
*
timebuf
;
if
(
!
timebuf
)
{
time_t
t
=
time
(
0
);
timebuf
=
localtime
(
&
t
);
}
return
timebuf
;
}
static
char
*
monthnames
[]
=
{
"Jan"
,
"Feb"
,
"Mar"
,
"Apr"
,
"May"
,
"Jun"
,
"Jul"
,
"Aug"
,
"Sep"
,
"Oct"
,
"Nov"
,
"Dec"
,
};
...
...
@@ -3451,6 +3459,7 @@ special_symbol (hp, op)
int
i
,
len
;
int
true_indepth
;
FILE_BUF
*
ip
=
NULL
;
struct
tm
*
timebuf
;
int
paren
=
0
;
/* For special `defined' keyword */
...
...
@@ -3536,6 +3545,7 @@ special_symbol (hp, op)
case
T_DATE
:
case
T_TIME
:
buf
=
(
char
*
)
alloca
(
20
);
timebuf
=
timestamp
();
if
(
hp
->
type
==
T_DATE
)
sprintf
(
buf
,
"
\"
%s %2d %4d
\"
"
,
monthnames
[
timebuf
->
tm_mon
],
timebuf
->
tm_mday
,
timebuf
->
tm_year
+
1900
);
...
...
@@ -8055,11 +8065,6 @@ initialize_builtins (inp, outp)
FILE_BUF
*
inp
;
FILE_BUF
*
outp
;
{
time_t
t
;
t
=
time
(
0
);
timebuf
=
localtime
(
&
t
);
install
(
"__LINE__"
,
-
1
,
T_SPECLINE
,
0
,
-
1
);
install
(
"__DATE__"
,
-
1
,
T_DATE
,
0
,
-
1
);
install
(
"__FILE__"
,
-
1
,
T_FILE
,
0
,
-
1
);
...
...
@@ -8082,6 +8087,7 @@ initialize_builtins (inp, outp)
{
char
directive
[
2048
];
register
struct
directive
*
dp
=
&
directive_table
[
0
];
struct
tm
*
timebuf
=
timestamp
();
sprintf
(
directive
,
" __BASE_FILE__
\"
%s
\"\n
"
,
instack
[
0
].
nominal_fname
);
...
...
This diff is collapsed.
Click to expand it.
gcc/integrate.c
View file @
bfa30b22
...
...
@@ -1040,7 +1040,7 @@ rtx *global_const_equiv_map;
/* Integrate the procedure defined by FNDECL. Note that this function
may wind up calling itself. Since the static variables are not
reentrant, we do not assign them until after the possibility
o
r
recursion is eliminated.
o
f
recursion is eliminated.
If IGNORE is nonzero, do not produce a value.
Otherwise store the value in TARGET if it is nonzero and that is convenient.
...
...
@@ -1557,6 +1557,7 @@ expand_inline_function (fndecl, parms, target, ignore, type, structure_value_add
case
CODE_LABEL
:
copy
=
emit_label
(
map
->
label_map
[
CODE_LABEL_NUMBER
(
insn
)]);
LABEL_NAME
(
copy
)
=
LABEL_NAME
(
insn
);
map
->
const_age
++
;
break
;
...
...
This diff is collapsed.
Click to expand it.
gcc/reload.c
View file @
bfa30b22
...
...
@@ -547,7 +547,7 @@ push_reload (in, out, inloc, outloc, class,
/* If IN appears in OUT, we can't share any input-only reload for IN. */
if
(
in
!=
0
&&
out
!=
0
&&
GET_CODE
(
out
)
==
MEM
&&
(
GET_CODE
(
in
)
==
REG
||
GET_CODE
(
in
)
==
MEM
)
&&
reg_overlap_mentioned_p
(
in
,
XEXP
(
out
,
0
)))
&&
reg_overlap_mentioned_
for_reload_
p
(
in
,
XEXP
(
out
,
0
)))
dont_share
=
1
;
/* Narrow down the class of register wanted if that is
...
...
@@ -1104,8 +1104,8 @@ combine_reloads ()
/* Args reversed because the first arg seems to be
the one that we imagine being modified
while the second is the one that might be affected. */
||
(
!
reg_overlap_mentioned_p
(
reload_out
[
output_reload
],
reload_in
[
i
])
||
(
!
reg_overlap_mentioned_
for_reload_
p
(
reload_out
[
output_reload
],
reload_in
[
i
])
/* However, if the input is a register that appears inside
the output, then we also can't share.
Imagine (set (mem (reg 69)) (plus (reg 69) ...)).
...
...
@@ -1113,8 +1113,8 @@ combine_reloads ()
result to be stored in memory, then that result
will clobber the address of the memory ref. */
&&
!
(
GET_CODE
(
reload_in
[
i
])
==
REG
&&
reg_overlap_mentioned_p
(
reload_in
[
i
],
reload_out
[
output_reload
])))))
&&
reg_overlap_mentioned_
for_reload_
p
(
reload_in
[
i
],
reload_out
[
output_reload
])))))
{
int
j
;
...
...
@@ -1162,8 +1162,8 @@ combine_reloads ()
for
(
note
=
REG_NOTES
(
this_insn
);
note
;
note
=
XEXP
(
note
,
1
))
if
(
REG_NOTE_KIND
(
note
)
==
REG_DEAD
&&
GET_CODE
(
XEXP
(
note
,
0
))
==
REG
&&
!
reg_overlap_mentioned_p
(
XEXP
(
note
,
0
),
reload_out
[
output_reload
])
&&
!
reg_overlap_mentioned_
for_reload_
p
(
XEXP
(
note
,
0
),
reload_out
[
output_reload
])
&&
REGNO
(
XEXP
(
note
,
0
))
<
FIRST_PSEUDO_REGISTER
&&
HARD_REGNO_MODE_OK
(
REGNO
(
XEXP
(
note
,
0
)),
reload_outmode
[
output_reload
])
&&
TEST_HARD_REG_BIT
(
reg_class_contents
[(
int
)
reload_reg_class
[
output_reload
]],
...
...
@@ -4343,6 +4343,70 @@ refers_to_regno_for_reload_p (regno, endregno, x, loc)
}
return
0
;
}
/* Nonzero if modifying X will affect IN. If X is a register or a SUBREG,
we check if any register number in X conflicts with the relevant register
numbers. If X is a constant, return 0. If X is a MEM, return 1 iff IN
contains a MEM (we don't bother checking for memory addresses that can't
conflict because we expect this to be a rare case.
This function is similar to reg_overlap_mention_p in rtlanal.c except
that we look at equivalences for pseudos that didn't get hard registers. */
int
reg_overlap_mentioned_for_reload_p
(
x
,
in
)
rtx
x
,
in
;
{
int
regno
,
endregno
;
if
(
GET_CODE
(
x
)
==
SUBREG
)
{
regno
=
REGNO
(
SUBREG_REG
(
x
));
if
(
regno
<
FIRST_PSEUDO_REGISTER
)
regno
+=
SUBREG_WORD
(
x
);
}
else
if
(
GET_CODE
(
x
)
==
REG
)
{
regno
=
REGNO
(
x
);
if
(
regno
>=
FIRST_PSEUDO_REGISTER
&&
reg_renumber
[
regno
]
==
-
1
&&
((
reg_equiv_address
[
regno
]
&&
reg_overlap_mentioned_for_reload_p
(
reg_equiv_address
[
regno
],
in
))
||
(
reg_equiv_mem
[
regno
]
&&
reg_overlap_mentioned_for_reload_p
(
reg_equiv_mem
[
regno
],
in
))))
return
1
;
}
else
if
(
CONSTANT_P
(
x
))
return
0
;
else
if
(
GET_CODE
(
x
)
==
MEM
)
{
char
*
fmt
;
int
i
;
if
(
GET_CODE
(
in
)
==
MEM
)
return
1
;
fmt
=
GET_RTX_FORMAT
(
GET_CODE
(
in
));
for
(
i
=
GET_RTX_LENGTH
(
GET_CODE
(
in
))
-
1
;
i
>=
0
;
i
--
)
if
(
fmt
[
i
]
==
'e'
&&
reg_overlap_mentioned_for_reload_p
(
x
,
XEXP
(
in
,
i
)))
return
1
;
return
0
;
}
else
if
(
GET_CODE
(
x
)
==
SCRATCH
||
GET_CODE
(
x
)
==
PC
||
GET_CODE
(
x
)
==
CC0
)
return
reg_mentioned_p
(
x
,
in
);
else
abort
();
endregno
=
regno
+
(
regno
<
FIRST_PSEUDO_REGISTER
?
HARD_REGNO_NREGS
(
regno
,
GET_MODE
(
x
))
:
1
);
return
refers_to_regno_for_reload_p
(
regno
,
endregno
,
in
,
0
);
}
#if 0
...
...
@@ -4584,7 +4648,8 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode)
/* If we propose to get the value from the stack pointer or if GOAL is
a MEM based on the stack pointer, we need a stable SP. */
if
(
valueno
==
STACK_POINTER_REGNUM
||
(
goal_mem
&&
reg_overlap_mentioned_p
(
stack_pointer_rtx
,
goal
)))
||
(
goal_mem
&&
reg_overlap_mentioned_for_reload_p
(
stack_pointer_rtx
,
goal
)))
need_stable_sp
=
1
;
/* Reject VALUE if the copy-insn moved the wrong sort of datum. */
...
...
@@ -4595,9 +4660,10 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode)
and is also a register that appears in the address of GOAL. */
if
(
goal_mem
&&
value
==
SET_DEST
(
PATTERN
(
where
))
&&
refers_to_regno_p
(
valueno
,
valueno
+
HARD_REGNO_NREGS
(
valueno
,
mode
),
goal
,
0
))
&&
refers_to_regno_for_reload_p
(
valueno
,
(
valueno
+
HARD_REGNO_NREGS
(
valueno
,
mode
)),
goal
,
0
))
return
0
;
/* Reject registers that overlap GOAL. */
...
...
@@ -4710,7 +4776,7 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode)
&&
xregno
+
xnregs
>
valueno
)
return
0
;
if
(
goal_mem_addr_varies
&&
reg_overlap_mentioned_p
(
dest
,
goal
))
&&
reg_overlap_mentioned_
for_reload_
p
(
dest
,
goal
))
return
0
;
}
else
if
(
goal_mem
&&
GET_CODE
(
dest
)
==
MEM
...
...
@@ -4748,7 +4814,8 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode)
&&
xregno
+
xnregs
>
valueno
)
return
0
;
if
(
goal_mem_addr_varies
&&
reg_overlap_mentioned_p
(
dest
,
goal
))
&&
reg_overlap_mentioned_for_reload_p
(
dest
,
goal
))
return
0
;
}
else
if
(
goal_mem
&&
GET_CODE
(
dest
)
==
MEM
...
...
@@ -4779,7 +4846,8 @@ find_equiv_reg (goal, insn, class, other, reload_reg_p, goalreg, mode)
if
(
incno
<
valueno
+
valuenregs
&&
incno
>=
valueno
)
return
0
;
if
(
goal_mem_addr_varies
&&
reg_overlap_mentioned_p
(
XEXP
(
link
,
0
),
goal
))
&&
reg_overlap_mentioned_for_reload_p
(
XEXP
(
link
,
0
),
goal
))
return
0
;
}
}
...
...
This diff is collapsed.
Click to expand it.
gcc/reload1.c
View file @
bfa30b22
...
...
@@ -4272,7 +4272,8 @@ choose_reload_regs (insn, avoid_return_reg)
if
(
equiv
!=
0
)
for
(
i
=
0
;
i
<
n_earlyclobbers
;
i
++
)
if
(
reg_overlap_mentioned_p
(
equiv
,
reload_earlyclobbers
[
i
]))
if
(
reg_overlap_mentioned_for_reload_p
(
equiv
,
reload_earlyclobbers
[
i
]))
{
reload_override_in
[
r
]
=
equiv
;
equiv
=
0
;
...
...
@@ -4600,7 +4601,8 @@ emit_reload_insns (insn)
int
k
;
for
(
k
=
0
;
k
<
n_reloads
;
k
++
)
if
(
reload_reg_rtx
[
k
]
!=
0
&&
k
!=
j
&&
reg_overlap_mentioned_p
(
reload_reg_rtx
[
k
],
oldequiv
))
&&
reg_overlap_mentioned_for_reload_p
(
reload_reg_rtx
[
k
],
oldequiv
))
{
oldequiv
=
0
;
break
;
...
...
@@ -4879,8 +4881,8 @@ emit_reload_insns (insn)
prev
!=
PREV_INSN
(
this_reload_insn
);
prev
=
PREV_INSN
(
prev
))
if
(
GET_RTX_CLASS
(
GET_CODE
(
prev
)
==
'i'
)
&&
reg_overlap_mentioned_p
(
second_reload_reg
,
PATTERN
(
prev
)))
&&
reg_overlap_mentioned_
for_reload_
p
(
second_reload_reg
,
PATTERN
(
prev
)))
{
REG_NOTES
(
prev
)
=
gen_rtx
(
EXPR_LIST
,
REG_DEAD
,
second_reload_reg
,
...
...
@@ -5008,8 +5010,8 @@ emit_reload_insns (insn)
for
(
prev1
=
this_reload_insn
;
prev1
;
prev1
=
PREV_INSN
(
prev1
))
if
(
GET_RTX_CLASS
(
GET_CODE
(
prev1
)
==
'i'
)
&&
reg_overlap_mentioned_p
(
oldequiv_reg
,
PATTERN
(
prev1
)))
&&
reg_overlap_mentioned_
for_reload_
p
(
oldequiv_reg
,
PATTERN
(
prev1
)))
{
REG_NOTES
(
prev1
)
=
gen_rtx
(
EXPR_LIST
,
REG_DEAD
,
oldequiv_reg
,
...
...
@@ -5190,7 +5192,8 @@ emit_reload_insns (insn)
for
(
p
=
PREV_INSN
(
first_output_reload_insn
);
p
!=
prev_insn
;
p
=
PREV_INSN
(
p
))
if
(
GET_RTX_CLASS
(
GET_CODE
(
p
))
==
'i'
&&
reg_overlap_mentioned_p
(
reloadreg
,
PATTERN
(
p
)))
&&
reg_overlap_mentioned_for_reload_p
(
reloadreg
,
PATTERN
(
p
)))
REG_NOTES
(
p
)
=
gen_rtx
(
EXPR_LIST
,
REG_DEAD
,
reloadreg
,
REG_NOTES
(
p
));
...
...
@@ -5200,7 +5203,8 @@ emit_reload_insns (insn)
for
(
p
=
PREV_INSN
(
first_output_reload_insn
);
p
!=
prev_insn
;
p
=
PREV_INSN
(
p
))
if
(
GET_RTX_CLASS
(
GET_CODE
(
p
))
==
'i'
&&
reg_overlap_mentioned_p
(
second_reloadreg
,
PATTERN
(
p
)))
&&
reg_overlap_mentioned_for_reload_p
(
second_reloadreg
,
PATTERN
(
p
)))
REG_NOTES
(
p
)
=
gen_rtx
(
EXPR_LIST
,
REG_DEAD
,
second_reloadreg
,
REG_NOTES
(
p
));
#endif
...
...
@@ -5253,8 +5257,10 @@ emit_reload_insns (insn)
if
(
REG_NOTE_KIND
(
reg_notes
)
==
REG_DEAD
&&
GET_CODE
(
XEXP
(
reg_notes
,
0
))
==
REG
&&
((
GET_CODE
(
dest
)
!=
REG
&&
reg_overlap_mentioned_p
(
XEXP
(
reg_notes
,
0
),
dest
))
||
reg_overlap_mentioned_p
(
XEXP
(
reg_notes
,
0
),
source
)))
&&
reg_overlap_mentioned_for_reload_p
(
XEXP
(
reg_notes
,
0
),
dest
))
||
reg_overlap_mentioned_for_reload_p
(
XEXP
(
reg_notes
,
0
),
source
)))
{
*
prev_reg_note
=
next_reg_notes
;
XEXP
(
reg_notes
,
1
)
=
REG_NOTES
(
insn1
);
...
...
This diff is collapsed.
Click to expand it.
gcc/tree.c
View file @
bfa30b22
...
...
@@ -3104,22 +3104,22 @@ int_fits_type_p (c, type)
&&
!
INT_CST_LT
(
c
,
TYPE_MIN_VALUE
(
type
)));
}
/* Return the innermost context enclosing
FN
DECL that is
/* Return the innermost context enclosing DECL that is
a FUNCTION_DECL, or zero if none. */
tree
decl_function_context
(
fn
decl
)
tree
fn
decl
;
decl_function_context
(
decl
)
tree
decl
;
{
tree
context
;
if
(
TREE_CODE
(
fn
decl
)
==
ERROR_MARK
)
if
(
TREE_CODE
(
decl
)
==
ERROR_MARK
)
return
0
;
if
(
TREE_CODE
(
fn
decl
)
==
SAVE_EXPR
)
context
=
SAVE_EXPR_CONTEXT
(
fn
decl
);
if
(
TREE_CODE
(
decl
)
==
SAVE_EXPR
)
context
=
SAVE_EXPR_CONTEXT
(
decl
);
else
context
=
DECL_CONTEXT
(
fn
decl
);
context
=
DECL_CONTEXT
(
decl
);
while
(
context
&&
TREE_CODE
(
context
)
!=
FUNCTION_DECL
)
{
...
...
@@ -3138,15 +3138,15 @@ decl_function_context (fndecl)
return
context
;
}
/* Return the innermost context enclosing
FN
DECL that is
/* Return the innermost context enclosing DECL that is
a RECORD_TYPE or UNION_TYPE, or zero if none.
TYPE_DECLs and FUNCTION_DECLs are transparent to this function. */
tree
decl_type_context
(
fn
decl
)
tree
fn
decl
;
decl_type_context
(
decl
)
tree
decl
;
{
tree
context
=
DECL_CONTEXT
(
fn
decl
);
tree
context
=
DECL_CONTEXT
(
decl
);
while
(
context
)
{
...
...
This diff is collapsed.
Click to expand it.
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