Commit ddbd5439 by Maxim Kuvyrkov Committed by Maxim Kuvyrkov

ddg.c (build_intra_loop_deps): Adjust add_forward_dependence call.

2006-03-16  Maxim Kuvyrkov <mkuvyrkov@ispras.ru>
            Andrey Belevantsev <abel@ispras.ru>

	* ddg.c (build_intra_loop_deps): Adjust add_forward_dependence call.
        * lists.c (unused_deps_list): New variable.
	(free_list): Add assertions to verify the proper distinguishing 
        between INSN_LISTs and DEPS_LISTs.
        (find_list_elem, remove_list_elem, remove_list_node): New static
	functions.
        (alloc_DEPS_LIST, free_DEPS_LIST, free_DEPS_LIST_node,
        remove_free_INSN_LIST_elem, remove_free_DEPS_LIST_elem,
        remove_free_INSN_LIST_node, remove_free_DEPS_LIST_node): New functions.
        (alloc_INSN_LIST): Assert that the list we're working on is indeed
	an INSN_LIST.
        (free_INSN_LIST_node): Likewise.
	* modulo-sched.c (current_sched_info): Initialize flags field.
	* reg-notes.def: Exchange DEP_ANTI and DEP_OUTPUT.
	* rtl.def (DEPS_LIST): Define.
        * rtl.h: Declare new functions from lists.c.
        * sched-deps.c (spec_dependency_cache): New static variable.
        (maybe_add_or_update_back_dep_1, add_back_dep): New static functions.
        (add_dependence): Change return type to void.  Move the logic to ...
        (add_or_update_back_dep_1): ... here.  Handle speculative dependencies.
        (delete_all_dependences): Add comment about forward_dependency_cache.
	Handle spec_dependency_cache.  Handle DEPS_LISTs.
        (fixup_sched_groups): Clarify the change of priority of output
        and anti dependencies.
        (sched_analyze_2): Adjust add_dependence calls to create data
	speculative dependence.
        (add_forward_dependence): Renamed to add_forw_dep, change prototype.
	Adjust all callers.  Handle DEPS_LISTS.
        (compute_forward_dependences): Use add_forw_dep.  Sort LOG_LINKs in
	presence of speculation.
        (init_dependency_caches, free_dependency_caches):
	Handle spec_dependency_cache.
        (adjust_add_sorted_back_dep, adjust_back_add_forw_dep, delete_forw_dep,
	estimate_dep_weak, get_dep_weak, ds_merge, check_dep_status):
	New static functions.
        (add_or_update_back_dep, add_or_update_back_forw_dep,
	add_back_forw_dep, delete_back_forw_dep): New functions.
	* sched-int.h (ds_t, dw_t): New typedefs.
	(struct sched_info): Add new field flags.
	(struct haifa_insn_data): Add new bitfield has_internal_dep.
	Prototype new sched-deps.c functions.
        (HAS_INTERNAL_DEP, DEP_STATUS): New access macros.
	(BITS_PER_DEP_STATUS, BITS_PER_DEP_WEAK, DEP_WEAK_MASK, MAX_DEP_WEAK,
	MIN_DEP_WEAK, NO_DEP_WEAK, UNCERTAIN_DEP_WEAK, BEGIN_DATA, BE_IN_DATA,
	BEGIN_CONTROL, BE_IN_CONTROL, BEGIN_SPEC, DATA_SPEC, CONTROL_SPEC,
	SPECULATIVE, BE_IN_SPEC, FIRST_SPEC_TYPE, LAST_SPEC_TYPE,
	SPEC_TYPE_SHIFT, DEP_TRUE, DEP_OUTPUT, DEP_ANTI, DEP_TYPES, HARD_DEP):
	New constants.
        (enum SPEC_TYPES_OFFSETS, enum DEPS_ADJUST_RESULT, enum SCHED_FLAGS):
	New enums.
	* sched-rgn.c (current_sched_info): Initialize flags field.
	(schedule_insns): Initialize current_sched_info before the sched_init
	call.
	* sched-ebb.c (current_sched_info): Initialize flags field.
	(add_deps_for_risky_insns): Use control_flow_insn_p instead of JUMP_P.
	Call add_or_update_back_dep instead of add_dependence.
	Create control speculative dependencies.
	(schedule_insns): Initialize current_sched_info before the sched_init
	call.

