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
718fe406
Commit
718fe406
authored
Aug 14, 2000
by
Kazu Hirata
Committed by
Jeff Law
Aug 14, 2000
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* cse.c: Fix formatting.
From-SVN: r35676
parent
ddc356e8
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
143 additions
and
146 deletions
+143
-146
gcc/ChangeLog
+2
-0
gcc/function.c
+141
-146
No files found.
gcc/ChangeLog
View file @
718fe406
2000-08-13 Kazu Hirata <kazu@hxi.com>
2000-08-13 Kazu Hirata <kazu@hxi.com>
* function.c: Fix formatting.
* cse.c: Fix formatting.
* cse.c: Fix formatting.
2000-08-13 Geoff Keating <geoffk@cygnus.com>
2000-08-13 Geoff Keating <geoffk@cygnus.com>
...
...
gcc/function.c
View file @
718fe406
...
@@ -19,7 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
...
@@ -19,7 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
Boston, MA 02111-1307, USA. */
/* This file handles the generation of rtl code from tree structure
/* This file handles the generation of rtl code from tree structure
at the level of the function as a whole.
at the level of the function as a whole.
It creates the rtl expressions for parameters and auto variables
It creates the rtl expressions for parameters and auto variables
...
@@ -108,7 +107,7 @@ Boston, MA 02111-1307, USA. */
...
@@ -108,7 +107,7 @@ Boston, MA 02111-1307, USA. */
/* Nonzero if function being compiled doesn't contain any calls
/* Nonzero if function being compiled doesn't contain any calls
(ignoring the prologue and epilogue). This is set prior to
(ignoring the prologue and epilogue). This is set prior to
local register allocation and is valid for the remaining
local register allocation and is valid for the remaining
compiler passes. */
compiler passes.
*/
int
current_function_is_leaf
;
int
current_function_is_leaf
;
/* Nonzero if function being compiled doesn't contain any instructions
/* Nonzero if function being compiled doesn't contain any instructions
...
@@ -118,7 +117,7 @@ int current_function_nothrow;
...
@@ -118,7 +117,7 @@ int current_function_nothrow;
/* Nonzero if function being compiled doesn't modify the stack pointer
/* Nonzero if function being compiled doesn't modify the stack pointer
(ignoring the prologue and epilogue). This is only valid after
(ignoring the prologue and epilogue). This is only valid after
life_analysis has run. */
life_analysis has run.
*/
int
current_function_sp_is_unchanging
;
int
current_function_sp_is_unchanging
;
/* Nonzero if the function being compiled is a leaf function which only
/* Nonzero if the function being compiled is a leaf function which only
...
@@ -190,7 +189,7 @@ struct temp_slot
...
@@ -190,7 +189,7 @@ struct temp_slot
/* The rtx used to represent the address if not the address of the
/* The rtx used to represent the address if not the address of the
slot above. May be an EXPR_LIST if multiple addresses exist. */
slot above. May be an EXPR_LIST if multiple addresses exist. */
rtx
address
;
rtx
address
;
/* The alignment (in bits) of the slot. */
/* The alignment (in bits) of the slot.
*/
int
align
;
int
align
;
/* The size, in units, of the slot. */
/* The size, in units, of the slot. */
HOST_WIDE_INT
size
;
HOST_WIDE_INT
size
;
...
@@ -234,7 +233,7 @@ struct fixup_replacement
...
@@ -234,7 +233,7 @@ struct fixup_replacement
rtx
new
;
rtx
new
;
struct
fixup_replacement
*
next
;
struct
fixup_replacement
*
next
;
};
};
struct
insns_for_mem_entry
{
struct
insns_for_mem_entry
{
/* The KEY in HE will be a MEM. */
/* The KEY in HE will be a MEM. */
struct
hash_entry
he
;
struct
hash_entry
he
;
...
@@ -256,7 +255,7 @@ static void put_reg_into_stack PARAMS ((struct function *, rtx, tree,
...
@@ -256,7 +255,7 @@ static void put_reg_into_stack PARAMS ((struct function *, rtx, tree,
static
void
schedule_fixup_var_refs
PARAMS
((
struct
function
*
,
rtx
,
tree
,
static
void
schedule_fixup_var_refs
PARAMS
((
struct
function
*
,
rtx
,
tree
,
enum
machine_mode
,
enum
machine_mode
,
struct
hash_table
*
));
struct
hash_table
*
));
static
void
fixup_var_refs
PARAMS
((
rtx
,
enum
machine_mode
,
int
,
static
void
fixup_var_refs
PARAMS
((
rtx
,
enum
machine_mode
,
int
,
struct
hash_table
*
));
struct
hash_table
*
));
static
struct
fixup_replacement
static
struct
fixup_replacement
*
find_fixup_replacement
PARAMS
((
struct
fixup_replacement
**
,
rtx
));
*
find_fixup_replacement
PARAMS
((
struct
fixup_replacement
**
,
rtx
));
...
@@ -293,7 +292,7 @@ static int contains PARAMS ((rtx, varray_type));
...
@@ -293,7 +292,7 @@ static int contains PARAMS ((rtx, varray_type));
static
void
emit_return_into_block
PARAMS
((
basic_block
,
rtx
));
static
void
emit_return_into_block
PARAMS
((
basic_block
,
rtx
));
#endif
#endif
static
void
put_addressof_into_stack
PARAMS
((
rtx
,
struct
hash_table
*
));
static
void
put_addressof_into_stack
PARAMS
((
rtx
,
struct
hash_table
*
));
static
boolean
purge_addressof_1
PARAMS
((
rtx
*
,
rtx
,
int
,
int
,
static
boolean
purge_addressof_1
PARAMS
((
rtx
*
,
rtx
,
int
,
int
,
struct
hash_table
*
));
struct
hash_table
*
));
static
int
is_addressof
PARAMS
((
rtx
*
,
void
*
));
static
int
is_addressof
PARAMS
((
rtx
*
,
void
*
));
static
struct
hash_entry
*
insns_for_mem_newfunc
PARAMS
((
struct
hash_entry
*
,
static
struct
hash_entry
*
insns_for_mem_newfunc
PARAMS
((
struct
hash_entry
*
,
...
@@ -492,7 +491,6 @@ free_after_compilation (f)
...
@@ -492,7 +491,6 @@ free_after_compilation (f)
f
->
inl_last_parm_insn
=
NULL
;
f
->
inl_last_parm_insn
=
NULL
;
f
->
epilogue_delay_list
=
NULL
;
f
->
epilogue_delay_list
=
NULL
;
}
}
/* Allocate fixed slots in the stack frame of the current function. */
/* Allocate fixed slots in the stack frame of the current function. */
...
@@ -523,7 +521,7 @@ get_frame_size ()
...
@@ -523,7 +521,7 @@ get_frame_size ()
/* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
/* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
with machine mode MODE.
with machine mode MODE.
ALIGN controls the amount of alignment for the address of the slot:
ALIGN controls the amount of alignment for the address of the slot:
0 means according to MODE,
0 means according to MODE,
-1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
-1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
...
@@ -557,7 +555,7 @@ assign_stack_local_1 (mode, size, align, function)
...
@@ -557,7 +555,7 @@ assign_stack_local_1 (mode, size, align, function)
if
(
mode
==
BLKmode
)
if
(
mode
==
BLKmode
)
alignment
=
BIGGEST_ALIGNMENT
;
alignment
=
BIGGEST_ALIGNMENT
;
else
else
alignment
=
GET_MODE_ALIGNMENT
(
mode
);
alignment
=
GET_MODE_ALIGNMENT
(
mode
);
/* Allow the target to (possibly) increase the alignment of this
/* Allow the target to (possibly) increase the alignment of this
stack slot. */
stack slot. */
...
@@ -652,7 +650,7 @@ assign_stack_local (mode, size, align)
...
@@ -652,7 +650,7 @@ assign_stack_local (mode, size, align)
with this flag. KEEP is 2 if we allocate a longer term temporary,
with this flag. KEEP is 2 if we allocate a longer term temporary,
whose lifetime is controlled by CLEANUP_POINT_EXPRs. KEEP is 3
whose lifetime is controlled by CLEANUP_POINT_EXPRs. KEEP is 3
if we are to allocate something at an inner level to be treated as
if we are to allocate something at an inner level to be treated as
a variable in the block (e.g., a SAVE_EXPR).
a variable in the block (e.g., a SAVE_EXPR).
TYPE is the type that will be used for the stack slot. */
TYPE is the type that will be used for the stack slot. */
...
@@ -677,7 +675,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
...
@@ -677,7 +675,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
alias set for the memory. */
alias set for the memory. */
if
(
type
)
if
(
type
)
alias_set
=
get_alias_set
(
type
);
alias_set
=
get_alias_set
(
type
);
else
else
alias_set
=
0
;
alias_set
=
0
;
if
(
mode
==
BLKmode
)
if
(
mode
==
BLKmode
)
...
@@ -748,7 +746,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
...
@@ -748,7 +746,7 @@ assign_stack_temp_for_type (mode, size, keep, type)
p
=
best_p
;
p
=
best_p
;
}
}
/* If we still didn't find one, make a new temporary. */
/* If we still didn't find one, make a new temporary. */
if
(
p
==
0
)
if
(
p
==
0
)
{
{
...
@@ -913,7 +911,7 @@ combine_temp_slots ()
...
@@ -913,7 +911,7 @@ combine_temp_slots ()
if
(
flag_strict_aliasing
)
if
(
flag_strict_aliasing
)
return
;
return
;
/* If there are a lot of temp slots, don't do anything unless
/* If there are a lot of temp slots, don't do anything unless
high levels of optimizaton. */
high levels of optimizaton. */
if
(
!
flag_expensive_optimizations
)
if
(
!
flag_expensive_optimizations
)
for
(
p
=
temp_slots
,
num_slots
=
0
;
p
;
p
=
p
->
next
,
num_slots
++
)
for
(
p
=
temp_slots
,
num_slots
=
0
;
p
;
p
=
p
->
next
,
num_slots
++
)
...
@@ -1008,7 +1006,7 @@ find_temp_slot_from_address (x)
...
@@ -1008,7 +1006,7 @@ find_temp_slot_from_address (x)
return
0
;
return
0
;
}
}
/* Indicate that NEW is an alternate way of referring to the temp slot
/* Indicate that NEW is an alternate way of referring to the temp slot
that previously was known by OLD. */
that previously was known by OLD. */
...
@@ -1054,7 +1052,7 @@ update_temp_slot_address (old, new)
...
@@ -1054,7 +1052,7 @@ update_temp_slot_address (old, new)
return
;
return
;
}
}
/* Otherwise add an alias for the temp's address. */
/* Otherwise add an alias for the temp's address.
*/
else
if
(
p
->
address
==
0
)
else
if
(
p
->
address
==
0
)
p
->
address
=
new
;
p
->
address
=
new
;
else
else
...
@@ -1449,7 +1447,7 @@ put_var_into_stack (decl)
...
@@ -1449,7 +1447,7 @@ put_var_into_stack (decl)
}
}
else
else
return
;
return
;
if
(
current_function_check_memory_usage
)
if
(
current_function_check_memory_usage
)
emit_library_call
(
chkr_set_right_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_set_right_libfunc
,
1
,
VOIDmode
,
3
,
XEXP
(
reg
,
0
),
Pmode
,
XEXP
(
reg
,
0
),
Pmode
,
...
@@ -1556,7 +1554,7 @@ fixup_var_refs (var, promoted_mode, unsignedp, ht)
...
@@ -1556,7 +1554,7 @@ fixup_var_refs (var, promoted_mode, unsignedp, ht)
rtx
insn
;
rtx
insn
;
/* Must scan all insns for stack-refs that exceed the limit. */
/* Must scan all insns for stack-refs that exceed the limit. */
fixup_var_refs_insns
(
var
,
promoted_mode
,
unsignedp
,
first_insn
,
fixup_var_refs_insns
(
var
,
promoted_mode
,
unsignedp
,
first_insn
,
stack
==
0
,
ht
);
stack
==
0
,
ht
);
/* If there's a hash table, it must record all uses of VAR. */
/* If there's a hash table, it must record all uses of VAR. */
if
(
ht
)
if
(
ht
)
...
@@ -1581,16 +1579,14 @@ fixup_var_refs (var, promoted_mode, unsignedp, ht)
...
@@ -1581,16 +1579,14 @@ fixup_var_refs (var, promoted_mode, unsignedp, ht)
if
(
seq
!=
const0_rtx
&&
seq
!=
0
)
if
(
seq
!=
const0_rtx
&&
seq
!=
0
)
{
{
push_to_sequence
(
seq
);
push_to_sequence
(
seq
);
fixup_var_refs_insns
(
var
,
promoted_mode
,
unsignedp
,
seq
,
0
,
fixup_var_refs_insns
(
var
,
promoted_mode
,
unsignedp
,
seq
,
0
,
0
);
0
);
end_sequence
();
end_sequence
();
}
}
}
}
/* Scan the catch clauses for exception handling too. */
/* Scan the catch clauses for exception handling too. */
push_to_full_sequence
(
catch_clauses
,
catch_clauses_last
);
push_to_full_sequence
(
catch_clauses
,
catch_clauses_last
);
fixup_var_refs_insns
(
var
,
promoted_mode
,
unsignedp
,
catch_clauses
,
fixup_var_refs_insns
(
var
,
promoted_mode
,
unsignedp
,
catch_clauses
,
0
,
0
);
0
,
0
);
end_full_sequence
(
&
catch_clauses
,
&
catch_clauses_last
);
end_full_sequence
(
&
catch_clauses
,
&
catch_clauses_last
);
/* Scan sequences saved in CALL_PLACEHOLDERS too. */
/* Scan sequences saved in CALL_PLACEHOLDERS too. */
...
@@ -1666,7 +1662,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
...
@@ -1666,7 +1662,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
to walk the entire instruction chain. */
to walk the entire instruction chain. */
if
(
ht
)
if
(
ht
)
{
{
insn_list
=
((
struct
insns_for_mem_entry
*
)
insn_list
=
((
struct
insns_for_mem_entry
*
)
hash_lookup
(
ht
,
var
,
/*create=*/
0
,
/*copy=*/
0
))
->
insns
;
hash_lookup
(
ht
,
var
,
/*create=*/
0
,
/*copy=*/
0
))
->
insns
;
insn
=
insn_list
?
XEXP
(
insn_list
,
0
)
:
NULL_RTX
;
insn
=
insn_list
?
XEXP
(
insn_list
,
0
)
:
NULL_RTX
;
insn_list
=
XEXP
(
insn_list
,
1
);
insn_list
=
XEXP
(
insn_list
,
1
);
...
@@ -1687,7 +1683,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
...
@@ -1687,7 +1683,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
If it has a REG_LIBCALL note, delete the REG_LIBCALL
If it has a REG_LIBCALL note, delete the REG_LIBCALL
and REG_RETVAL notes too. */
and REG_RETVAL notes too. */
if
(
GET_CODE
(
PATTERN
(
insn
))
==
CLOBBER
if
(
GET_CODE
(
PATTERN
(
insn
))
==
CLOBBER
&&
(
XEXP
(
PATTERN
(
insn
),
0
)
==
var
&&
(
XEXP
(
PATTERN
(
insn
),
0
)
==
var
||
(
GET_CODE
(
XEXP
(
PATTERN
(
insn
),
0
))
==
CONCAT
||
(
GET_CODE
(
XEXP
(
PATTERN
(
insn
),
0
))
==
CONCAT
&&
(
XEXP
(
XEXP
(
PATTERN
(
insn
),
0
),
0
)
==
var
&&
(
XEXP
(
XEXP
(
PATTERN
(
insn
),
0
),
0
)
==
var
...
@@ -1765,7 +1761,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
...
@@ -1765,7 +1761,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
PATTERN
(
insn
)
=
replace_rtx
(
PATTERN
(
insn
),
PATTERN
(
insn
)
=
replace_rtx
(
PATTERN
(
insn
),
call_dest
,
temp
);
call_dest
,
temp
);
}
}
if
(
GET_CODE
(
insn
)
==
CALL_INSN
if
(
GET_CODE
(
insn
)
==
CALL_INSN
&&
GET_CODE
(
PATTERN
(
insn
))
==
SET
)
&&
GET_CODE
(
PATTERN
(
insn
))
==
SET
)
call_dest
=
SET_DEST
(
PATTERN
(
insn
));
call_dest
=
SET_DEST
(
PATTERN
(
insn
));
...
@@ -1784,7 +1780,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
...
@@ -1784,7 +1780,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
a list of struct fixup_replacements. If fixup_var_refs_1
a list of struct fixup_replacements. If fixup_var_refs_1
needs to allocate pseudos or replacement MEMs (for SUBREGs),
needs to allocate pseudos or replacement MEMs (for SUBREGs),
it will record them in this list.
it will record them in this list.
If it allocated a pseudo for any replacement, we copy into
If it allocated a pseudo for any replacement, we copy into
it here. */
it here. */
...
@@ -1846,7 +1842,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
...
@@ -1846,7 +1842,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
if
(
GET_CODE
(
note
)
!=
INSN_LIST
)
if
(
GET_CODE
(
note
)
!=
INSN_LIST
)
XEXP
(
note
,
0
)
XEXP
(
note
,
0
)
=
walk_fixup_memory_subreg
(
XEXP
(
note
,
0
),
insn
,
1
);
=
walk_fixup_memory_subreg
(
XEXP
(
note
,
0
),
insn
,
1
);
note
=
XEXP
(
note
,
1
);
note
=
XEXP
(
note
,
1
);
}
}
}
}
...
@@ -1863,7 +1859,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
...
@@ -1863,7 +1859,7 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
}
}
/* VAR is a MEM that used to be a pseudo register with mode PROMOTED_MODE.
/* VAR is a MEM that used to be a pseudo register with mode PROMOTED_MODE.
See if the rtx expression at *LOC in INSN needs to be changed.
See if the rtx expression at *LOC in INSN needs to be changed.
REPLACEMENTS is a pointer to a list head that starts out zero, but may
REPLACEMENTS is a pointer to a list head that starts out zero, but may
contain a list of original rtx's and replacements. If we find that we need
contain a list of original rtx's and replacements. If we find that we need
...
@@ -1941,7 +1937,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -1941,7 +1937,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
case
MEM
:
case
MEM
:
if
(
var
==
x
)
if
(
var
==
x
)
{
{
/* If we already have a replacement, use it. Otherwise,
/* If we already have a replacement, use it. Otherwise,
try to fix up this address in case it is invalid. */
try to fix up this address in case it is invalid. */
replacement
=
find_fixup_replacement
(
replacements
,
var
);
replacement
=
find_fixup_replacement
(
replacements
,
var
);
...
@@ -1955,7 +1951,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -1955,7 +1951,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
/* Unless we are forcing memory to register or we changed the mode,
/* Unless we are forcing memory to register or we changed the mode,
we can leave things the way they are if the insn is valid. */
we can leave things the way they are if the insn is valid. */
INSN_CODE
(
insn
)
=
-
1
;
INSN_CODE
(
insn
)
=
-
1
;
if
(
!
flag_force_mem
&&
GET_MODE
(
x
)
==
promoted_mode
if
(
!
flag_force_mem
&&
GET_MODE
(
x
)
==
promoted_mode
&&
recog_memoized
(
insn
)
>=
0
)
&&
recog_memoized
(
insn
)
>=
0
)
...
@@ -2093,7 +2089,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2093,7 +2089,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
return
;
return
;
}
}
break
;
break
;
case
SUBREG
:
case
SUBREG
:
if
(
SUBREG_REG
(
x
)
==
var
)
if
(
SUBREG_REG
(
x
)
==
var
)
{
{
...
@@ -2110,7 +2106,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2110,7 +2106,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
}
}
/* If this SUBREG makes VAR wider, it has become a paradoxical
/* If this SUBREG makes VAR wider, it has become a paradoxical
SUBREG with VAR in memory, but these aren't allowed at this
SUBREG with VAR in memory, but these aren't allowed at this
stage of the compilation. So load VAR into a pseudo and take
stage of the compilation. So load VAR into a pseudo and take
a SUBREG of that pseudo. */
a SUBREG of that pseudo. */
if
(
GET_MODE_SIZE
(
GET_MODE
(
x
))
>
GET_MODE_SIZE
(
GET_MODE
(
var
)))
if
(
GET_MODE_SIZE
(
GET_MODE
(
x
))
>
GET_MODE_SIZE
(
GET_MODE
(
var
)))
...
@@ -2132,7 +2128,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2132,7 +2128,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
*
loc
=
replacement
->
new
;
*
loc
=
replacement
->
new
;
return
;
return
;
}
}
replacement
->
new
=
*
loc
=
fixup_memory_subreg
(
x
,
insn
,
0
);
replacement
->
new
=
*
loc
=
fixup_memory_subreg
(
x
,
insn
,
0
);
INSN_CODE
(
insn
)
=
-
1
;
INSN_CODE
(
insn
)
=
-
1
;
...
@@ -2182,7 +2178,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2182,7 +2178,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
insn
);
insn
);
break
;
break
;
}
}
{
{
rtx
dest
=
SET_DEST
(
x
);
rtx
dest
=
SET_DEST
(
x
);
rtx
src
=
SET_SRC
(
x
);
rtx
src
=
SET_SRC
(
x
);
...
@@ -2201,7 +2197,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2201,7 +2197,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
/* If VAR does not appear at the top level of the SET
/* If VAR does not appear at the top level of the SET
just scan the lower levels of the tree. */
just scan the lower levels of the tree. */
if
(
src
!=
var
&&
dest
!=
var
)
if
(
src
!=
var
&&
dest
!=
var
)
break
;
break
;
/* We will need to rerecognize this insn. */
/* We will need to rerecognize this insn. */
...
@@ -2265,10 +2261,10 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2265,10 +2261,10 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
INSN_CODE
(
insn
)
=
-
1
;
INSN_CODE
(
insn
)
=
-
1
;
XEXP
(
outerdest
,
0
)
=
newmem
;
XEXP
(
outerdest
,
0
)
=
newmem
;
XEXP
(
outerdest
,
2
)
=
GEN_INT
(
pos
);
XEXP
(
outerdest
,
2
)
=
GEN_INT
(
pos
);
if
(
recog_memoized
(
insn
)
>=
0
)
if
(
recog_memoized
(
insn
)
>=
0
)
return
;
return
;
/* Otherwise, restore old position. XEXP (x, 0) will be
/* Otherwise, restore old position. XEXP (x, 0) will be
restored later. */
restored later. */
XEXP
(
outerdest
,
2
)
=
old_pos
;
XEXP
(
outerdest
,
2
)
=
old_pos
;
...
@@ -2333,7 +2329,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
...
@@ -2333,7 +2329,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
copy SET_SRC (x) to SET_DEST (x) in some way. So
copy SET_SRC (x) to SET_DEST (x) in some way. So
we generate the move and see whether it requires more
we generate the move and see whether it requires more
than one insn. If it does, we emit those insns and
than one insn. If it does, we emit those insns and
delete INSN. Otherwise, we an just replace the pattern
delete INSN. Otherwise, we an just replace the pattern
of INSN; we have already verified above that INSN has
of INSN; we have already verified above that INSN has
no other function that to do X. */
no other function that to do X. */
...
@@ -2485,7 +2481,7 @@ fixup_memory_subreg (x, insn, uncritical)
...
@@ -2485,7 +2481,7 @@ fixup_memory_subreg (x, insn, uncritical)
If X itself is a (SUBREG (MEM ...) ...), return the replacement expression.
If X itself is a (SUBREG (MEM ...) ...), return the replacement expression.
Otherwise return X, with its contents possibly altered.
Otherwise return X, with its contents possibly altered.
If any insns must be emitted to compute NEWADDR, put them before INSN.
If any insns must be emitted to compute NEWADDR, put them before INSN.
UNCRITICAL is as in fixup_memory_subreg. */
UNCRITICAL is as in fixup_memory_subreg. */
...
@@ -2777,7 +2773,7 @@ static int cfa_offset;
...
@@ -2777,7 +2773,7 @@ static int cfa_offset;
/* The bottom of the stack points to the actual arguments. If
/* The bottom of the stack points to the actual arguments. If
REG_PARM_STACK_SPACE is defined, this includes the space for the register
REG_PARM_STACK_SPACE is defined, this includes the space for the register
parameters. However, if OUTGOING_REG_PARM_STACK space is not defined,
parameters. However, if OUTGOING_REG_PARM_STACK space is not defined,
stack space for register parameters is not pushed by the caller, but
stack space for register parameters is not pushed by the caller, but
rather part of the fixed stack areas and hence not included in
rather part of the fixed stack areas and hence not included in
`current_function_outgoing_args_size'. Nevertheless, we must allow
`current_function_outgoing_args_size'. Nevertheless, we must allow
for it when allocating stack dynamic objects. */
for it when allocating stack dynamic objects. */
...
@@ -2801,7 +2797,6 @@ static int cfa_offset;
...
@@ -2801,7 +2797,6 @@ static int cfa_offset;
#define ARG_POINTER_CFA_OFFSET(FNDECL) FIRST_PARM_OFFSET (FNDECL)
#define ARG_POINTER_CFA_OFFSET(FNDECL) FIRST_PARM_OFFSET (FNDECL)
#endif
#endif
/* Build up a (MEM (ADDRESSOF (REG))) rtx for a register REG that just had
/* Build up a (MEM (ADDRESSOF (REG))) rtx for a register REG that just had
its address taken. DECL is the decl for the object stored in the
its address taken. DECL is the decl for the object stored in the
register, for later use if we do need to force REG into the stack.
register, for later use if we do need to force REG into the stack.
...
@@ -2899,7 +2894,7 @@ static rtx purge_bitfield_addressof_replacements;
...
@@ -2899,7 +2894,7 @@ static rtx purge_bitfield_addressof_replacements;
corresponding (ADDRESSOF (REG ...)) and value is a substitution for
corresponding (ADDRESSOF (REG ...)) and value is a substitution for
the all pattern. List PURGE_BITFIELD_ADDRESSOF_REPLACEMENTS is not
the all pattern. List PURGE_BITFIELD_ADDRESSOF_REPLACEMENTS is not
enough in complex cases, e.g. when some field values can be
enough in complex cases, e.g. when some field values can be
extracted by usage MEM with narrower mode. */
extracted by usage MEM with narrower mode.
*/
static
rtx
purge_addressof_replacements
;
static
rtx
purge_addressof_replacements
;
/* Helper function for purge_addressof. See if the rtx expression at *LOC
/* Helper function for purge_addressof. See if the rtx expression at *LOC
...
@@ -2949,7 +2944,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
...
@@ -2949,7 +2944,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
if
(
validate_change
(
insn
,
loc
,
sub
,
0
)
if
(
validate_change
(
insn
,
loc
,
sub
,
0
)
||
validate_replace_rtx
(
x
,
sub
,
insn
))
||
validate_replace_rtx
(
x
,
sub
,
insn
))
return
true
;
return
true
;
start_sequence
();
start_sequence
();
sub
=
force_operand
(
sub
,
NULL_RTX
);
sub
=
force_operand
(
sub
,
NULL_RTX
);
if
(
!
validate_change
(
insn
,
loc
,
sub
,
0
)
if
(
!
validate_change
(
insn
,
loc
,
sub
,
0
)
...
@@ -2996,7 +2991,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
...
@@ -2996,7 +2991,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
return
true
;
return
true
;
}
}
/* See comment for purge_addressof_replacements. */
/* See comment for purge_addressof_replacements.
*/
for
(
tem
=
purge_addressof_replacements
;
for
(
tem
=
purge_addressof_replacements
;
tem
!=
NULL_RTX
;
tem
!=
NULL_RTX
;
tem
=
XEXP
(
XEXP
(
tem
,
1
),
1
))
tem
=
XEXP
(
XEXP
(
tem
,
1
),
1
))
...
@@ -3012,17 +3007,17 @@ purge_addressof_1 (loc, insn, force, store, ht)
...
@@ -3012,17 +3007,17 @@ purge_addressof_1 (loc, insn, force, store, ht)
/* It can happen that the note may speak of things
/* It can happen that the note may speak of things
in a wider (or just different) mode than the
in a wider (or just different) mode than the
code did. This is especially true of
code did. This is especially true of
REG_RETVAL. */
REG_RETVAL.
*/
if
(
GET_CODE
(
z
)
==
SUBREG
&&
SUBREG_WORD
(
z
)
==
0
)
if
(
GET_CODE
(
z
)
==
SUBREG
&&
SUBREG_WORD
(
z
)
==
0
)
z
=
SUBREG_REG
(
z
);
z
=
SUBREG_REG
(
z
);
if
(
GET_MODE_SIZE
(
GET_MODE
(
x
))
>
UNITS_PER_WORD
if
(
GET_MODE_SIZE
(
GET_MODE
(
x
))
>
UNITS_PER_WORD
&&
(
GET_MODE_SIZE
(
GET_MODE
(
x
))
&&
(
GET_MODE_SIZE
(
GET_MODE
(
x
))
>
GET_MODE_SIZE
(
GET_MODE
(
z
))))
>
GET_MODE_SIZE
(
GET_MODE
(
z
))))
{
{
/* This can occur as a result in invalid
/* This can occur as a result in invalid
pointer casts, e.g. float f; ...
pointer casts, e.g. float f; ...
*(long long int *)&f.
*(long long int *)&f.
??? We could emit a warning here, but
??? We could emit a warning here, but
without a line number that wouldn't be
without a line number that wouldn't be
...
@@ -3075,9 +3070,9 @@ purge_addressof_1 (loc, insn, force, store, ht)
...
@@ -3075,9 +3070,9 @@ purge_addressof_1 (loc, insn, force, store, ht)
seq
=
gen_sequence
();
seq
=
gen_sequence
();
end_sequence
();
end_sequence
();
emit_insn_before
(
seq
,
insn
);
emit_insn_before
(
seq
,
insn
);
compute_insns_for_mem
(
p
?
NEXT_INSN
(
p
)
:
get_insns
(),
compute_insns_for_mem
(
p
?
NEXT_INSN
(
p
)
:
get_insns
(),
insn
,
ht
);
insn
,
ht
);
start_sequence
();
start_sequence
();
store_bit_field
(
sub
,
size_x
,
0
,
GET_MODE
(
x
),
store_bit_field
(
sub
,
size_x
,
0
,
GET_MODE
(
x
),
val
,
GET_MODE_SIZE
(
GET_MODE
(
sub
)),
val
,
GET_MODE_SIZE
(
GET_MODE
(
sub
)),
...
@@ -3091,7 +3086,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
...
@@ -3091,7 +3086,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
end_sequence
();
end_sequence
();
p
=
emit_insn_after
(
seq
,
insn
);
p
=
emit_insn_after
(
seq
,
insn
);
if
(
NEXT_INSN
(
insn
))
if
(
NEXT_INSN
(
insn
))
compute_insns_for_mem
(
NEXT_INSN
(
insn
),
compute_insns_for_mem
(
NEXT_INSN
(
insn
),
p
?
NEXT_INSN
(
p
)
:
NULL_RTX
,
p
?
NEXT_INSN
(
p
)
:
NULL_RTX
,
ht
);
ht
);
}
}
...
@@ -3173,7 +3168,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
...
@@ -3173,7 +3168,7 @@ purge_addressof_1 (loc, insn, force, store, ht)
return
result
;
return
result
;
}
}
/* Scan all subexpressions. */
/* Scan all subexpressions.
*/
fmt
=
GET_RTX_FORMAT
(
code
);
fmt
=
GET_RTX_FORMAT
(
code
);
for
(
i
=
0
;
i
<
GET_RTX_LENGTH
(
code
);
i
++
,
fmt
++
)
for
(
i
=
0
;
i
<
GET_RTX_LENGTH
(
code
);
i
++
,
fmt
++
)
{
{
...
@@ -3249,7 +3244,7 @@ insns_for_mem_walk (r, data)
...
@@ -3249,7 +3244,7 @@ insns_for_mem_walk (r, data)
rtx
*
r
;
rtx
*
r
;
void
*
data
;
void
*
data
;
{
{
struct
insns_for_mem_walk_info
*
ifmwi
struct
insns_for_mem_walk_info
*
ifmwi
=
(
struct
insns_for_mem_walk_info
*
)
data
;
=
(
struct
insns_for_mem_walk_info
*
)
data
;
if
(
ifmwi
->
pass
==
0
&&
*
r
&&
GET_CODE
(
*
r
)
==
ADDRESSOF
if
(
ifmwi
->
pass
==
0
&&
*
r
&&
GET_CODE
(
*
r
)
==
ADDRESSOF
...
@@ -3258,7 +3253,7 @@ insns_for_mem_walk (r, data)
...
@@ -3258,7 +3253,7 @@ insns_for_mem_walk (r, data)
else
if
(
ifmwi
->
pass
==
1
&&
*
r
&&
GET_CODE
(
*
r
)
==
REG
)
else
if
(
ifmwi
->
pass
==
1
&&
*
r
&&
GET_CODE
(
*
r
)
==
REG
)
{
{
/* Lookup this MEM in the hashtable, creating it if necessary. */
/* Lookup this MEM in the hashtable, creating it if necessary. */
struct
insns_for_mem_entry
*
ifme
struct
insns_for_mem_entry
*
ifme
=
(
struct
insns_for_mem_entry
*
)
hash_lookup
(
ifmwi
->
ht
,
=
(
struct
insns_for_mem_entry
*
)
hash_lookup
(
ifmwi
->
ht
,
*
r
,
*
r
,
/*create=*/
0
,
/*create=*/
0
,
...
@@ -3273,7 +3268,7 @@ insns_for_mem_walk (r, data)
...
@@ -3273,7 +3268,7 @@ insns_for_mem_walk (r, data)
the hash table since this memory will not be used once
the hash table since this memory will not be used once
the hash table is deallocated. */
the hash table is deallocated. */
push_obstacks
(
&
ifmwi
->
ht
->
memory
,
&
ifmwi
->
ht
->
memory
);
push_obstacks
(
&
ifmwi
->
ht
->
memory
,
&
ifmwi
->
ht
->
memory
);
ifme
->
insns
=
gen_rtx_EXPR_LIST
(
VOIDmode
,
ifmwi
->
insn
,
ifme
->
insns
=
gen_rtx_EXPR_LIST
(
VOIDmode
,
ifmwi
->
insn
,
ifme
->
insns
);
ifme
->
insns
);
pop_obstacks
();
pop_obstacks
();
}
}
...
@@ -3308,10 +3303,10 @@ compute_insns_for_mem (insns, last_insn, ht)
...
@@ -3308,10 +3303,10 @@ compute_insns_for_mem (insns, last_insn, ht)
Returns true iff the rtl is an ADDRESSOF. */
Returns true iff the rtl is an ADDRESSOF. */
static
int
static
int
is_addressof
(
rtl
,
data
)
is_addressof
(
rtl
,
data
)
rtx
*
rtl
;
rtx
*
rtl
;
void
*
data
ATTRIBUTE_UNUSED
;
void
*
data
ATTRIBUTE_UNUSED
;
{
{
return
GET_CODE
(
*
rtl
)
==
ADDRESSOF
;
return
GET_CODE
(
*
rtl
)
==
ADDRESSOF
;
}
}
/* Eliminate all occurrences of ADDRESSOF from INSNS. Elide any remaining
/* Eliminate all occurrences of ADDRESSOF from INSNS. Elide any remaining
...
@@ -3324,7 +3319,7 @@ purge_addressof (insns)
...
@@ -3324,7 +3319,7 @@ purge_addressof (insns)
{
{
rtx
insn
;
rtx
insn
;
struct
hash_table
ht
;
struct
hash_table
ht
;
/* When we actually purge ADDRESSOFs, we turn REGs into MEMs. That
/* When we actually purge ADDRESSOFs, we turn REGs into MEMs. That
requires a fixup pass over the instruction stream to correct
requires a fixup pass over the instruction stream to correct
INSNs that depended on the REG being a REG, and not a MEM. But,
INSNs that depended on the REG being a REG, and not a MEM. But,
...
@@ -3332,7 +3327,7 @@ purge_addressof (insns)
...
@@ -3332,7 +3327,7 @@ purge_addressof (insns)
mentioned in very many instructions. So, we speed up the process
mentioned in very many instructions. So, we speed up the process
by pre-calculating which REGs occur in which INSNs; that allows
by pre-calculating which REGs occur in which INSNs; that allows
us to perform the fixup passes much more quickly. */
us to perform the fixup passes much more quickly. */
hash_table_init
(
&
ht
,
hash_table_init
(
&
ht
,
insns_for_mem_newfunc
,
insns_for_mem_newfunc
,
insns_for_mem_hash
,
insns_for_mem_hash
,
insns_for_mem_comp
);
insns_for_mem_comp
);
...
@@ -3347,7 +3342,7 @@ purge_addressof (insns)
...
@@ -3347,7 +3342,7 @@ purge_addressof (insns)
/* If we could not replace the ADDRESSOFs in the insn,
/* If we could not replace the ADDRESSOFs in the insn,
something is wrong. */
something is wrong. */
abort
();
abort
();
if
(
!
purge_addressof_1
(
&
REG_NOTES
(
insn
),
NULL_RTX
,
0
,
0
,
&
ht
))
if
(
!
purge_addressof_1
(
&
REG_NOTES
(
insn
),
NULL_RTX
,
0
,
0
,
&
ht
))
{
{
/* If we could not replace the ADDRESSOFs in the insn's notes,
/* If we could not replace the ADDRESSOFs in the insn's notes,
...
@@ -3362,7 +3357,7 @@ purge_addressof (insns)
...
@@ -3362,7 +3357,7 @@ purge_addressof (insns)
safe to delete the notes here, and instead we abort. */
safe to delete the notes here, and instead we abort. */
if
(
REG_NOTE_KIND
(
note
)
==
REG_RETVAL
)
if
(
REG_NOTE_KIND
(
note
)
==
REG_RETVAL
)
abort
();
abort
();
if
(
for_each_rtx
(
&
note
,
is_addressof
,
NULL
))
if
(
for_each_rtx
(
&
note
,
is_addressof
,
NULL
))
remove_note
(
insn
,
note
);
remove_note
(
insn
,
note
);
}
}
}
}
...
@@ -3465,7 +3460,7 @@ instantiate_decls (fndecl, valid_only)
...
@@ -3465,7 +3460,7 @@ instantiate_decls (fndecl, valid_only)
{
{
HOST_WIDE_INT
size
=
int_size_in_bytes
(
TREE_TYPE
(
decl
));
HOST_WIDE_INT
size
=
int_size_in_bytes
(
TREE_TYPE
(
decl
));
instantiate_decl
(
DECL_RTL
(
decl
),
size
,
valid_only
);
instantiate_decl
(
DECL_RTL
(
decl
),
size
,
valid_only
);
/* If the parameter was promoted, then the incoming RTL mode may be
/* If the parameter was promoted, then the incoming RTL mode may be
larger than the declared type size. We must use the larger of
larger than the declared type size. We must use the larger of
...
@@ -3581,7 +3576,7 @@ instantiate_decl (x, size, valid_only)
...
@@ -3581,7 +3576,7 @@ instantiate_decl (x, size, valid_only)
is not valid.
is not valid.
Return 1 if we either had nothing to do or if we were able to do the
Return 1 if we either had nothing to do or if we were able to do the
needed replacement. Return 0 otherwise; we only return zero if
needed replacement. Return 0 otherwise; we only return zero if
EXTRA_INSNS is zero.
EXTRA_INSNS is zero.
We first try some simple transformations to avoid the creation of extra
We first try some simple transformations to avoid the creation of extra
...
@@ -3633,15 +3628,15 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3633,15 +3628,15 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
appropriate offset. This is used, for example, in the handling
appropriate offset. This is used, for example, in the handling
of non-local gotos. */
of non-local gotos. */
if
(
SET_DEST
(
x
)
==
virtual_incoming_args_rtx
)
if
(
SET_DEST
(
x
)
==
virtual_incoming_args_rtx
)
new
=
arg_pointer_rtx
,
offset
=
-
in_arg_offset
;
new
=
arg_pointer_rtx
,
offset
=
-
in_arg_offset
;
else
if
(
SET_DEST
(
x
)
==
virtual_stack_vars_rtx
)
else
if
(
SET_DEST
(
x
)
==
virtual_stack_vars_rtx
)
new
=
frame_pointer_rtx
,
offset
=
-
var_offset
;
new
=
frame_pointer_rtx
,
offset
=
-
var_offset
;
else
if
(
SET_DEST
(
x
)
==
virtual_stack_dynamic_rtx
)
else
if
(
SET_DEST
(
x
)
==
virtual_stack_dynamic_rtx
)
new
=
stack_pointer_rtx
,
offset
=
-
dynamic_offset
;
new
=
stack_pointer_rtx
,
offset
=
-
dynamic_offset
;
else
if
(
SET_DEST
(
x
)
==
virtual_outgoing_args_rtx
)
else
if
(
SET_DEST
(
x
)
==
virtual_outgoing_args_rtx
)
new
=
stack_pointer_rtx
,
offset
=
-
out_arg_offset
;
new
=
stack_pointer_rtx
,
offset
=
-
out_arg_offset
;
else
if
(
SET_DEST
(
x
)
==
virtual_cfa_rtx
)
else
if
(
SET_DEST
(
x
)
==
virtual_cfa_rtx
)
new
=
arg_pointer_rtx
,
offset
=
-
cfa_offset
;
new
=
arg_pointer_rtx
,
offset
=
-
cfa_offset
;
if
(
new
)
if
(
new
)
{
{
...
@@ -3697,7 +3692,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3697,7 +3692,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
else
if
(
inner
==
virtual_outgoing_args_rtx
)
else
if
(
inner
==
virtual_outgoing_args_rtx
)
new
=
stack_pointer_rtx
,
offset
=
out_arg_offset
;
new
=
stack_pointer_rtx
,
offset
=
out_arg_offset
;
else
if
(
inner
==
virtual_cfa_rtx
)
else
if
(
inner
==
virtual_cfa_rtx
)
new
=
arg_pointer_rtx
,
offset
=
cfa_offset
;
new
=
arg_pointer_rtx
,
offset
=
cfa_offset
;
else
else
{
{
loc
=
&
XEXP
(
x
,
0
);
loc
=
&
XEXP
(
x
,
0
);
...
@@ -3717,8 +3712,8 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3717,8 +3712,8 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
new
=
stack_pointer_rtx
,
offset
=
dynamic_offset
;
new
=
stack_pointer_rtx
,
offset
=
dynamic_offset
;
else
if
(
XEXP
(
x
,
0
)
==
virtual_outgoing_args_rtx
)
else
if
(
XEXP
(
x
,
0
)
==
virtual_outgoing_args_rtx
)
new
=
stack_pointer_rtx
,
offset
=
out_arg_offset
;
new
=
stack_pointer_rtx
,
offset
=
out_arg_offset
;
else
if
(
XEXP
(
x
,
0
)
==
virtual_cfa_rtx
)
else
if
(
XEXP
(
x
,
0
)
==
virtual_cfa_rtx
)
new
=
arg_pointer_rtx
,
offset
=
cfa_offset
;
new
=
arg_pointer_rtx
,
offset
=
cfa_offset
;
else
else
{
{
/* We know the second operand is a constant. Unless the
/* We know the second operand is a constant. Unless the
...
@@ -3811,12 +3806,12 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3811,12 +3806,12 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
/* Most cases of MEM that convert to valid addresses have already been
/* Most cases of MEM that convert to valid addresses have already been
handled by our scan of decls. The only special handling we
handled by our scan of decls. The only special handling we
need here is to make a copy of the rtx to ensure it isn't being
need here is to make a copy of the rtx to ensure it isn't being
shared if we have to change it to a pseudo.
shared if we have to change it to a pseudo.
If the rtx is a simple reference to an address via a virtual register,
If the rtx is a simple reference to an address via a virtual register,
it can potentially be shared. In such cases, first try to make it
it can potentially be shared. In such cases, first try to make it
a valid address, which can also be shared. Otherwise, copy it and
a valid address, which can also be shared. Otherwise, copy it and
proceed normally.
proceed normally.
First check for common cases that need no processing. These are
First check for common cases that need no processing. These are
usually due to instantiation already being done on a previous instance
usually due to instantiation already being done on a previous instance
...
@@ -3902,7 +3897,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3902,7 +3897,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
case
CLOBBER
:
case
CLOBBER
:
/* If the operand is a MEM, see if the change is a valid MEM. If not,
/* If the operand is a MEM, see if the change is a valid MEM. If not,
go ahead and make the invalid one, but do it to a copy. For a REG,
go ahead and make the invalid one, but do it to a copy. For a REG,
just make the recursive call, since there's no chance of a problem. */
just make the recursive call, since there's no chance of a problem.
*/
if
((
GET_CODE
(
XEXP
(
x
,
0
))
==
MEM
if
((
GET_CODE
(
XEXP
(
x
,
0
))
==
MEM
&&
instantiate_virtual_regs_1
(
&
XEXP
(
XEXP
(
x
,
0
),
0
),
XEXP
(
x
,
0
),
&&
instantiate_virtual_regs_1
(
&
XEXP
(
XEXP
(
x
,
0
),
0
),
XEXP
(
x
,
0
),
...
@@ -3927,7 +3922,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3927,7 +3922,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
else
if
(
x
==
virtual_outgoing_args_rtx
)
else
if
(
x
==
virtual_outgoing_args_rtx
)
new
=
stack_pointer_rtx
,
offset
=
out_arg_offset
;
new
=
stack_pointer_rtx
,
offset
=
out_arg_offset
;
else
if
(
x
==
virtual_cfa_rtx
)
else
if
(
x
==
virtual_cfa_rtx
)
new
=
arg_pointer_rtx
,
offset
=
cfa_offset
;
new
=
arg_pointer_rtx
,
offset
=
cfa_offset
;
if
(
new
)
if
(
new
)
{
{
...
@@ -3964,7 +3959,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
...
@@ -3964,7 +3959,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
return
1
;
return
1
;
}
}
break
;
break
;
default
:
default
:
break
;
break
;
}
}
...
@@ -4136,7 +4131,7 @@ assign_parms (fndecl)
...
@@ -4136,7 +4131,7 @@ assign_parms (fndecl)
tree
fnargs
=
DECL_ARGUMENTS
(
fndecl
);
tree
fnargs
=
DECL_ARGUMENTS
(
fndecl
);
/* This is used for the arg pointer when referring to stack args. */
/* This is used for the arg pointer when referring to stack args. */
rtx
internal_arg_pointer
;
rtx
internal_arg_pointer
;
/* This is a dummy PARM_DECL that we used for the function result if
/* This is a dummy PARM_DECL that we used for the function result if
the function returns a structure. */
the function returns a structure. */
tree
function_result_decl
=
0
;
tree
function_result_decl
=
0
;
#ifdef SETUP_INCOMING_VARARGS
#ifdef SETUP_INCOMING_VARARGS
...
@@ -4197,7 +4192,7 @@ assign_parms (fndecl)
...
@@ -4197,7 +4192,7 @@ assign_parms (fndecl)
TREE_CHAIN
(
function_result_decl
)
=
fnargs
;
TREE_CHAIN
(
function_result_decl
)
=
fnargs
;
fnargs
=
function_result_decl
;
fnargs
=
function_result_decl
;
}
}
max_parm_reg
=
LAST_VIRTUAL_REGISTER
+
1
;
max_parm_reg
=
LAST_VIRTUAL_REGISTER
+
1
;
parm_reg_stack_loc
=
(
rtx
*
)
xcalloc
(
max_parm_reg
,
sizeof
(
rtx
));
parm_reg_stack_loc
=
(
rtx
*
)
xcalloc
(
max_parm_reg
,
sizeof
(
rtx
));
...
@@ -4357,7 +4352,7 @@ assign_parms (fndecl)
...
@@ -4357,7 +4352,7 @@ assign_parms (fndecl)
#endif
#endif
#endif
#endif
fndecl
,
&
stack_args_size
,
&
stack_offset
,
&
arg_size
,
fndecl
,
&
stack_args_size
,
&
stack_offset
,
&
arg_size
,
&
alignment_pad
);
&
alignment_pad
);
{
{
rtx
offset_rtx
=
ARGS_SIZE_RTX
(
stack_offset
);
rtx
offset_rtx
=
ARGS_SIZE_RTX
(
stack_offset
);
...
@@ -4405,7 +4400,7 @@ assign_parms (fndecl)
...
@@ -4405,7 +4400,7 @@ assign_parms (fndecl)
emit_group_store
(
validize_mem
(
stack_parm
),
entry_parm
,
emit_group_store
(
validize_mem
(
stack_parm
),
entry_parm
,
int_size_in_bytes
(
TREE_TYPE
(
parm
)),
int_size_in_bytes
(
TREE_TYPE
(
parm
)),
TYPE_ALIGN
(
TREE_TYPE
(
parm
)));
TYPE_ALIGN
(
TREE_TYPE
(
parm
)));
else
else
move_block_from_reg
(
REGNO
(
entry_parm
),
move_block_from_reg
(
REGNO
(
entry_parm
),
validize_mem
(
stack_parm
),
nregs
,
validize_mem
(
stack_parm
),
nregs
,
...
@@ -4579,7 +4574,7 @@ assign_parms (fndecl)
...
@@ -4579,7 +4574,7 @@ assign_parms (fndecl)
{
{
int
save_tree_used
;
int
save_tree_used
;
/* ENTRY_PARM has been converted to PROMOTED_MODE, its
/* ENTRY_PARM has been converted to PROMOTED_MODE, its
mode, by the caller. We now have to convert it to
mode, by the caller. We now have to convert it to
NOMINAL_MODE, if different. However, PARMREG may be in
NOMINAL_MODE, if different. However, PARMREG may be in
a different mode than NOMINAL_MODE if it is being stored
a different mode than NOMINAL_MODE if it is being stored
promoted.
promoted.
...
@@ -4692,7 +4687,7 @@ assign_parms (fndecl)
...
@@ -4692,7 +4687,7 @@ assign_parms (fndecl)
#endif
/* FUNCTION_ARG_CALLEE_COPIES */
#endif
/* FUNCTION_ARG_CALLEE_COPIES */
/* In any case, record the parm's desired stack location
/* In any case, record the parm's desired stack location
in case we later discover it must live in the stack.
in case we later discover it must live in the stack.
If it is a COMPLEX value, store the stack location for both
If it is a COMPLEX value, store the stack location for both
halves. */
halves. */
...
@@ -4781,7 +4776,7 @@ assign_parms (fndecl)
...
@@ -4781,7 +4776,7 @@ assign_parms (fndecl)
}
}
else
if
((
set
=
single_set
(
linsn
))
!=
0
else
if
((
set
=
single_set
(
linsn
))
!=
0
&&
SET_DEST
(
set
)
==
parmreg
)
&&
SET_DEST
(
set
)
==
parmreg
)
REG_NOTES
(
linsn
)
REG_NOTES
(
linsn
)
=
gen_rtx_EXPR_LIST
(
REG_EQUIV
,
=
gen_rtx_EXPR_LIST
(
REG_EQUIV
,
stack_parm
,
REG_NOTES
(
linsn
));
stack_parm
,
REG_NOTES
(
linsn
));
}
}
...
@@ -4845,7 +4840,7 @@ assign_parms (fndecl)
...
@@ -4845,7 +4840,7 @@ assign_parms (fndecl)
push_to_sequence
(
conversion_insns
);
push_to_sequence
(
conversion_insns
);
emit_library_call
(
chkr_set_right_libfunc
,
1
,
VOIDmode
,
3
,
emit_library_call
(
chkr_set_right_libfunc
,
1
,
VOIDmode
,
3
,
XEXP
(
stack_parm
,
0
),
Pmode
,
XEXP
(
stack_parm
,
0
),
Pmode
,
GEN_INT
(
GET_MODE_SIZE
(
GET_MODE
GEN_INT
(
GET_MODE_SIZE
(
GET_MODE
(
entry_parm
))),
(
entry_parm
))),
TYPE_MODE
(
sizetype
),
TYPE_MODE
(
sizetype
),
GEN_INT
(
MEMORY_USE_RW
),
GEN_INT
(
MEMORY_USE_RW
),
...
@@ -4856,7 +4851,7 @@ assign_parms (fndecl)
...
@@ -4856,7 +4851,7 @@ assign_parms (fndecl)
}
}
DECL_RTL
(
parm
)
=
stack_parm
;
DECL_RTL
(
parm
)
=
stack_parm
;
}
}
/* If this "parameter" was the place where we are receiving the
/* If this "parameter" was the place where we are receiving the
function's incoming structure pointer, set up the result. */
function's incoming structure pointer, set up the result. */
if
(
parm
==
function_result_decl
)
if
(
parm
==
function_result_decl
)
...
@@ -4894,13 +4889,13 @@ assign_parms (fndecl)
...
@@ -4894,13 +4889,13 @@ assign_parms (fndecl)
current_function_args_size
current_function_args_size
=
((
current_function_args_size
+
STACK_BYTES
-
1
)
=
((
current_function_args_size
+
STACK_BYTES
-
1
)
/
STACK_BYTES
)
*
STACK_BYTES
;
/
STACK_BYTES
)
*
STACK_BYTES
;
#endif
#endif
#ifdef ARGS_GROW_DOWNWARD
#ifdef ARGS_GROW_DOWNWARD
current_function_arg_offset_rtx
current_function_arg_offset_rtx
=
(
stack_args_size
.
var
==
0
?
GEN_INT
(
-
stack_args_size
.
constant
)
=
(
stack_args_size
.
var
==
0
?
GEN_INT
(
-
stack_args_size
.
constant
)
:
expand_expr
(
size_diffop
(
stack_args_size
.
var
,
:
expand_expr
(
size_diffop
(
stack_args_size
.
var
,
size_int
(
-
stack_args_size
.
constant
)),
size_int
(
-
stack_args_size
.
constant
)),
NULL_RTX
,
VOIDmode
,
EXPAND_MEMORY_USE_BAD
));
NULL_RTX
,
VOIDmode
,
EXPAND_MEMORY_USE_BAD
));
#else
#else
current_function_arg_offset_rtx
=
ARGS_SIZE_RTX
(
stack_args_size
);
current_function_arg_offset_rtx
=
ARGS_SIZE_RTX
(
stack_args_size
);
...
@@ -4990,7 +4985,7 @@ promoted_input_arg (regno, pmode, punsignedp)
...
@@ -4990,7 +4985,7 @@ promoted_input_arg (regno, pmode, punsignedp)
initial offset is not affected by this rounding, while the size always
initial offset is not affected by this rounding, while the size always
is and the starting offset may be. */
is and the starting offset may be. */
/* offset_ptr will be negative for ARGS_GROW_DOWNWARD case;
/* offset_ptr will be negative for ARGS_GROW_DOWNWARD case;
initial_offset_ptr is positive because locate_and_pad_parm's
initial_offset_ptr is positive because locate_and_pad_parm's
callers pass in the total size of args so far as
callers pass in the total size of args so far as
initial_offset_ptr. arg_size_ptr is always positive.*/
initial_offset_ptr. arg_size_ptr is always positive.*/
...
@@ -4998,7 +4993,7 @@ promoted_input_arg (regno, pmode, punsignedp)
...
@@ -4998,7 +4993,7 @@ promoted_input_arg (regno, pmode, punsignedp)
void
void
locate_and_pad_parm
(
passed_mode
,
type
,
in_regs
,
fndecl
,
locate_and_pad_parm
(
passed_mode
,
type
,
in_regs
,
fndecl
,
initial_offset_ptr
,
offset_ptr
,
arg_size_ptr
,
initial_offset_ptr
,
offset_ptr
,
arg_size_ptr
,
alignment_pad
)
alignment_pad
)
enum
machine_mode
passed_mode
;
enum
machine_mode
passed_mode
;
tree
type
;
tree
type
;
int
in_regs
ATTRIBUTE_UNUSED
;
int
in_regs
ATTRIBUTE_UNUSED
;
...
@@ -5053,7 +5048,7 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
...
@@ -5053,7 +5048,7 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
}
}
else
else
{
{
offset_ptr
->
constant
=
-
initial_offset_ptr
->
constant
;
offset_ptr
->
constant
=
-
initial_offset_ptr
->
constant
;
offset_ptr
->
var
=
0
;
offset_ptr
->
var
=
0
;
}
}
if
(
where_pad
!=
none
if
(
where_pad
!=
none
...
@@ -5071,8 +5066,8 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
...
@@ -5071,8 +5066,8 @@ locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
offset_ptr
->
var
);
offset_ptr
->
var
);
else
else
arg_size_ptr
->
constant
=
(
-
initial_offset_ptr
->
constant
arg_size_ptr
->
constant
=
(
-
initial_offset_ptr
->
constant
-
offset_ptr
->
constant
);
-
offset_ptr
->
constant
);
#else
/* !ARGS_GROW_DOWNWARD */
#else
/* !ARGS_GROW_DOWNWARD */
pad_to_arg_alignment
(
initial_offset_ptr
,
boundary
,
alignment_pad
);
pad_to_arg_alignment
(
initial_offset_ptr
,
boundary
,
alignment_pad
);
...
@@ -5113,7 +5108,7 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
...
@@ -5113,7 +5108,7 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
HOST_WIDE_INT
save_constant
=
0
;
HOST_WIDE_INT
save_constant
=
0
;
int
boundary_in_bytes
=
boundary
/
BITS_PER_UNIT
;
int
boundary_in_bytes
=
boundary
/
BITS_PER_UNIT
;
if
(
boundary
>
PARM_BOUNDARY
&&
boundary
>
STACK_BOUNDARY
)
if
(
boundary
>
PARM_BOUNDARY
&&
boundary
>
STACK_BOUNDARY
)
{
{
save_var
=
offset_ptr
->
var
;
save_var
=
offset_ptr
->
var
;
...
@@ -5127,9 +5122,9 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
...
@@ -5127,9 +5122,9 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
{
{
if
(
offset_ptr
->
var
)
if
(
offset_ptr
->
var
)
{
{
offset_ptr
->
var
=
offset_ptr
->
var
=
#ifdef ARGS_GROW_DOWNWARD
#ifdef ARGS_GROW_DOWNWARD
round_down
round_down
#else
#else
round_up
round_up
#endif
#endif
...
@@ -5141,16 +5136,16 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
...
@@ -5141,16 +5136,16 @@ pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
save_var
);
save_var
);
}
}
else
else
{
{
offset_ptr
->
constant
=
offset_ptr
->
constant
=
#ifdef ARGS_GROW_DOWNWARD
#ifdef ARGS_GROW_DOWNWARD
FLOOR_ROUND
(
offset_ptr
->
constant
,
boundary_in_bytes
);
FLOOR_ROUND
(
offset_ptr
->
constant
,
boundary_in_bytes
);
#else
#else
CEIL_ROUND
(
offset_ptr
->
constant
,
boundary_in_bytes
);
CEIL_ROUND
(
offset_ptr
->
constant
,
boundary_in_bytes
);
#endif
#endif
if
(
boundary
>
PARM_BOUNDARY
&&
boundary
>
STACK_BOUNDARY
)
if
(
boundary
>
PARM_BOUNDARY
&&
boundary
>
STACK_BOUNDARY
)
alignment_pad
->
constant
=
offset_ptr
->
constant
-
save_constant
;
alignment_pad
->
constant
=
offset_ptr
->
constant
-
save_constant
;
}
}
}
}
}
}
...
@@ -5240,7 +5235,8 @@ setjmp_args_warning ()
...
@@ -5240,7 +5235,8 @@ setjmp_args_warning ()
if
(
DECL_RTL
(
decl
)
!=
0
if
(
DECL_RTL
(
decl
)
!=
0
&&
GET_CODE
(
DECL_RTL
(
decl
))
==
REG
&&
GET_CODE
(
DECL_RTL
(
decl
))
==
REG
&&
regno_clobbered_at_setjmp
(
REGNO
(
DECL_RTL
(
decl
))))
&&
regno_clobbered_at_setjmp
(
REGNO
(
DECL_RTL
(
decl
))))
warning_with_decl
(
decl
,
"argument `%s' might be clobbered by `longjmp' or `vfork'"
);
warning_with_decl
(
decl
,
"argument `%s' might be clobbered by `longjmp' or `vfork'"
);
}
}
/* If this function call setjmp, put all vars into the stack
/* If this function call setjmp, put all vars into the stack
...
@@ -5520,7 +5516,7 @@ round_trampoline_addr (tramp)
...
@@ -5520,7 +5516,7 @@ round_trampoline_addr (tramp)
GEN_INT
(
TRAMPOLINE_ALIGNMENT
/
BITS_PER_UNIT
-
1
),
GEN_INT
(
TRAMPOLINE_ALIGNMENT
/
BITS_PER_UNIT
-
1
),
temp
,
0
,
OPTAB_LIB_WIDEN
);
temp
,
0
,
OPTAB_LIB_WIDEN
);
tramp
=
expand_binop
(
Pmode
,
and_optab
,
temp
,
tramp
=
expand_binop
(
Pmode
,
and_optab
,
temp
,
GEN_INT
(
-
TRAMPOLINE_ALIGNMENT
/
BITS_PER_UNIT
),
GEN_INT
(
-
TRAMPOLINE_ALIGNMENT
/
BITS_PER_UNIT
),
temp
,
0
,
OPTAB_LIB_WIDEN
);
temp
,
0
,
OPTAB_LIB_WIDEN
);
#endif
#endif
return
tramp
;
return
tramp
;
...
@@ -5549,9 +5545,9 @@ identify_blocks ()
...
@@ -5549,9 +5545,9 @@ identify_blocks ()
block_vector
=
get_block_vector
(
block
,
&
n_blocks
);
block_vector
=
get_block_vector
(
block
,
&
n_blocks
);
block_stack
=
(
tree
*
)
xmalloc
(
n_blocks
*
sizeof
(
tree
));
block_stack
=
(
tree
*
)
xmalloc
(
n_blocks
*
sizeof
(
tree
));
last_block_vector
=
identify_blocks_1
(
get_insns
(),
last_block_vector
=
identify_blocks_1
(
get_insns
(),
block_vector
+
1
,
block_vector
+
1
,
block_vector
+
n_blocks
,
block_vector
+
n_blocks
,
block_stack
);
block_stack
);
/* If we didn't use all of the subblocks, we've misplaced block notes. */
/* If we didn't use all of the subblocks, we've misplaced block notes. */
...
@@ -5605,14 +5601,14 @@ identify_blocks_1 (insns, block_vector, end_block_vector, orig_block_stack)
...
@@ -5605,14 +5601,14 @@ identify_blocks_1 (insns, block_vector, end_block_vector, orig_block_stack)
NOTE_BLOCK
(
insn
)
=
*--
block_stack
;
NOTE_BLOCK
(
insn
)
=
*--
block_stack
;
}
}
}
}
else
if
(
GET_CODE
(
insn
)
==
CALL_INSN
else
if
(
GET_CODE
(
insn
)
==
CALL_INSN
&&
GET_CODE
(
PATTERN
(
insn
))
==
CALL_PLACEHOLDER
)
&&
GET_CODE
(
PATTERN
(
insn
))
==
CALL_PLACEHOLDER
)
{
{
rtx
cp
=
PATTERN
(
insn
);
rtx
cp
=
PATTERN
(
insn
);
block_vector
=
identify_blocks_1
(
XEXP
(
cp
,
0
),
block_vector
,
block_vector
=
identify_blocks_1
(
XEXP
(
cp
,
0
),
block_vector
,
end_block_vector
,
block_stack
);
end_block_vector
,
block_stack
);
if
(
XEXP
(
cp
,
1
))
if
(
XEXP
(
cp
,
1
))
block_vector
=
identify_blocks_1
(
XEXP
(
cp
,
1
),
block_vector
,
block_vector
=
identify_blocks_1
(
XEXP
(
cp
,
1
),
block_vector
,
end_block_vector
,
block_stack
);
end_block_vector
,
block_stack
);
...
@@ -5631,7 +5627,7 @@ identify_blocks_1 (insns, block_vector, end_block_vector, orig_block_stack)
...
@@ -5631,7 +5627,7 @@ identify_blocks_1 (insns, block_vector, end_block_vector, orig_block_stack)
}
}
/* Identify BLOCKs referenced by more than one
/* Identify BLOCKs referenced by more than one
NOTE_INSN_BLOCK_{BEG,END}, and create duplicate blocks. */
NOTE_INSN_BLOCK_{BEG,END}, and create duplicate blocks.
*/
void
void
reorder_blocks
()
reorder_blocks
()
...
@@ -5650,8 +5646,7 @@ reorder_blocks ()
...
@@ -5650,8 +5646,7 @@ reorder_blocks ()
reorder_blocks_1
(
get_insns
(),
block
,
&
block_stack
);
reorder_blocks_1
(
get_insns
(),
block
,
&
block_stack
);
BLOCK_SUBBLOCKS
(
block
)
BLOCK_SUBBLOCKS
(
block
)
=
blocks_nreverse
(
BLOCK_SUBBLOCKS
(
block
));
=
blocks_nreverse
(
BLOCK_SUBBLOCKS
(
block
));
VARRAY_FREE
(
block_stack
);
VARRAY_FREE
(
block_stack
);
}
}
...
@@ -5682,7 +5677,7 @@ reorder_blocks_1 (insns, current_block, p_block_stack)
...
@@ -5682,7 +5677,7 @@ reorder_blocks_1 (insns, current_block, p_block_stack)
}
}
BLOCK_SUBBLOCKS
(
block
)
=
0
;
BLOCK_SUBBLOCKS
(
block
)
=
0
;
TREE_ASM_WRITTEN
(
block
)
=
1
;
TREE_ASM_WRITTEN
(
block
)
=
1
;
BLOCK_SUPERCONTEXT
(
block
)
=
current_block
;
BLOCK_SUPERCONTEXT
(
block
)
=
current_block
;
BLOCK_CHAIN
(
block
)
=
BLOCK_SUBBLOCKS
(
current_block
);
BLOCK_CHAIN
(
block
)
=
BLOCK_SUBBLOCKS
(
current_block
);
BLOCK_SUBBLOCKS
(
current_block
)
=
block
;
BLOCK_SUBBLOCKS
(
current_block
)
=
block
;
current_block
=
block
;
current_block
=
block
;
...
@@ -5748,7 +5743,7 @@ all_blocks (block, vector)
...
@@ -5748,7 +5743,7 @@ all_blocks (block, vector)
vector
[
n_blocks
]
=
block
;
vector
[
n_blocks
]
=
block
;
++
n_blocks
;
++
n_blocks
;
/* Record the subblocks, and their subblocks... */
/* Record the subblocks, and their subblocks... */
n_blocks
+=
all_blocks
(
BLOCK_SUBBLOCKS
(
block
),
n_blocks
+=
all_blocks
(
BLOCK_SUBBLOCKS
(
block
),
vector
?
vector
+
n_blocks
:
0
);
vector
?
vector
+
n_blocks
:
0
);
...
@@ -5762,7 +5757,7 @@ all_blocks (block, vector)
...
@@ -5762,7 +5757,7 @@ all_blocks (block, vector)
number of elements in the vector is stored in N_BLOCKS_P. The
number of elements in the vector is stored in N_BLOCKS_P. The
vector is dynamically allocated; it is the caller's responsibility
vector is dynamically allocated; it is the caller's responsibility
to call `free' on the pointer returned. */
to call `free' on the pointer returned. */
static
tree
*
static
tree
*
get_block_vector
(
block
,
n_blocks_p
)
get_block_vector
(
block
,
n_blocks_p
)
tree
block
;
tree
block
;
...
@@ -5808,7 +5803,6 @@ number_blocks (fn)
...
@@ -5808,7 +5803,6 @@ number_blocks (fn)
return
;
return
;
}
}
/* Allocate a function structure and reset its contents to the defaults. */
/* Allocate a function structure and reset its contents to the defaults. */
static
void
static
void
...
@@ -5851,7 +5845,7 @@ prepare_function_start ()
...
@@ -5851,7 +5845,7 @@ prepare_function_start ()
/* Initialize the queue of pending postincrement and postdecrements,
/* Initialize the queue of pending postincrement and postdecrements,
and some other info in expr.c. */
and some other info in expr.c. */
init_expr
();
init_expr
();
/* We haven't done register allocation yet. */
/* We haven't done register allocation yet. */
reg_renumber
=
0
;
reg_renumber
=
0
;
...
@@ -5860,7 +5854,7 @@ prepare_function_start ()
...
@@ -5860,7 +5854,7 @@ prepare_function_start ()
/* Clear out data used for inlining. */
/* Clear out data used for inlining. */
cfun
->
inlinable
=
0
;
cfun
->
inlinable
=
0
;
cfun
->
original_decl_initial
=
0
;
cfun
->
original_decl_initial
=
0
;
cfun
->
original_arg_vector
=
0
;
cfun
->
original_arg_vector
=
0
;
#ifdef STACK_BOUNDARY
#ifdef STACK_BOUNDARY
cfun
->
stack_alignment_needed
=
STACK_BOUNDARY
;
cfun
->
stack_alignment_needed
=
STACK_BOUNDARY
;
...
@@ -5962,7 +5956,7 @@ init_function_start (subr, filename, line)
...
@@ -5962,7 +5956,7 @@ init_function_start (subr, filename, line)
/* Remember this function for later. */
/* Remember this function for later. */
cfun
->
next_global
=
all_functions
;
cfun
->
next_global
=
all_functions
;
all_functions
=
cfun
;
all_functions
=
cfun
;
current_function_name
=
(
*
decl_printable_name
)
(
subr
,
2
);
current_function_name
=
(
*
decl_printable_name
)
(
subr
,
2
);
cfun
->
decl
=
subr
;
cfun
->
decl
=
subr
;
...
@@ -5977,7 +5971,7 @@ init_function_start (subr, filename, line)
...
@@ -5977,7 +5971,7 @@ init_function_start (subr, filename, line)
/* Prevent ever trying to delete the first instruction of a function.
/* Prevent ever trying to delete the first instruction of a function.
Also tell final how to output a linenum before the function prologue.
Also tell final how to output a linenum before the function prologue.
Note linenums could be missing, e.g. when compiling a Java .class file. */
Note linenums could be missing, e.g. when compiling a Java .class file.
*/
if
(
line
>
0
)
if
(
line
>
0
)
emit_line_note
(
filename
,
line
);
emit_line_note
(
filename
,
line
);
...
@@ -6085,7 +6079,7 @@ expand_function_start (subr, parms_have_cleanups)
...
@@ -6085,7 +6079,7 @@ expand_function_start (subr, parms_have_cleanups)
conflicts with regs used for parameters. */
conflicts with regs used for parameters. */
if
(
!
SMALL_REGISTER_CLASSES
if
(
!
SMALL_REGISTER_CLASSES
||
GET_CODE
(
static_chain_incoming_rtx
)
==
REG
)
||
GET_CODE
(
static_chain_incoming_rtx
)
==
REG
)
emit_move_insn
(
last_ptr
,
static_chain_incoming_rtx
);
emit_move_insn
(
last_ptr
,
static_chain_incoming_rtx
);
}
}
/* If the parameters of this function need cleaning up, get a label
/* If the parameters of this function need cleaning up, get a label
...
@@ -6237,7 +6231,7 @@ expand_function_start (subr, parms_have_cleanups)
...
@@ -6237,7 +6231,7 @@ expand_function_start (subr, parms_have_cleanups)
/* Chain thru stack frames, assuming pointer to next lexical frame
/* Chain thru stack frames, assuming pointer to next lexical frame
is found at the place we always store it. */
is found at the place we always store it. */
#ifdef FRAME_GROWS_DOWNWARD
#ifdef FRAME_GROWS_DOWNWARD
last_ptr
=
plus_constant
(
last_ptr
,
-
GET_MODE_SIZE
(
Pmode
));
last_ptr
=
plus_constant
(
last_ptr
,
-
GET_MODE_SIZE
(
Pmode
));
#endif
#endif
last_ptr
=
gen_rtx_MEM
(
Pmode
,
memory_address
(
Pmode
,
last_ptr
));
last_ptr
=
gen_rtx_MEM
(
Pmode
,
memory_address
(
Pmode
,
last_ptr
));
MEM_ALIAS_SET
(
last_ptr
)
=
get_frame_alias_set
();
MEM_ALIAS_SET
(
last_ptr
)
=
get_frame_alias_set
();
...
@@ -6317,7 +6311,7 @@ diddle_return_value (doit, arg)
...
@@ -6317,7 +6311,7 @@ diddle_return_value (doit, arg)
return
;
return
;
pcc
=
(
current_function_returns_struct
pcc
=
(
current_function_returns_struct
||
current_function_returns_pcc_struct
);
||
current_function_returns_pcc_struct
);
if
((
GET_CODE
(
outgoing
)
==
REG
if
((
GET_CODE
(
outgoing
)
==
REG
&&
REGNO
(
outgoing
)
>=
FIRST_PSEUDO_REGISTER
)
&&
REGNO
(
outgoing
)
>=
FIRST_PSEUDO_REGISTER
)
...
@@ -6388,7 +6382,7 @@ use_return_register ()
...
@@ -6388,7 +6382,7 @@ use_return_register ()
}
}
/* Generate RTL for the end of the current function.
/* Generate RTL for the end of the current function.
FILENAME and LINE are the current position in the source file.
FILENAME and LINE are the current position in the source file.
It is up to language-specific callers to do cleanups for parameters--
It is up to language-specific callers to do cleanups for parameters--
or else, supply 1 for END_BINDINGS and we will call expand_end_bindings. */
or else, supply 1 for END_BINDINGS and we will call expand_end_bindings. */
...
@@ -6498,7 +6492,7 @@ expand_function_end (filename, line, end_bindings)
...
@@ -6498,7 +6492,7 @@ expand_function_end (filename, line, end_bindings)
/* Warn about unused parms if extra warnings were specified. */
/* Warn about unused parms if extra warnings were specified. */
/* Either ``-W -Wunused'' or ``-Wunused-parameter'' enables this
/* Either ``-W -Wunused'' or ``-Wunused-parameter'' enables this
warning. WARN_UNUSED_PARAMETER is negative when set by
warning. WARN_UNUSED_PARAMETER is negative when set by
-Wunused. */
-Wunused.
*/
if
(
warn_unused_parameter
>
0
if
(
warn_unused_parameter
>
0
||
(
warn_unused_parameter
<
0
&&
extra_warnings
))
||
(
warn_unused_parameter
<
0
&&
extra_warnings
))
{
{
...
@@ -6658,7 +6652,8 @@ expand_function_end (filename, line, end_bindings)
...
@@ -6658,7 +6652,8 @@ expand_function_end (filename, line, end_bindings)
if
(
current_function_returns_struct
if
(
current_function_returns_struct
||
current_function_returns_pcc_struct
)
||
current_function_returns_pcc_struct
)
{
{
rtx
value_address
=
XEXP
(
DECL_RTL
(
DECL_RESULT
(
current_function_decl
)),
0
);
rtx
value_address
=
XEXP
(
DECL_RTL
(
DECL_RESULT
(
current_function_decl
)),
0
);
tree
type
=
TREE_TYPE
(
DECL_RESULT
(
current_function_decl
));
tree
type
=
TREE_TYPE
(
DECL_RESULT
(
current_function_decl
));
#ifdef FUNCTION_OUTGOING_VALUE
#ifdef FUNCTION_OUTGOING_VALUE
rtx
outgoing
rtx
outgoing
...
@@ -6683,7 +6678,7 @@ expand_function_end (filename, line, end_bindings)
...
@@ -6683,7 +6678,7 @@ expand_function_end (filename, line, end_bindings)
instead of using the general framework. */
instead of using the general framework. */
use_return_register
();
use_return_register
();
/* If this is an implementation of __throw, do what's necessary to
/* If this is an implementation of __throw, do what's necessary to
communicate between __builtin_eh_return and the epilogue. */
communicate between __builtin_eh_return and the epilogue. */
expand_eh_return
();
expand_eh_return
();
...
@@ -6778,7 +6773,7 @@ prologue_epilogue_contains (insn)
...
@@ -6778,7 +6773,7 @@ prologue_epilogue_contains (insn)
int
int
sibcall_epilogue_contains
(
insn
)
sibcall_epilogue_contains
(
insn
)
rtx
insn
;
rtx
insn
;
{
{
if
(
sibcall_epilogue
)
if
(
sibcall_epilogue
)
return
contains
(
insn
,
sibcall_epilogue
);
return
contains
(
insn
,
sibcall_epilogue
);
...
@@ -6796,7 +6791,7 @@ emit_return_into_block (bb, line_note)
...
@@ -6796,7 +6791,7 @@ emit_return_into_block (bb, line_note)
{
{
rtx
p
,
end
;
rtx
p
,
end
;
p
=
NEXT_INSN
(
bb
->
end
);
p
=
NEXT_INSN
(
bb
->
end
);
end
=
emit_jump_insn_after
(
gen_return
(),
bb
->
end
);
end
=
emit_jump_insn_after
(
gen_return
(),
bb
->
end
);
if
(
line_note
)
if
(
line_note
)
emit_line_note_after
(
NOTE_SOURCE_FILE
(
line_note
),
emit_line_note_after
(
NOTE_SOURCE_FILE
(
line_note
),
...
@@ -6835,7 +6830,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6835,7 +6830,7 @@ thread_prologue_and_epilogue_insns (f)
if
(
HAVE_prologue
)
if
(
HAVE_prologue
)
{
{
start_sequence
();
start_sequence
();
seq
=
gen_prologue
();
seq
=
gen_prologue
();
emit_insn
(
seq
);
emit_insn
(
seq
);
/* Retain a map of the prologue insns. */
/* Retain a map of the prologue insns. */
...
@@ -6865,7 +6860,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6865,7 +6860,7 @@ thread_prologue_and_epilogue_insns (f)
/* If the exit block has no non-fake predecessors, we don't need
/* If the exit block has no non-fake predecessors, we don't need
an epilogue. */
an epilogue. */
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
if
((
e
->
flags
&
EDGE_FAKE
)
==
0
)
if
((
e
->
flags
&
EDGE_FAKE
)
==
0
)
break
;
break
;
if
(
e
==
NULL
)
if
(
e
==
NULL
)
...
@@ -6876,15 +6871,15 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6876,15 +6871,15 @@ thread_prologue_and_epilogue_insns (f)
{
{
/* If we're allowed to generate a simple return instruction,
/* If we're allowed to generate a simple return instruction,
then by definition we don't need a full epilogue. Examine
then by definition we don't need a full epilogue. Examine
the block that falls through to EXIT. If it does not
the block that falls through to EXIT. If it does not
contain any code, examine its predecessors and try to
contain any code, examine its predecessors and try to
emit (conditional) return instructions. */
emit (conditional) return instructions. */
basic_block
last
;
basic_block
last
;
edge
e_next
;
edge
e_next
;
rtx
label
;
rtx
label
;
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
if
(
e
->
flags
&
EDGE_FALLTHRU
)
if
(
e
->
flags
&
EDGE_FALLTHRU
)
break
;
break
;
if
(
e
==
NULL
)
if
(
e
==
NULL
)
...
@@ -6902,7 +6897,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6902,7 +6897,7 @@ thread_prologue_and_epilogue_insns (f)
if
(
last
->
head
==
label
&&
GET_CODE
(
label
)
==
CODE_LABEL
)
if
(
last
->
head
==
label
&&
GET_CODE
(
label
)
==
CODE_LABEL
)
{
{
rtx
epilogue_line_note
=
NULL_RTX
;
rtx
epilogue_line_note
=
NULL_RTX
;
/* Locate the line number associated with the closing brace,
/* Locate the line number associated with the closing brace,
if we can find one. */
if we can find one. */
...
@@ -6915,7 +6910,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6915,7 +6910,7 @@ thread_prologue_and_epilogue_insns (f)
break
;
break
;
}
}
for
(
e
=
last
->
pred
;
e
;
e
=
e_next
)
for
(
e
=
last
->
pred
;
e
;
e
=
e_next
)
{
{
basic_block
bb
=
e
->
src
;
basic_block
bb
=
e
->
src
;
rtx
jump
;
rtx
jump
;
...
@@ -6953,12 +6948,12 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6953,12 +6948,12 @@ thread_prologue_and_epilogue_insns (f)
continue
;
continue
;
if
(
JUMP_LABEL
(
jump
))
if
(
JUMP_LABEL
(
jump
))
LABEL_NUSES
(
JUMP_LABEL
(
jump
))
--
;
LABEL_NUSES
(
JUMP_LABEL
(
jump
))
--
;
/* If this block has only one successor, it both jumps
/* If this block has only one successor, it both jumps
and falls through to the fallthru block, so we can't
and falls through to the fallthru block, so we can't
delete the edge. */
delete the edge. */
if
(
bb
->
succ
->
succ_next
==
NULL
)
if
(
bb
->
succ
->
succ_next
==
NULL
)
continue
;
continue
;
}
}
else
else
continue
;
continue
;
...
@@ -6973,7 +6968,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6973,7 +6968,7 @@ thread_prologue_and_epilogue_insns (f)
emit_barrier_after
(
last
->
end
);
emit_barrier_after
(
last
->
end
);
emit_return_into_block
(
last
,
epilogue_line_note
);
emit_return_into_block
(
last
,
epilogue_line_note
);
epilogue_end
=
last
->
end
;
epilogue_end
=
last
->
end
;
goto
epilogue_done
;
goto
epilogue_done
;
}
}
}
}
#endif
#endif
...
@@ -6985,7 +6980,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -6985,7 +6980,7 @@ thread_prologue_and_epilogue_insns (f)
There really shouldn't be a mixture -- either all should have
There really shouldn't be a mixture -- either all should have
been converted or none, however... */
been converted or none, however... */
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
if
(
e
->
flags
&
EDGE_FALLTHRU
)
if
(
e
->
flags
&
EDGE_FALLTHRU
)
break
;
break
;
if
(
e
==
NULL
)
if
(
e
==
NULL
)
...
@@ -7003,7 +6998,7 @@ thread_prologue_and_epilogue_insns (f)
...
@@ -7003,7 +6998,7 @@ thread_prologue_and_epilogue_insns (f)
record_insns
(
seq
,
&
epilogue
);
record_insns
(
seq
,
&
epilogue
);
seq
=
gen_sequence
();
seq
=
gen_sequence
();
end_sequence
();
end_sequence
();
insert_insn_on_edge
(
seq
,
e
);
insert_insn_on_edge
(
seq
,
e
);
inserted
=
1
;
inserted
=
1
;
...
@@ -7016,7 +7011,7 @@ epilogue_done:
...
@@ -7016,7 +7011,7 @@ epilogue_done:
#ifdef HAVE_sibcall_epilogue
#ifdef HAVE_sibcall_epilogue
/* Emit sibling epilogues before any sibling call sites. */
/* Emit sibling epilogues before any sibling call sites. */
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
for
(
e
=
EXIT_BLOCK_PTR
->
pred
;
e
;
e
=
e
->
pred_next
)
{
{
basic_block
bb
=
e
->
src
;
basic_block
bb
=
e
->
src
;
rtx
insn
=
bb
->
end
;
rtx
insn
=
bb
->
end
;
...
@@ -7057,7 +7052,7 @@ epilogue_done:
...
@@ -7057,7 +7052,7 @@ epilogue_done:
note before the end of the first basic block, if there isn't
note before the end of the first basic block, if there isn't
one already there. */
one already there. */
for
(
insn
=
prologue_end
;
insn
;
insn
=
prev
)
for
(
insn
=
prologue_end
;
insn
;
insn
=
prev
)
{
{
prev
=
PREV_INSN
(
insn
);
prev
=
PREV_INSN
(
insn
);
if
(
GET_CODE
(
insn
)
==
NOTE
&&
NOTE_LINE_NUMBER
(
insn
)
>
0
)
if
(
GET_CODE
(
insn
)
==
NOTE
&&
NOTE_LINE_NUMBER
(
insn
)
>
0
)
...
@@ -7103,7 +7098,7 @@ epilogue_done:
...
@@ -7103,7 +7098,7 @@ epilogue_done:
/* Similarly, move any line notes that appear after the epilogue.
/* Similarly, move any line notes that appear after the epilogue.
There is no need, however, to be quite so anal about the existance
There is no need, however, to be quite so anal about the existance
of such a note. */
of such a note. */
for
(
insn
=
epilogue_end
;
insn
;
insn
=
next
)
for
(
insn
=
epilogue_end
;
insn
;
insn
=
next
)
{
{
next
=
NEXT_INSN
(
insn
);
next
=
NEXT_INSN
(
insn
);
if
(
GET_CODE
(
insn
)
==
NOTE
&&
NOTE_LINE_NUMBER
(
insn
)
>
0
)
if
(
GET_CODE
(
insn
)
==
NOTE
&&
NOTE_LINE_NUMBER
(
insn
)
>
0
)
...
@@ -7152,7 +7147,7 @@ reposition_prologue_and_epilogue_notes (f)
...
@@ -7152,7 +7147,7 @@ reposition_prologue_and_epilogue_notes (f)
next
=
NEXT_INSN
(
note
);
next
=
NEXT_INSN
(
note
);
/* Whether or not we can depend on BLOCK_HEAD,
/* Whether or not we can depend on BLOCK_HEAD,
attempt to keep it up-to-date. */
attempt to keep it up-to-date. */
if
(
BLOCK_HEAD
(
0
)
==
note
)
if
(
BLOCK_HEAD
(
0
)
==
note
)
BLOCK_HEAD
(
0
)
=
next
;
BLOCK_HEAD
(
0
)
=
next
;
...
@@ -7189,7 +7184,7 @@ reposition_prologue_and_epilogue_notes (f)
...
@@ -7189,7 +7184,7 @@ reposition_prologue_and_epilogue_notes (f)
break
;
break
;
}
}
/* Whether or not we can depend on BLOCK_HEAD,
/* Whether or not we can depend on BLOCK_HEAD,
attempt to keep it up-to-date. */
attempt to keep it up-to-date. */
if
(
n_basic_blocks
if
(
n_basic_blocks
&&
BLOCK_HEAD
(
n_basic_blocks
-
1
)
==
insn
)
&&
BLOCK_HEAD
(
n_basic_blocks
-
1
)
==
insn
)
...
@@ -7207,7 +7202,7 @@ reposition_prologue_and_epilogue_notes (f)
...
@@ -7207,7 +7202,7 @@ reposition_prologue_and_epilogue_notes (f)
static
void
static
void
mark_temp_slot
(
t
)
mark_temp_slot
(
t
)
struct
temp_slot
*
t
;
struct
temp_slot
*
t
;
{
{
while
(
t
)
while
(
t
)
{
{
...
...
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