+2015-06-17 Andrew MacLeod <amacleod@redhat.com>
+
+ * function.h (struct rtl_data): Remove struct and accessor macros.
+ * emit-rtl.h (struct rtl_data): Relocate to here.
+ * Makefile.in (GTFILES): Add emit-rtl.h.
+ * df-core.c: Include emit-rtl.h.
+ * genattrtab.c: Likewise.
+ * genconditions.c: Likewise.
+ * genpreds.c: Likewise.
+ * genrecog.c: Likewise.
+ * regcprop.c: Likewise.
+ * resource.c: Likewise.
+ * sched-rgn.c: Likewise.
+ * config/aarch64/cortex-a57-fma-steering.c: Likewise.
+ * config/i386/winnt.c: Likewise.
+
2015-06-17 Jakub Jelinek <jakub@redhat.com>
PR middle-end/66429
$(srcdir)/dwarf2cfi.c \
$(srcdir)/dwarf2out.c \
$(srcdir)/tree-vect-generic.c \
- $(srcdir)/dojump.c \
+ $(srcdir)/dojump.c $(srcdir)/emit-rtl.h \
$(srcdir)/emit-rtl.c $(srcdir)/except.h $(srcdir)/explow.c $(srcdir)/expr.c \
$(srcdir)/expr.h \
$(srcdir)/function.c $(srcdir)/except.c \
#include "df.h"
#include "target.h"
#include "rtl.h"
+#include "emit-rtl.h"
#include "context.h"
#include "tree-pass.h"
#include "regrename.h"
#include "except.h"
#include "predict.h"
#include "function.h"
+#include "emit-rtl.h"
#include "dominance.h"
#include "cfg.h"
#include "cfgrtl.h"
#include "tree-pass.h"
#include "params.h"
#include "cfgloop.h"
+#include "emit-rtl.h"
static void *df_get_bb_info (struct dataflow *, unsigned int);
static void df_set_bb_info (struct dataflow *, unsigned int, void *);
#ifndef GCC_EMIT_RTL_H
#define GCC_EMIT_RTL_H
+struct temp_slot;
+typedef struct temp_slot *temp_slot_p;
+
+/* Datastructures maintained for currently processed function in RTL form. */
+struct GTY(()) rtl_data {
+ struct expr_status expr;
+ struct emit_status emit;
+ struct varasm_status varasm;
+ struct incoming_args args;
+ struct function_subsections subsections;
+ struct rtl_eh eh;
+
+ /* For function.c */
+
+ /* # of bytes of outgoing arguments. If ACCUMULATE_OUTGOING_ARGS is
+ defined, the needed space is pushed by the prologue. */
+ int outgoing_args_size;
+
+ /* If nonzero, an RTL expression for the location at which the current
+ function returns its result. If the current function returns its
+ result in a register, current_function_return_rtx will always be
+ the hard register containing the result. */
+ rtx return_rtx;
+ /* If nonxero, an RTL expression for the lcoation at which the current
+ function returns bounds for its result. */
+ rtx return_bnd;
+
+ /* Vector of initial-value pairs. Each pair consists of a pseudo
+ register of approprite mode that stores the initial value a hard
+ register REGNO, and that hard register itself. */
+ /* ??? This could be a VEC but there is currently no way to define an
+ opaque VEC type. */
+ struct initial_value_struct *hard_reg_initial_vals;
+
+ /* A variable living at the top of the frame that holds a known value.
+ Used for detecting stack clobbers. */
+ tree stack_protect_guard;
+
+ /* List (chain of INSN_LIST) of labels heading the current handlers for
+ nonlocal gotos. */
+ rtx_insn_list *x_nonlocal_goto_handler_labels;
+
+ /* Label that will go on function epilogue.
+ Jumping to this label serves as a "return" instruction
+ on machines which require execution of the epilogue on all returns. */
+ rtx_code_label *x_return_label;
+
+ /* Label that will go on the end of function epilogue.
+ Jumping to this label serves as a "naked return" instruction
+ on machines which require execution of the epilogue on all returns. */
+ rtx_code_label *x_naked_return_label;
+
+ /* List (chain of EXPR_LISTs) of all stack slots in this function.
+ Made for the sake of unshare_all_rtl. */
+ rtx_expr_list *x_stack_slot_list;
+
+ /* List of empty areas in the stack frame. */
+ struct frame_space *frame_space_list;
+
+ /* Place after which to insert the tail_recursion_label if we need one. */
+ rtx_note *x_stack_check_probe_note;
+
+ /* Location at which to save the argument pointer if it will need to be
+ referenced. There are two cases where this is done: if nonlocal gotos
+ exist, or if vars stored at an offset from the argument pointer will be
+ needed by inner routines. */
+ rtx x_arg_pointer_save_area;
+
+ /* Dynamic Realign Argument Pointer used for realigning stack. */
+ rtx drap_reg;
+
+ /* Offset to end of allocated area of stack frame.
+ If stack grows down, this is the address of the last stack slot allocated.
+ If stack grows up, this is the address for the next slot. */
+ HOST_WIDE_INT x_frame_offset;
+
+ /* Insn after which register parms and SAVE_EXPRs are born, if nonopt. */
+ rtx_insn *x_parm_birth_insn;
+
+ /* List of all used temporaries allocated, by level. */
+ vec<temp_slot_p, va_gc> *x_used_temp_slots;
+
+ /* List of available temp slots. */
+ struct temp_slot *x_avail_temp_slots;
+
+ /* Current nesting level for temporaries. */
+ int x_temp_slot_level;
+
+ /* The largest alignment needed on the stack, including requirement
+ for outgoing stack alignment. */
+ unsigned int stack_alignment_needed;
+
+ /* Preferred alignment of the end of stack frame, which is preferred
+ to call other functions. */
+ unsigned int preferred_stack_boundary;
+
+ /* The minimum alignment of parameter stack. */
+ unsigned int parm_stack_boundary;
+
+ /* The largest alignment of slot allocated on the stack. */
+ unsigned int max_used_stack_slot_alignment;
+
+ /* The stack alignment estimated before reload, with consideration of
+ following factors:
+ 1. Alignment of local stack variables (max_used_stack_slot_alignment)
+ 2. Alignment requirement to call other functions
+ (preferred_stack_boundary)
+ 3. Alignment of non-local stack variables but might be spilled in
+ local stack. */
+ unsigned int stack_alignment_estimated;
+
+ /* For reorg. */
+
+ /* Nonzero if function being compiled called builtin_return_addr or
+ builtin_frame_address with nonzero count. */
+ bool accesses_prior_frames;
+
+ /* Nonzero if the function calls __builtin_eh_return. */
+ bool calls_eh_return;
+
+ /* Nonzero if function saves all registers, e.g. if it has a nonlocal
+ label that can reach the exit block via non-exceptional paths. */
+ bool saves_all_registers;
+
+ /* Nonzero if function being compiled has nonlocal gotos to parent
+ function. */
+ bool has_nonlocal_goto;
+
+ /* Nonzero if function being compiled has an asm statement. */
+ bool has_asm_statement;
+
+ /* This bit is used by the exception handling logic. It is set if all
+ calls (if any) are sibling calls. Such functions do not have to
+ have EH tables generated, as they cannot throw. A call to such a
+ function, however, should be treated as throwing if any of its callees
+ can throw. */
+ bool all_throwers_are_sibcalls;
+
+ /* Nonzero if stack limit checking should be enabled in the current
+ function. */
+ bool limit_stack;
+
+ /* Nonzero if profiling code should be generated. */
+ bool profile;
+
+ /* Nonzero if the current function uses the constant pool. */
+ bool uses_const_pool;
+
+ /* Nonzero if the current function uses pic_offset_table_rtx. */
+ bool uses_pic_offset_table;
+
+ /* Nonzero if the current function needs an lsda for exception handling. */
+ bool uses_eh_lsda;
+
+ /* Set when the tail call has been produced. */
+ bool tail_call_emit;
+
+ /* Nonzero if code to initialize arg_pointer_save_area has been emitted. */
+ bool arg_pointer_save_area_init;
+
+ /* Nonzero if current function must be given a frame pointer.
+ Set in reload1.c or lra-eliminations.c if anything is allocated
+ on the stack there. */
+ bool frame_pointer_needed;
+
+ /* When set, expand should optimize for speed. */
+ bool maybe_hot_insn_p;
+
+ /* Nonzero if function stack realignment is needed. This flag may be
+ set twice: before and after reload. It is set before reload wrt
+ stack alignment estimation before reload. It will be changed after
+ reload if by then criteria of stack realignment is different.
+ The value set after reload is the accurate one and is finalized. */
+ bool stack_realign_needed;
+
+ /* Nonzero if function stack realignment is tried. This flag is set
+ only once before reload. It affects register elimination. This
+ is used to generate DWARF debug info for stack variables. */
+ bool stack_realign_tried;
+
+ /* Nonzero if function being compiled needs dynamic realigned
+ argument pointer (drap) if stack needs realigning. */
+ bool need_drap;
+
+ /* Nonzero if function stack realignment estimation is done, namely
+ stack_realign_needed flag has been set before reload wrt estimated
+ stack alignment info. */
+ bool stack_realign_processed;
+
+ /* Nonzero if function stack realignment has been finalized, namely
+ stack_realign_needed flag has been set and finalized after reload. */
+ bool stack_realign_finalized;
+
+ /* True if dbr_schedule has already been called for this function. */
+ bool dbr_scheduled_p;
+
+ /* True if current function can not throw. Unlike
+ TREE_NOTHROW (current_function_decl) it is set even for overwritable
+ function where currently compiled version of it is nothrow. */
+ bool nothrow;
+
+ /* True if we performed shrink-wrapping for the current function. */
+ bool shrink_wrapped;
+
+ /* Nonzero if function being compiled doesn't modify the stack pointer
+ (ignoring the prologue and epilogue). This is only valid after
+ pass_stack_ptr_mod has run. */
+ bool sp_is_unchanging;
+
+ /* Nonzero if function being compiled doesn't contain any calls
+ (ignoring the prologue and epilogue). This is set prior to
+ local register allocation and is valid for the remaining
+ compiler passes. */
+ bool is_leaf;
+
+ /* Nonzero if the function being compiled is a leaf function which only
+ uses leaf registers. This is valid after reload (specifically after
+ sched2) and is useful only if the port defines LEAF_REGISTERS. */
+ bool uses_only_leaf_regs;
+
+ /* Nonzero if the function being compiled has undergone hot/cold partitioning
+ (under flag_reorder_blocks_and_partition) and has at least one cold
+ block. */
+ bool has_bb_partition;
+
+ /* Nonzero if the function being compiled has completed the bb reordering
+ pass. */
+ bool bb_reorder_complete;
+
+ /* Like regs_ever_live, but 1 if a reg is set or clobbered from an
+ asm. Unlike regs_ever_live, elements of this array corresponding
+ to eliminable regs (like the frame pointer) are set if an asm
+ sets them. */
+ HARD_REG_SET asm_clobbers;
+};
+
+#define return_label (crtl->x_return_label)
+#define naked_return_label (crtl->x_naked_return_label)
+#define stack_slot_list (crtl->x_stack_slot_list)
+#define parm_birth_insn (crtl->x_parm_birth_insn)
+#define frame_offset (crtl->x_frame_offset)
+#define stack_check_probe_note (crtl->x_stack_check_probe_note)
+#define arg_pointer_save_area (crtl->x_arg_pointer_save_area)
+#define used_temp_slots (crtl->x_used_temp_slots)
+#define avail_temp_slots (crtl->x_avail_temp_slots)
+#define temp_slot_level (crtl->x_temp_slot_level)
+#define nonlocal_goto_handler_labels (crtl->x_nonlocal_goto_handler_labels)
+#define frame_pointer_needed (crtl->frame_pointer_needed)
+#define stack_realign_fp (crtl->stack_realign_needed && !crtl->need_drap)
+#define stack_realign_drap (crtl->stack_realign_needed && crtl->need_drap)
+
+extern GTY(()) struct rtl_data x_rtl;
+
+/* Accessor to RTL datastructures. We keep them statically allocated now since
+ we never keep multiple functions. For threaded compiler we might however
+ want to do differently. */
+#define crtl (&x_rtl)
+
/* Return whether two MEM_ATTRs are equal. */
bool mem_attrs_eq_p (const struct mem_attrs *, const struct mem_attrs *);
#define stack_pointer_delta (crtl->expr.x_stack_pointer_delta)
struct gimple_df;
-struct temp_slot;
-typedef struct temp_slot *temp_slot_p;
struct call_site_record_d;
struct dw_fde_node;
HOST_WIDE_INT length;
};
-/* Datastructures maintained for currently processed function in RTL form. */
-struct GTY(()) rtl_data {
- struct expr_status expr;
- struct emit_status emit;
- struct varasm_status varasm;
- struct incoming_args args;
- struct function_subsections subsections;
- struct rtl_eh eh;
-
- /* For function.c */
-
- /* # of bytes of outgoing arguments. If ACCUMULATE_OUTGOING_ARGS is
- defined, the needed space is pushed by the prologue. */
- int outgoing_args_size;
-
- /* If nonzero, an RTL expression for the location at which the current
- function returns its result. If the current function returns its
- result in a register, current_function_return_rtx will always be
- the hard register containing the result. */
- rtx return_rtx;
- /* If nonxero, an RTL expression for the lcoation at which the current
- function returns bounds for its result. */
- rtx return_bnd;
-
- /* Vector of initial-value pairs. Each pair consists of a pseudo
- register of approprite mode that stores the initial value a hard
- register REGNO, and that hard register itself. */
- /* ??? This could be a VEC but there is currently no way to define an
- opaque VEC type. */
- struct initial_value_struct *hard_reg_initial_vals;
-
- /* A variable living at the top of the frame that holds a known value.
- Used for detecting stack clobbers. */
- tree stack_protect_guard;
-
- /* List (chain of INSN_LIST) of labels heading the current handlers for
- nonlocal gotos. */
- rtx_insn_list *x_nonlocal_goto_handler_labels;
-
- /* Label that will go on function epilogue.
- Jumping to this label serves as a "return" instruction
- on machines which require execution of the epilogue on all returns. */
- rtx_code_label *x_return_label;
-
- /* Label that will go on the end of function epilogue.
- Jumping to this label serves as a "naked return" instruction
- on machines which require execution of the epilogue on all returns. */
- rtx_code_label *x_naked_return_label;
-
- /* List (chain of EXPR_LISTs) of all stack slots in this function.
- Made for the sake of unshare_all_rtl. */
- rtx_expr_list *x_stack_slot_list;
-
- /* List of empty areas in the stack frame. */
- struct frame_space *frame_space_list;
-
- /* Place after which to insert the tail_recursion_label if we need one. */
- rtx_note *x_stack_check_probe_note;
-
- /* Location at which to save the argument pointer if it will need to be
- referenced. There are two cases where this is done: if nonlocal gotos
- exist, or if vars stored at an offset from the argument pointer will be
- needed by inner routines. */
- rtx x_arg_pointer_save_area;
-
- /* Dynamic Realign Argument Pointer used for realigning stack. */
- rtx drap_reg;
-
- /* Offset to end of allocated area of stack frame.
- If stack grows down, this is the address of the last stack slot allocated.
- If stack grows up, this is the address for the next slot. */
- HOST_WIDE_INT x_frame_offset;
-
- /* Insn after which register parms and SAVE_EXPRs are born, if nonopt. */
- rtx_insn *x_parm_birth_insn;
-
- /* List of all used temporaries allocated, by level. */
- vec<temp_slot_p, va_gc> *x_used_temp_slots;
-
- /* List of available temp slots. */
- struct temp_slot *x_avail_temp_slots;
-
- /* Current nesting level for temporaries. */
- int x_temp_slot_level;
-
- /* The largest alignment needed on the stack, including requirement
- for outgoing stack alignment. */
- unsigned int stack_alignment_needed;
-
- /* Preferred alignment of the end of stack frame, which is preferred
- to call other functions. */
- unsigned int preferred_stack_boundary;
-
- /* The minimum alignment of parameter stack. */
- unsigned int parm_stack_boundary;
-
- /* The largest alignment of slot allocated on the stack. */
- unsigned int max_used_stack_slot_alignment;
-
- /* The stack alignment estimated before reload, with consideration of
- following factors:
- 1. Alignment of local stack variables (max_used_stack_slot_alignment)
- 2. Alignment requirement to call other functions
- (preferred_stack_boundary)
- 3. Alignment of non-local stack variables but might be spilled in
- local stack. */
- unsigned int stack_alignment_estimated;
-
- /* For reorg. */
-
- /* Nonzero if function being compiled called builtin_return_addr or
- builtin_frame_address with nonzero count. */
- bool accesses_prior_frames;
-
- /* Nonzero if the function calls __builtin_eh_return. */
- bool calls_eh_return;
-
- /* Nonzero if function saves all registers, e.g. if it has a nonlocal
- label that can reach the exit block via non-exceptional paths. */
- bool saves_all_registers;
-
- /* Nonzero if function being compiled has nonlocal gotos to parent
- function. */
- bool has_nonlocal_goto;
-
- /* Nonzero if function being compiled has an asm statement. */
- bool has_asm_statement;
-
- /* This bit is used by the exception handling logic. It is set if all
- calls (if any) are sibling calls. Such functions do not have to
- have EH tables generated, as they cannot throw. A call to such a
- function, however, should be treated as throwing if any of its callees
- can throw. */
- bool all_throwers_are_sibcalls;
-
- /* Nonzero if stack limit checking should be enabled in the current
- function. */
- bool limit_stack;
-
- /* Nonzero if profiling code should be generated. */
- bool profile;
-
- /* Nonzero if the current function uses the constant pool. */
- bool uses_const_pool;
-
- /* Nonzero if the current function uses pic_offset_table_rtx. */
- bool uses_pic_offset_table;
-
- /* Nonzero if the current function needs an lsda for exception handling. */
- bool uses_eh_lsda;
-
- /* Set when the tail call has been produced. */
- bool tail_call_emit;
-
- /* Nonzero if code to initialize arg_pointer_save_area has been emitted. */
- bool arg_pointer_save_area_init;
-
- /* Nonzero if current function must be given a frame pointer.
- Set in reload1.c or lra-eliminations.c if anything is allocated
- on the stack there. */
- bool frame_pointer_needed;
-
- /* When set, expand should optimize for speed. */
- bool maybe_hot_insn_p;
-
- /* Nonzero if function stack realignment is needed. This flag may be
- set twice: before and after reload. It is set before reload wrt
- stack alignment estimation before reload. It will be changed after
- reload if by then criteria of stack realignment is different.
- The value set after reload is the accurate one and is finalized. */
- bool stack_realign_needed;
-
- /* Nonzero if function stack realignment is tried. This flag is set
- only once before reload. It affects register elimination. This
- is used to generate DWARF debug info for stack variables. */
- bool stack_realign_tried;
-
- /* Nonzero if function being compiled needs dynamic realigned
- argument pointer (drap) if stack needs realigning. */
- bool need_drap;
-
- /* Nonzero if function stack realignment estimation is done, namely
- stack_realign_needed flag has been set before reload wrt estimated
- stack alignment info. */
- bool stack_realign_processed;
-
- /* Nonzero if function stack realignment has been finalized, namely
- stack_realign_needed flag has been set and finalized after reload. */
- bool stack_realign_finalized;
-
- /* True if dbr_schedule has already been called for this function. */
- bool dbr_scheduled_p;
-
- /* True if current function can not throw. Unlike
- TREE_NOTHROW (current_function_decl) it is set even for overwritable
- function where currently compiled version of it is nothrow. */
- bool nothrow;
-
- /* True if we performed shrink-wrapping for the current function. */
- bool shrink_wrapped;
-
- /* Nonzero if function being compiled doesn't modify the stack pointer
- (ignoring the prologue and epilogue). This is only valid after
- pass_stack_ptr_mod has run. */
- bool sp_is_unchanging;
-
- /* Nonzero if function being compiled doesn't contain any calls
- (ignoring the prologue and epilogue). This is set prior to
- local register allocation and is valid for the remaining
- compiler passes. */
- bool is_leaf;
-
- /* Nonzero if the function being compiled is a leaf function which only
- uses leaf registers. This is valid after reload (specifically after
- sched2) and is useful only if the port defines LEAF_REGISTERS. */
- bool uses_only_leaf_regs;
-
- /* Nonzero if the function being compiled has undergone hot/cold partitioning
- (under flag_reorder_blocks_and_partition) and has at least one cold
- block. */
- bool has_bb_partition;
-
- /* Nonzero if the function being compiled has completed the bb reordering
- pass. */
- bool bb_reorder_complete;
-
- /* Like regs_ever_live, but 1 if a reg is set or clobbered from an
- asm. Unlike regs_ever_live, elements of this array corresponding
- to eliminable regs (like the frame pointer) are set if an asm
- sets them. */
- HARD_REG_SET asm_clobbers;
-};
-
-#define return_label (crtl->x_return_label)
-#define naked_return_label (crtl->x_naked_return_label)
-#define stack_slot_list (crtl->x_stack_slot_list)
-#define parm_birth_insn (crtl->x_parm_birth_insn)
-#define frame_offset (crtl->x_frame_offset)
-#define stack_check_probe_note (crtl->x_stack_check_probe_note)
-#define arg_pointer_save_area (crtl->x_arg_pointer_save_area)
-#define used_temp_slots (crtl->x_used_temp_slots)
-#define avail_temp_slots (crtl->x_avail_temp_slots)
-#define temp_slot_level (crtl->x_temp_slot_level)
-#define nonlocal_goto_handler_labels (crtl->x_nonlocal_goto_handler_labels)
-#define frame_pointer_needed (crtl->frame_pointer_needed)
-#define stack_realign_fp (crtl->stack_realign_needed && !crtl->need_drap)
-#define stack_realign_drap (crtl->stack_realign_needed && crtl->need_drap)
-
-extern GTY(()) struct rtl_data x_rtl;
-
-/* Accessor to RTL datastructures. We keep them statically allocated now since
- we never keep multiple functions. For threaded compiler we might however
- want to do differently. */
-#define crtl (&x_rtl)
-
struct GTY(()) stack_usage
{
/* # of bytes of static stack space allocated by the function. */
extern void expand_dummy_function_end (void);
extern void thread_prologue_and_epilogue_insns (void);
-
-#ifdef RTX_CODE
extern void diddle_return_value (void (*)(rtx, void*), void*);
extern void clobber_return_register (void);
-#endif
-
extern void do_warn_unused_parameter (tree);
extern void expand_function_end (void);
extern rtx get_arg_pointer_save_area (void);
fprintf (outf, "#include \"toplev.h\"\n");
fprintf (outf, "#include \"flags.h\"\n");
fprintf (outf, "#include \"function.h\"\n");
+ fprintf (outf, "#include \"emit-rtl.h\"\n");
fprintf (outf, "#include \"predict.h\"\n");
fprintf (outf, "\n");
fprintf (outf, "#define operands recog_data.operand\n\n");
#include \"tm_p.h\"\n\
#include \"hard-reg-set.h\"\n\
#include \"function.h\"\n\
+#include \"emit-rtl.h\"\n\
\n\
/* Fake - insn-config.h doesn't exist yet. */\n\
#define MAX_RECOG_OPERANDS 10\n\
#include \"diagnostic-core.h\"\n\
#include \"reload.h\"\n\
#include \"regs.h\"\n\
+#include \"emit-rtl.h\"\n\
#include \"tm-constrs.h\"\n");
FOR_ALL_PREDICATES (p)
#include \"hard-reg-set.h\"\n\
#include \"input.h\"\n\
#include \"function.h\"\n\
+#include \"emit-rtl.h\"\n\
#include \"insn-config.h\"\n\
#include \"recog.h\"\n\
#include \"output.h\"\n\
#include "tree-pass.h"
#include "df.h"
#include "rtl-iter.h"
+#include "emit-rtl.h"
/* The following code does forward propagation of hard register copies.
The object is to eliminate as many dependencies as possible, so that
#include "insn-attr.h"
#include "params.h"
#include "df.h"
+#include "emit-rtl.h"
/* This structure is used to record liveness information at the targets or
fallthrough insns of branches. We will most likely need the information
#include "target.h"
#include "tree-pass.h"
#include "dbgcnt.h"
+#include "emit-rtl.h"
#ifdef INSN_SCHEDULING