Co-Authored-By: Andrey Belevantsev <abel@ispras.ru>

From-SVN: r112125
parent 3062335c
2006-03-16 Maxim Kuvyrkov <mkuvyrkov@ispras.ru>
Andrey Belevantsev <abel@ispras.ru>
* ddg.c (build_intra_loop_deps): Adjust add_forward_dependence call.
* lists.c (unused_deps_list): New variable.
(free_list): Add assertions to verify the proper distinguishing
between INSN_LISTs and DEPS_LISTs.
(find_list_elem, remove_list_elem, remove_list_node): New static
functions.
(alloc_DEPS_LIST, free_DEPS_LIST, free_DEPS_LIST_node,
remove_free_INSN_LIST_elem, remove_free_DEPS_LIST_elem,
remove_free_INSN_LIST_node, remove_free_DEPS_LIST_node): New functions.
(alloc_INSN_LIST): Assert that the list we're working on is indeed
an INSN_LIST.
(free_INSN_LIST_node): Likewise.
* modulo-sched.c (current_sched_info): Initialize flags field.
* reg-notes.def: Exchange DEP_ANTI and DEP_OUTPUT.
* rtl.def (DEPS_LIST): Define.
* rtl.h: Declare new functions from lists.c.
* sched-deps.c (spec_dependency_cache): New static variable.
(maybe_add_or_update_back_dep_1, add_back_dep): New static functions.
(add_dependence): Change return type to void. Move the logic to ...
(add_or_update_back_dep_1): ... here. Handle speculative dependencies.
(delete_all_dependences): Add comment about forward_dependency_cache.
Handle spec_dependency_cache. Handle DEPS_LISTs.
(fixup_sched_groups): Clarify the change of priority of output
and anti dependencies.
(sched_analyze_2): Adjust add_dependence calls to create data
speculative dependence.
(add_forward_dependence): Renamed to add_forw_dep, change prototype.
Adjust all callers. Handle DEPS_LISTS.
(compute_forward_dependences): Use add_forw_dep. Sort LOG_LINKs in
presence of speculation.
(init_dependency_caches, free_dependency_caches):
Handle spec_dependency_cache.
(adjust_add_sorted_back_dep, adjust_back_add_forw_dep, delete_forw_dep,
estimate_dep_weak, get_dep_weak, ds_merge, check_dep_status):
New static functions.
(add_or_update_back_dep, add_or_update_back_forw_dep,
add_back_forw_dep, delete_back_forw_dep): New functions.
* sched-int.h (ds_t, dw_t): New typedefs.
(struct sched_info): Add new field flags.
(struct haifa_insn_data): Add new bitfield has_internal_dep.
Prototype new sched-deps.c functions.
(HAS_INTERNAL_DEP, DEP_STATUS): New access macros.
(BITS_PER_DEP_STATUS, BITS_PER_DEP_WEAK, DEP_WEAK_MASK, MAX_DEP_WEAK,
MIN_DEP_WEAK, NO_DEP_WEAK, UNCERTAIN_DEP_WEAK, BEGIN_DATA, BE_IN_DATA,
BEGIN_CONTROL, BE_IN_CONTROL, BEGIN_SPEC, DATA_SPEC, CONTROL_SPEC,
SPECULATIVE, BE_IN_SPEC, FIRST_SPEC_TYPE, LAST_SPEC_TYPE,
SPEC_TYPE_SHIFT, DEP_TRUE, DEP_OUTPUT, DEP_ANTI, DEP_TYPES, HARD_DEP):
New constants.
(enum SPEC_TYPES_OFFSETS, enum DEPS_ADJUST_RESULT, enum SCHED_FLAGS):
New enums.
* sched-rgn.c (current_sched_info): Initialize flags field.
(schedule_insns): Initialize current_sched_info before the sched_init
call.
* sched-ebb.c (current_sched_info): Initialize flags field.
(add_deps_for_risky_insns): Use control_flow_insn_p instead of JUMP_P.
Call add_or_update_back_dep instead of add_dependence.
Create control speculative dependencies.
(schedule_insns): Initialize current_sched_info before the sched_init
call.
2006-03-16 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/linux-unwind.h (shmedia_fallback_frame_state): Set
......
......@@ -401,8 +401,7 @@ build_intra_loop_deps (ddg_ptr g)
if (!src_node)
continue;
add_forward_dependence (XEXP (link, 0), dest_node->insn,
REG_NOTE_KIND (link));
add_forw_dep (dest_node->insn, link);
create_ddg_dependence (g, src_node, dest_node,
INSN_DEPEND (src_node->insn));
}
......
......@@ -28,6 +28,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
#include "ggc.h"
static void free_list (rtx *, rtx *);
static void free_DEPS_LIST_node (rtx);
/* Functions for maintaining cache-able lists of EXPR_LIST and INSN_LISTs. */
......@@ -37,11 +38,14 @@ static GTY ((deletable)) rtx unused_insn_list;
/* An EXPR_LIST containing all EXPR_LISTs allocated but currently unused. */
static GTY ((deletable)) rtx unused_expr_list;
/* An DEPS_LIST containing all DEPS_LISTs allocated but currently unused. */
static GTY ((deletable)) rtx unused_deps_list;
/* This function will free an entire list of either EXPR_LIST or INSN_LIST
nodes. This is to be used only on lists that consist exclusively of
nodes of one type only. This is only called by free_EXPR_LIST_list
and free_INSN_LIST_list. */
/* This function will free an entire list of either EXPR_LIST, INSN_LIST
or DEPS_LIST nodes. This is to be used only on lists that consist
exclusively of nodes of one type only. This is only called by
free_EXPR_LIST_list, free_INSN_LIST_list and free_DEPS_LIST_list. */
static void
free_list (rtx *listp, rtx *unused_listp)
{
......@@ -50,8 +54,18 @@ free_list (rtx *listp, rtx *unused_listp)
prev_link = *listp;
link = XEXP (prev_link, 1);
gcc_assert ((unused_listp != &unused_insn_list
|| GET_CODE (prev_link) == INSN_LIST)
&& (unused_listp != &unused_deps_list
|| GET_CODE (prev_link) == DEPS_LIST));
while (link)
{
gcc_assert ((unused_listp != &unused_insn_list
|| GET_CODE (prev_link) == INSN_LIST)
&& (unused_listp != &unused_deps_list
|| GET_CODE (prev_link) == DEPS_LIST));
prev_link = link;
link = XEXP (link, 1);
}
......@@ -61,6 +75,40 @@ free_list (rtx *listp, rtx *unused_listp)
*listp = 0;
}
/* Find corresponding to ELEM node in the list pointed to by LISTP.
This node must exist in the list. Returns pointer to that node. */
static rtx *
find_list_elem (rtx elem, rtx *listp)
{
while (XEXP (*listp, 0) != elem)
listp = &XEXP (*listp, 1);
return listp;
}
/* Remove the node pointed to by LISTP from the list. */
static void
remove_list_node (rtx *listp)
{
rtx node;
node = *listp;
*listp = XEXP (node, 1);
XEXP (node, 1) = 0;
}
/* Removes corresponding to ELEM node from the list pointed to by LISTP.
Returns that node. */
static rtx
remove_list_elem (rtx elem, rtx *listp)
{
rtx node;
listp = find_list_elem (elem, listp);
node = *listp;
remove_list_node (listp);
return node;
}
/* This call is used in place of a gen_rtx_INSN_LIST. If there is a cached
node available, we'll use it, otherwise a call to gen_rtx_INSN_LIST
is made. */
......@@ -76,6 +124,8 @@ alloc_INSN_LIST (rtx val, rtx next)
XEXP (r, 0) = val;
XEXP (r, 1) = next;
PUT_REG_NOTE_KIND (r, VOIDmode);
gcc_assert (GET_CODE (r) == INSN_LIST);
}
else
r = gen_rtx_INSN_LIST (VOIDmode, val, next);
......@@ -105,6 +155,31 @@ alloc_EXPR_LIST (int kind, rtx val, rtx next)
return r;
}
/* This call is used in place of a gen_rtx_DEPS_LIST. If there is a cached
node available, we'll use it, otherwise a call to gen_rtx_DEPS_LIST
is made. */
rtx
alloc_DEPS_LIST (rtx val, rtx next, HOST_WIDE_INT ds)
{
rtx r;
if (unused_deps_list)
{
r = unused_deps_list;
unused_deps_list = XEXP (r, 1);
XEXP (r, 0) = val;
XEXP (r, 1) = next;
XWINT (r, 2) = ds;
PUT_REG_NOTE_KIND (r, VOIDmode);
gcc_assert (GET_CODE (r) == DEPS_LIST);
}
else
r = gen_rtx_DEPS_LIST (VOIDmode, val, next, ds);
return r;
}
/* This function will free up an entire list of EXPR_LIST nodes. */
void
free_EXPR_LIST_list (rtx *listp)
......@@ -123,6 +198,15 @@ free_INSN_LIST_list (rtx *listp)
free_list (listp, &unused_insn_list);
}
/* This function will free up an entire list of DEPS_LIST nodes. */
void
free_DEPS_LIST_list (rtx *listp)
{
if (*listp == 0)
return;
free_list (listp, &unused_deps_list);
}
/* This function will free up an individual EXPR_LIST node. */
void
free_EXPR_LIST_node (rtx ptr)
......@@ -135,8 +219,26 @@ free_EXPR_LIST_node (rtx ptr)
void
free_INSN_LIST_node (rtx ptr)
{
gcc_assert (GET_CODE (ptr) == INSN_LIST);
XEXP (ptr, 1) = unused_insn_list;
unused_insn_list = ptr;
}
/* This function will free up an individual DEPS_LIST node. */
static void
free_DEPS_LIST_node (rtx ptr)
{
gcc_assert (GET_CODE (ptr) == DEPS_LIST);
XEXP (ptr, 1) = unused_deps_list;
unused_deps_list = ptr;
}
/* Remove and free corresponding to ELEM node in the DEPS_LIST pointed to
by LISTP. */
void
remove_free_DEPS_LIST_elem (rtx elem, rtx *listp)
{
free_DEPS_LIST_node (remove_list_elem (elem, listp));
}
#include "gt-lists.h"
......@@ -263,7 +263,9 @@ static struct sched_info sms_sched_info =
compute_jump_reg_dependencies,
NULL, NULL,
NULL, NULL,
0, 0, 0
0, 0, 0,
0
};
......
......@@ -99,8 +99,8 @@ REG_NOTE (LABEL)
/* REG_DEP_ANTI and REG_DEP_OUTPUT are used in LOG_LINKS to represent
write-after-read and write-after-write dependencies respectively. */
REG_NOTE (DEP_ANTI)
REG_NOTE (DEP_OUTPUT)
REG_NOTE (DEP_ANTI)
/* REG_BR_PROB is attached to JUMP_INSNs and CALL_INSNs. It has an
integer value. For jumps, it is the probability that this is a
......
......@@ -93,6 +93,12 @@ DEF_RTL_EXPR(EXPR_LIST, "expr_list", "ee", RTX_EXTRA)
The insns are represented in print by their uids. */
DEF_RTL_EXPR(INSN_LIST, "insn_list", "ue", RTX_EXTRA)
/* a linked list of dependencies.
The insns are represented in print by their uids.
Operand 2 is a degree of speculativeness of the dependence.
Operand 3 is a degree of weakness of the dependence. */
DEF_RTL_EXPR(DEPS_LIST, "deps_list", "uew", RTX_EXTRA)
/* SEQUENCE appears in the result of a `gen_...' function
for a DEFINE_EXPAND that wants to make several insns.
Its elements are the bodies of the insns that should be made.
......
......@@ -1753,6 +1753,9 @@ void free_EXPR_LIST_node (rtx);
void free_INSN_LIST_node (rtx);
rtx alloc_INSN_LIST (rtx, rtx);
rtx alloc_EXPR_LIST (int, rtx, rtx);
void free_DEPS_LIST_list (rtx *);
rtx alloc_DEPS_LIST (rtx, rtx, HOST_WIDE_INT);
void remove_free_DEPS_LIST_elem (rtx, rtx *);
/* regclass.c */
......
......@@ -205,7 +205,9 @@ static struct sched_info ebb_sched_info =
NULL, NULL,
NULL, NULL,
0, 1, 0
0, 1, 0,
0
};
/* It is possible that ebb scheduling eliminated some blocks.
......@@ -421,7 +423,7 @@ add_deps_for_risky_insns (rtx head, rtx tail)
basic_block last_block = NULL, bb;
for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
if (JUMP_P (insn))
if (control_flow_insn_p (insn))
{
bb = BLOCK_FOR_INSN (insn);
bb->aux = last_block;
......@@ -455,9 +457,27 @@ add_deps_for_risky_insns (rtx head, rtx tail)
/* We can not change the mode of the backward
dependency because REG_DEP_ANTI has the lowest
rank. */
if (! sched_insns_conditions_mutex_p (insn, prev)
&& add_dependence (insn, prev, REG_DEP_ANTI))
add_forward_dependence (prev, insn, REG_DEP_ANTI);
if (! sched_insns_conditions_mutex_p (insn, prev))
{
if (!(current_sched_info->flags & DO_SPECULATION))
{
enum DEPS_ADJUST_RESULT res;
res = add_or_update_back_dep (insn, prev,
REG_DEP_ANTI, DEP_ANTI);
if (res == DEP_CREATED)
add_forw_dep (insn, LOG_LINKS (insn));
else
gcc_assert (res != DEP_CHANGED);
}
else
add_or_update_back_forw_dep (insn, prev, REG_DEP_ANTI,
set_dep_weak (DEP_ANTI,
BEGIN_CONTROL,
MAX_DEP_WEAK));
}
break;
default:
......@@ -571,10 +591,12 @@ schedule_ebbs (void)
if (n_basic_blocks == NUM_FIXED_BLOCKS)
return;
sched_init ();
/* We need current_sched_info in init_dependency_caches, which is
invoked via sched_init. */
current_sched_info = &ebb_sched_info;
sched_init ();
compute_bb_for_insn ();
/* Schedule every region in the subroutine. */
......
......@@ -36,6 +36,12 @@ extern state_t curr_state;
/* Forward declaration. */
struct ready_list;
/* Type to represent status of a dependence. A convinient short alias. */
typedef HOST_WIDE_INT ds_t;
/* Type to represent weakness of speculative dependence. */
typedef int dw_t;
/* Describe state of dependencies used during sched_analyze phase. */
struct deps
{
......@@ -180,6 +186,10 @@ struct sched_info
/* Maximum priority that has been assigned to an insn. */
int sched_max_insns_priority;
/* ??? FIXME: should use straight bitfields inside sched_info instead of
this flag field. */
unsigned int flags;
};
extern struct sched_info *current_sched_info;
......@@ -231,6 +241,10 @@ struct haifa_insn_data
/* Nonzero if priority has been computed already. */
unsigned int priority_known : 1;
/* Nonzero if instruction has internal dependence
(e.g. add_dependence was invoked with (insn == elem)). */
unsigned int has_internal_dep : 1;
};
extern struct haifa_insn_data *h_i_d;
......@@ -245,6 +259,137 @@ extern struct haifa_insn_data *h_i_d;
#define INSN_PRIORITY_KNOWN(INSN) (h_i_d[INSN_UID (INSN)].priority_known)
#define INSN_COST(INSN) (h_i_d[INSN_UID (INSN)].cost)
#define INSN_REG_WEIGHT(INSN) (h_i_d[INSN_UID (INSN)].reg_weight)
#define HAS_INTERNAL_DEP(INSN) (h_i_d[INSN_UID (INSN)].has_internal_dep)
/* DEP_STATUS of the link incapsulates information, that is needed for
speculative scheduling. Namely, it is 4 integers in the range
[0, MAX_DEP_WEAK] and 3 bits.
The integers correspond to the probability of the dependence to *not*
exist, it is the probability, that overcoming of this dependence will
not be followed by execution of the recovery code. Nevertheless,
whatever high the probability of success is, recovery code should still
be generated to preserve semantics of the program. To find a way to
get/set these integers, please refer to the {get, set}_dep_weak ()
functions in sched-deps.c .
The 3 bits in the DEP_STATUS correspond to 3 dependence types: true-,
output- and anti- dependence. It is not enough for speculative scheduling
to know just the major type of all the dependence between two instructions,
as only true dependence can be overcome.
There also is the 4-th bit in the DEP_STATUS (HARD_DEP), that is reserved
for using to describe instruction's status. It is set whenever instuction
has at least one dependence, that cannot be overcome.
See also: check_dep_status () in sched-deps.c . */
#define DEP_STATUS(LINK) XWINT (LINK, 2)
/* We exclude sign bit. */
#define BITS_PER_DEP_STATUS (HOST_BITS_PER_WIDE_INT - 1)
/* First '4' stands for 3 dep type bits and HARD_DEP bit.
Second '4' stands for BEGIN_{DATA, CONTROL}, BE_IN_{DATA, CONTROL}
dep weakness. */
#define BITS_PER_DEP_WEAK ((BITS_PER_DEP_STATUS - 4) / 4)
/* Mask of speculative weakness in dep_status. */
#define DEP_WEAK_MASK ((1 << BITS_PER_DEP_WEAK) - 1)
/* This constant means that dependence is fake with 99.999...% probability.
This is the maximum value, that can appear in dep_status.
Note, that we don't want MAX_DEP_WEAK to be the same as DEP_WEAK_MASK for
debugging reasons. Though, it can be set to DEP_WEAK_MASK, and, when
done so, we'll get fast (mul for)/(div by) NO_DEP_WEAK. */
#define MAX_DEP_WEAK (DEP_WEAK_MASK - 1)
/* This constant means that dependence is 99.999...% real and it is a really
bad idea to overcome it (though this can be done, preserving program
semantics). */
#define MIN_DEP_WEAK 1
/* This constant represents 100% probability.
E.g. it is used to represent weakness of dependence, that doesn't exist. */
#define NO_DEP_WEAK (MAX_DEP_WEAK + MIN_DEP_WEAK)
/* Default weakness of speculative dependence. Used when we can't say
neither bad nor good about the dependence. */
#define UNCERTAIN_DEP_WEAK (MAX_DEP_WEAK - MAX_DEP_WEAK / 4)
/* Offset for speculative weaknesses in dep_status. */
enum SPEC_TYPES_OFFSETS {
BEGIN_DATA_BITS_OFFSET = 0,
BE_IN_DATA_BITS_OFFSET = BEGIN_DATA_BITS_OFFSET + BITS_PER_DEP_WEAK,
BEGIN_CONTROL_BITS_OFFSET = BE_IN_DATA_BITS_OFFSET + BITS_PER_DEP_WEAK,
BE_IN_CONTROL_BITS_OFFSET = BEGIN_CONTROL_BITS_OFFSET + BITS_PER_DEP_WEAK
};
/* The following defines provide numerous constants used to distinguish between
different types of speculative dependencies. */
/* Dependence can be overcomed with generation of new data speculative
instruction. */
#define BEGIN_DATA (((ds_t) DEP_WEAK_MASK) << BEGIN_DATA_BITS_OFFSET)
/* This dependence is to the instruction in the recovery block, that was
formed to recover after data-speculation failure.
Thus, this dependence can overcomed with generating of the copy of
this instruction in the recovery block. */
#define BE_IN_DATA (((ds_t) DEP_WEAK_MASK) << BE_IN_DATA_BITS_OFFSET)
/* Dependence can be overcomed with generation of new control speculative
instruction. */
#define BEGIN_CONTROL (((ds_t) DEP_WEAK_MASK) << BEGIN_CONTROL_BITS_OFFSET)
/* This dependence is to the instruction in the recovery block, that was
formed to recover after control-speculation failure.
Thus, this dependence can overcomed with generating of the copy of
this instruction in the recovery block. */
#define BE_IN_CONTROL (((ds_t) DEP_WEAK_MASK) << BE_IN_CONTROL_BITS_OFFSET)
/* Few convinient combinations. */
#define BEGIN_SPEC (BEGIN_DATA | BEGIN_CONTROL)
#define DATA_SPEC (BEGIN_DATA | BE_IN_DATA)
#define CONTROL_SPEC (BEGIN_CONTROL | BE_IN_CONTROL)
#define SPECULATIVE (DATA_SPEC | CONTROL_SPEC)
#define BE_IN_SPEC (BE_IN_DATA | BE_IN_CONTROL)
/* Constants, that are helpful in iterating through dep_status. */
#define FIRST_SPEC_TYPE BEGIN_DATA
#define LAST_SPEC_TYPE BE_IN_CONTROL
#define SPEC_TYPE_SHIFT BITS_PER_DEP_WEAK
/* Dependence on instruction can be of multiple types
(e.g. true and output). This fields enhance REG_NOTE_KIND information
of the dependence. */
#define DEP_TRUE (((ds_t) 1) << (BE_IN_CONTROL_BITS_OFFSET + BITS_PER_DEP_WEAK))
#define DEP_OUTPUT (DEP_TRUE << 1)
#define DEP_ANTI (DEP_OUTPUT << 1)
#define DEP_TYPES (DEP_TRUE | DEP_OUTPUT | DEP_ANTI)
/* Instruction has non-speculative dependence. This bit represents the
property of an instruction - not the one of a dependence.
Therefore, it can appear only in TODO_SPEC field of an instruction. */
#define HARD_DEP (DEP_ANTI << 1)
/* This represents the results of calling sched-deps.c functions,
which modify dependencies. Possible choices are: a dependence
is already present and nothing has been changed; a dependence type
has been changed; brand new dependence has been created. */
enum DEPS_ADJUST_RESULT {
DEP_PRESENT = 1,
DEP_CHANGED = 2,
DEP_CREATED = 3
};
/* Represents the bits that can be set in the flags field of the
sched_info structure. */
enum SCHED_FLAGS {
/* If set, generate links between instruction as DEPS_LIST.
Otherwise, generate usual INSN_LIST links. */
USE_DEPS_LIST = 1,
/* Perform data or control (or both) speculation.
Results in generation of data and control speculative dependencies.
Requires USE_DEPS_LIST set. */
DO_SPECULATION = USE_DEPS_LIST << 1
};
extern FILE *sched_dump;
extern int sched_verbose;
......@@ -332,17 +477,23 @@ extern void print_insn (char *, rtx, int);
/* Functions in sched-deps.c. */
extern bool sched_insns_conditions_mutex_p (rtx, rtx);
extern int add_dependence (rtx, rtx, enum reg_note);
extern void add_dependence (rtx, rtx, enum reg_note);
extern void sched_analyze (struct deps *, rtx, rtx);
extern void init_deps (struct deps *);
extern void free_deps (struct deps *);
extern void init_deps_global (void);
extern void finish_deps_global (void);
extern void add_forward_dependence (rtx, rtx, enum reg_note);
extern void add_forw_dep (rtx, rtx);
extern void compute_forward_dependences (rtx, rtx);
extern rtx find_insn_list (rtx, rtx);
extern void init_dependency_caches (int);
extern void free_dependency_caches (void);
extern enum DEPS_ADJUST_RESULT add_or_update_back_dep (rtx, rtx,
enum reg_note, ds_t);
extern void add_or_update_back_forw_dep (rtx, rtx, enum reg_note, ds_t);
extern void add_back_forw_dep (rtx, rtx, enum reg_note, ds_t);
extern void delete_back_forw_dep (rtx, rtx);
extern ds_t set_dep_weak (ds_t, ds_t, dw_t);
/* Functions in haifa-sched.c. */
extern int haifa_classify_insn (rtx);
......
......@@ -1816,7 +1816,9 @@ static struct sched_info region_sched_info =
NULL, NULL,
NULL, NULL,
0, 0, 0
0, 0, 0,
0
};
/* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register. */
......@@ -2512,6 +2514,11 @@ schedule_insns (void)
nr_inter = 0;
nr_spec = 0;
/* We need current_sched_info in init_dependency_caches, which is
invoked via sched_init. */
current_sched_info = &region_sched_info;
sched_init ();
min_spec_prob = ((PARAM_VALUE (PARAM_MIN_SPEC_PROB) * REG_BR_PROB_BASE)
......@@ -2519,7 +2526,6 @@ schedule_insns (void)
init_regions ();
current_sched_info = &region_sched_info;
/* Schedule every region in the subroutine. */
for (rgn = 0; rgn < nr_regions; rgn++)
schedule_region (rgn);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment