PR target/56858
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Jul 2014 07:42:50 +0000 (07:42 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 11 Jul 2014 07:42:50 +0000 (07:42 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212449 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/alpha/alpha.c

index 771a887..f9d02b5 100644 (file)
@@ -1,7 +1,31 @@
+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.
@@ -55,9 +79,9 @@
 
 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>
 
index 50b7320..d5a2b14 100644 (file)
@@ -62,6 +62,9 @@ along with GCC; see the file COPYING3.  If not see
 #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"
@@ -209,6 +212,8 @@ static struct alpha_rtx_cost_data const alpha_rtx_cost_size =
 /* 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 *);
@@ -217,6 +222,113 @@ static bool vms_valid_pointer_mode (enum machine_mode);
 #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.  */
 
@@ -273,6 +385,18 @@ alpha_option_override (void)
       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;
@@ -506,6 +630,10 @@ alpha_option_override (void)
   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.  */
@@ -9178,9 +9306,9 @@ alphaev5_next_nop (int *pin_use)
 /* 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;
@@ -9305,6 +9433,17 @@ alpha_align_insns (unsigned int max_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
@@ -9324,12 +9463,6 @@ alpha_pad_function_end (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;
 
@@ -9397,22 +9530,6 @@ And in the noreturn case:
 
   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