a parent with this uid. If a parent is a bookkeeping copy, all its originators are transitively included in this set. */ bitmap originators; /* A hashtable caching the result of insn transformations through this one. */ htab_t transformed_insns; /* A context incapsulating this insn. */ struct deps_desc deps_context; /* This field is initialized at the beginning of scheduling and is used to handle sched group instructions. If it is non-null, then it points to the instruction, which should be forced to schedule next. Such instructions are unique. */ insn_t sched_next; /* Cycle at which insn was scheduled. It is greater than zero if insn was scheduled. This is used for bundling. */ int sched_cycle; /* Cycle at which insn's data will be fully ready. */ int ready_cycle; /* Speculations that are being checked by this insn. */ ds_t spec_checked_ds; /* Whether the live set valid or not. */ BOOL_BITFIELD live_valid_p : 1; /* Insn is an ASM. */ BOOL_BITFIELD asm_p : 1; /* True when an insn is scheduled after we've determined that a stall is required. This is used when emulating the Haifa scheduler for bundling. */ BOOL_BITFIELD after_stall_p : 1; }; typedef struct _sel_insn_data sel_insn_data_def; typedef sel_insn_data_def *sel_insn_data_t; extern vec s_i_d; /* Accessor macros for s_i_d. */ #define SID(INSN) (&s_i_d[INSN_LUID (INSN)]) #define SID_BY_UID(UID) (&s_i_d[LUID_BY_UID (UID)]) extern sel_insn_data_def insn_sid (insn_t); #define INSN_ASM_P(INSN) (SID (INSN)->asm_p) #define INSN_SCHED_NEXT(INSN) (SID (INSN)->sched_next) #define INSN_ANALYZED_DEPS(INSN) (SID (INSN)->analyzed_deps) #define INSN_FOUND_DEPS(INSN) (SID (INSN)->found_deps) #define INSN_DEPS_CONTEXT(INSN) (SID (INSN)->deps_context) #define INSN_ORIGINATORS(INSN) (SID (INSN)->originators) #define INSN_ORIGINATORS_BY_UID(UID) (SID_BY_UID (UID)->originators) #define INSN_TRANSFORMED_INSNS(INSN) (SID (INSN)->transformed_insns) #define INSN_EXPR(INSN) (&SID (INSN)->expr) #define INSN_LIVE(INSN) (SID (INSN)->live) #define INSN_LIVE_VALID_P(INSN) (SID (INSN)->live_valid_p) #define INSN_VINSN(INSN) (EXPR_VINSN (INSN_EXPR (INSN))) #define INSN_TYPE(INSN) (VINSN_TYPE (INSN_VINSN (INSN))) #define INSN_SIMPLEJUMP_P(INSN) (INSN_TYPE (INSN) == PC) #define INSN_LHS(INSN) (VINSN_LHS (INSN_VINSN (INSN))) #define INSN_RHS(INSN) (VINSN_RHS (INSN_VINSN (INSN))) #define INSN_REG_SETS(INSN) (VINSN_REG_SETS (INSN_VINSN (INSN))) #define INSN_REG_CLOBBERS(INSN) (VINSN_REG_CLOBBERS (INSN_VINSN (INSN))) #define INSN_REG_USES(INSN) (VINSN_REG_USES (INSN_VINSN (INSN))) #define INSN_SCHED_TIMES(INSN) (EXPR_SCHED_TIMES (INSN_EXPR (INSN))) #define INSN_SEQNO(INSN) (SID (INSN)->seqno) #define INSN_AFTER_STALL_P(INSN) (SID (INSN)->after_stall_p) #define INSN_SCHED_CYCLE(INSN) (SID (INSN)->sched_cycle) #define INSN_READY_CYCLE(INSN) (SID (INSN)->ready_cycle) #define INSN_SPEC_CHECKED_DS(INSN) (SID (INSN)->spec_checked_ds) /* A global level shows whether an insn is valid or not. */ extern int global_level; #define INSN_WS_LEVEL(INSN) (SID (INSN)->ws_level) extern av_set_t get_av_set (insn_t); extern int get_av_level (insn_t); #define AV_SET(INSN) (get_av_set (INSN)) #define AV_LEVEL(INSN) (get_av_level (INSN)) #define AV_SET_VALID_P(INSN) (AV_LEVEL (INSN) == global_level) /* A list of fences currently in the works. */ extern flist_t fences; /* A NOP pattern used as a placeholder for real insns. */ extern rtx nop_pattern; /* An insn that 'contained' in EXIT block. */ extern rtx_insn *exit_insn; /* Provide a separate luid for the insn. */ #define INSN_INIT_TODO_LUID (1) /* Initialize s_s_i_d. */ #define INSN_INIT_TODO_SSID (2) /* Initialize data for simplejump. */ #define INSN_INIT_TODO_SIMPLEJUMP (4) /* Return true if INSN is a local NOP. The nop is local in the sense that it was emitted by the scheduler as a temporary insn and will soon be deleted. These nops are identified by their pattern. */ #define INSN_NOP_P(INSN) (PATTERN (INSN) == nop_pattern) /* Return true if INSN is linked into instruction stream. NB: It is impossible for INSN to have one field null and the other not null: gcc_assert ((PREV_INSN (INSN) == NULL_RTX) == (NEXT_INSN (INSN) == NULL_RTX)) is valid. */ #define INSN_IN_STREAM_P(INSN) (PREV_INSN (INSN) && NEXT_INSN (INSN)) /* Return true if INSN is in current fence. */ #define IN_CURRENT_FENCE_P(INSN) (flist_lookup (fences, INSN) != NULL) /* Marks loop as being considered for pipelining. */ #define MARK_LOOP_FOR_PIPELINING(LOOP) ((LOOP)->aux = (void *)(size_t)(1)) #define LOOP_MARKED_FOR_PIPELINING_P(LOOP) ((size_t)((LOOP)->aux)) /* Saved loop preheader to transfer when scheduling the loop. */ #define LOOP_PREHEADER_BLOCKS(LOOP) ((size_t)((LOOP)->aux) == 1 \ ? NULL \ : ((vec *) (LOOP)->aux)) #define SET_LOOP_PREHEADER_BLOCKS(LOOP,BLOCKS) ((LOOP)->aux \ = (BLOCKS != NULL \ ? BLOCKS \ : (LOOP)->aux)) extern bitmap blocks_to_reschedule;