+2014-07-11 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/56858
+ * config/alpha/alpha.c: Include tree-pass.h, context.h
+ and pass_manager.h.
+ (pass_data_handle_trap_shadows): New pass.
+ (pass_handle_trap_shadows::gate): New pass gate function.
+ (make_pass_handle_trap_shadows): New function.
+ (rest_of_handle_trap_shadows): Ditto.
+
+ (alpha_align_insns_1): Rename from alpha_align_insns.
+ (pass_data_align_insns): New pass.
+ (pass_align_insns::gate): New pass gate function.
+ (make_pass_aling_insns): New function.
+ (rest_of_align_insns): Ditto.
+ (alpha_align_insns): Ditto.
+
+ (alpha_option_override): Declare handle_trap_shadows info
+ and align_insns_info. Register handle_trap_shadows and align_insns
+ passes here.
+ (alpha_reorg): Do not call alpha_trap_shadows and
+ alpha_align_insn from here.
+
+ (alpha_pad_function_end): Do not skip BARRIERs.
+
2014-07-10 Rong Xu <xur@google.com>
- Add gcov-tool: an offline gcda profile processing tool
- Support.
+ Add gcov-tool: an offline gcda profile processing tool support.
* gcov-io.c (gcov_position): Make avaialble to gcov-tool.
(gcov_is_error): Ditto.
(gcov_read_string): Ditto.
2014-07-09 Tom de Vries <tom@codesourcery.com>
- * final.c (get_call_fndecl): Declare.
- (self_recursive_call_p): New function.
- (collect_fn_hard_reg_usage): Handle self-recursive function calls.
+ * final.c (get_call_fndecl): Declare.
+ (self_recursive_call_p): New function.
+ (collect_fn_hard_reg_usage): Handle self-recursive function calls.
2014-07-08 Jan Hubicka <hubicka@ucw.cz>
2014-07-08 Trevor Saunders <tsaunders@mozilla.com>
PR bootstrap/61679
- * hash-table.h: use hash_table::value_type instead of
- Descriptor::value_type in the return types of several methods.
+ * hash-table.h: use hash_table::value_type instead of
+ Descriptor::value_type in the return types of several methods.
2014-07-08 Trevor Saunders <tsaunders@mozilla.com>
2014-07-08 Yuri Rumyantsev <ysrumyan@gmail.com>
PR tree-optimization/61576
- * tree-if-conv.c (is_cond_scalar_reduction): Add check that
- basic block containing reduction statement is predecessor
- of phi basi block.
+ * tree-if-conv.c (is_cond_scalar_reduction): Add check that basic
+ block containing reduction statement is predecessor of phi basi block.
2014-07-08 Marek Polacek <polacek@redhat.com>
2014-07-07 Jan Hubicka <hubicka@ucw.cz>
- * symtab.c: Include calls.h
- (symtab_nonoverwritable_alias_1): Check sanity of the local
- alias.
+ * symtab.c: Include calls.h.
+ (symtab_nonoverwritable_alias_1): Check sanity of the local alias.
2014-07-07 Maciej W. Rozycki <macro@codesourcery.com>
* config/rs6000/rs6000.c (output_vec_const_move): Handle
little-endian code generation.
* config/rs6000/spe.md (spe_evmergehi): Rename to...
- (vec_perm00_v2si): ... this. Handle little-endian code
- generation.
+ (vec_perm00_v2si): ... this. Handle little-endian code generation.
(spe_evmergehilo): Rename to...
- (vec_perm01_v2si): ... this. Handle little-endian code
- generation.
+ (vec_perm01_v2si): ... this. Handle little-endian code generation.
(spe_evmergelo): Rename to...
- (vec_perm11_v2si): ... this. Handle little-endian code
- generation.
+ (vec_perm11_v2si): ... this. Handle little-endian code generation.
(spe_evmergelohi): Rename to...
- (vec_perm10_v2si): ... this. Handle little-endian code
- generation.
+ (vec_perm10_v2si): ... this. Handle little-endian code generation.
(spe_evmergehi, spe_evmergehilo): New expanders.
(spe_evmergelo, spe_evmergelohi): Likewise.
- (*frob_<SPE64:mode>_<DITI:mode>): Handle little-endian code
- generation.
+ (*frob_<SPE64:mode>_<DITI:mode>): Handle little-endian code generation.
(*frob_tf_ti): Likewise.
(*frob_<mode>_di_2): Likewise.
(*frob_tf_di_8_2): Likewise.
endianness only.
(*mov_si<mode>_e500_subreg0_le): New instruction pattern.
(*mov_si<mode>_e500_subreg0_elf_low): Rename to...
- (*mov_si<mode>_e500_subreg0_elf_low_be): ... this. Restrict to
+ (*mov_si<mode>_e500_subreg0_elf_low_be): ... this. Restrict to
the big endianness only.
(*mov_si<mode>_e500_subreg0_elf_low_le): New instruction pattern.
(*mov_si<mode>_e500_subreg0_2): Rename to...
2014-07-07 Max Ostapenko <m.ostapenko@partner.samsung.com>
- * asan.c (instrument_strlen_call): Do not instrument first byte in strlen
- if already instrumented.
+ * asan.c (instrument_strlen_call): Do not instrument first byte
+ in strlen if already instrumented.
2014-07-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
#include "gimple-expr.h"
#include "is-a.h"
#include "gimple.h"
+#include "tree-pass.h"
+#include "context.h"
+#include "pass_manager.h"
#include "gimple-iterator.h"
#include "gimplify.h"
#include "gimple-ssa.h"
/* Declarations of static functions. */
static struct machine_function *alpha_init_machine_status (void);
static rtx alpha_emit_xfloating_compare (enum rtx_code *, rtx, rtx);
+static void alpha_handle_trap_shadows (void);
+static void alpha_align_insns (void);
#if TARGET_ABI_OPEN_VMS
static void alpha_write_linkage (FILE *, const char *);
#define vms_patch_builtins() gcc_unreachable()
#endif
\f
+static unsigned int
+rest_of_handle_trap_shadows (void)
+{
+ alpha_handle_trap_shadows ();
+ return 0;
+}
+
+namespace {
+
+const pass_data pass_data_handle_trap_shadows =
+{
+ RTL_PASS,
+ "trap_shadows", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
+ TV_NONE, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_df_finish, /* todo_flags_finish */
+};
+
+class pass_handle_trap_shadows : public rtl_opt_pass
+{
+public:
+ pass_handle_trap_shadows(gcc::context *ctxt)
+ : rtl_opt_pass(pass_data_handle_trap_shadows, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ virtual bool gate (function *)
+ {
+ return alpha_tp != ALPHA_TP_PROG || flag_exceptions;
+ }
+
+ virtual unsigned int execute (function *)
+ {
+ return rest_of_handle_trap_shadows ();
+ }
+
+}; // class pass_handle_trap_shadows
+
+} // anon namespace
+
+rtl_opt_pass *
+make_pass_handle_trap_shadows (gcc::context *ctxt)
+{
+ return new pass_handle_trap_shadows (ctxt);
+}
+
+static unsigned int
+rest_of_align_insns (void)
+{
+ alpha_align_insns ();
+ return 0;
+}
+
+namespace {
+
+const pass_data pass_data_align_insns =
+{
+ RTL_PASS,
+ "align_insns", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
+ TV_NONE, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_df_finish, /* todo_flags_finish */
+};
+
+class pass_align_insns : public rtl_opt_pass
+{
+public:
+ pass_align_insns(gcc::context *ctxt)
+ : rtl_opt_pass(pass_data_align_insns, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ virtual bool gate (function *)
+ {
+ /* Due to the number of extra trapb insns, don't bother fixing up
+ alignment when trap precision is instruction. Moreover, we can
+ only do our job when sched2 is run. */
+ return ((alpha_tune == PROCESSOR_EV4
+ || alpha_tune == PROCESSOR_EV5)
+ && optimize && !optimize_size
+ && alpha_tp != ALPHA_TP_INSN
+ && flag_schedule_insns_after_reload);
+ }
+
+ virtual unsigned int execute (function *)
+ {
+ return rest_of_align_insns ();
+ }
+
+}; // class pass_align_insns
+
+} // anon namespace
+
+rtl_opt_pass *
+make_pass_align_insns (gcc::context *ctxt)
+{
+ return new pass_align_insns (ctxt);
+}
+
#ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING
/* Implement TARGET_MANGLE_TYPE. */
64, 64, 16*1024 }
};
+ opt_pass *pass_handle_trap_shadows = make_pass_handle_trap_shadows (g);
+ static struct register_pass_info handle_trap_shadows_info
+ = { pass_handle_trap_shadows, "eh_ranges",
+ 1, PASS_POS_INSERT_AFTER
+ };
+
+ opt_pass *pass_align_insns = make_pass_align_insns (g);
+ static struct register_pass_info align_insns_info
+ = { pass_align_insns, "shorten",
+ 1, PASS_POS_INSERT_BEFORE
+ };
+
int const ct_size = ARRAY_SIZE (cpu_table);
int line_size = 0, l1_size = 0, l2_size = 0;
int i;
if (!(target_flags_explicit & MASK_LONG_DOUBLE_128))
target_flags |= MASK_LONG_DOUBLE_128;
#endif
+
+ /* This needs to be done at start up. It's convenient to do it here. */
+ register_pass (&handle_trap_shadows_info);
+ register_pass (&align_insns_info);
}
\f
/* Returns 1 if VALUE is a mask that contains full bytes of zero or ones. */
/* The instruction group alignment main loop. */
static void
-alpha_align_insns (unsigned int max_align,
- rtx (*next_group) (rtx, int *, int *),
- rtx (*next_nop) (int *))
+alpha_align_insns_1 (unsigned int max_align,
+ rtx (*next_group) (rtx, int *, int *),
+ rtx (*next_nop) (int *))
{
/* ALIGN is the known alignment for the insn group. */
unsigned int align;
}
}
+static void
+alpha_align_insns (void)
+{
+ if (alpha_tune == PROCESSOR_EV4)
+ alpha_align_insns_1 (8, alphaev4_next_group, alphaev4_next_nop);
+ else if (alpha_tune == PROCESSOR_EV5)
+ alpha_align_insns_1 (16, alphaev5_next_group, alphaev5_next_nop);
+ else
+ gcc_unreachable ();
+}
+
/* Insert an unop between sibcall or noreturn function call and GP load. */
static void
next = NEXT_INSN (insn);
if (next == NULL)
continue;
- if (BARRIER_P (next))
- {
- next = NEXT_INSN (next);
- if (next == NULL)
- continue;
- }
if (NOTE_P (next) && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
insn = next;
if (current_function_has_exception_handlers ())
alpha_pad_function_end ();
-
- if (alpha_tp != ALPHA_TP_PROG || flag_exceptions)
- alpha_handle_trap_shadows ();
-
- /* Due to the number of extra trapb insns, don't bother fixing up
- alignment when trap precision is instruction. Moreover, we can
- only do our job when sched2 is run. */
- if (optimize && !optimize_size
- && alpha_tp != ALPHA_TP_INSN
- && flag_schedule_insns_after_reload)
- {
- if (alpha_tune == PROCESSOR_EV4)
- alpha_align_insns (8, alphaev4_next_group, alphaev4_next_nop);
- else if (alpha_tune == PROCESSOR_EV5)
- alpha_align_insns (16, alphaev5_next_group, alphaev5_next_nop);
- }
}
\f
static void