This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] third basic-block restructure patch.


The last of the restructuring stuff before flattening basic-block.h.

5 new files, cfgbuild.h, cfgcleanup.h, cfgloopmanip.h, dominance.h, and ifcvt.h. MOstly prototypes, but a few enums, #defines and structs were more appropriately located.

basic-block.h only includes cfgbuild.h, cfgcleanup.h, and dominance.h. Most of the prototypes for cfgloopmanip.h were actually in cfgloop.h, so cfgloopmanip.h is included from there instead. "struct ce_if_block" was moved to the new ifcvt.h. Other than ifcvt.c, the frv target was the only one which actually used the struct, so we include it there directly.

predict.h was also brought up to snuff to match predict.c. maybe_hot_count_p() was newly exported from predict.c so that the definitions of cgraph_edge::maybe_hot_p() and cgraph_node::optimize_for_size_p() could be moved back to cgraph.[ch] where they belong.

Bootstraps on x86_64-unknown-linux-gnu, and testsuites are currently running. I'll also do a full set of port builds over night...

assuming no issues, OK?

Andrew
	* cfgbuild.h: New.  Add prototypes for cfgbuild.c.
	* cfgcleanup.h: New.  Add prototypes for cfgcleanup.c.
	* cfgloopmanip.h: New.  Add prototypes for cfgloopmanip.c.
	* dominance.h: New.  Add prototypes for dominance.c.
	* cfgloop.h: Move some prototypes/enum to cfgloopmanip.h and include it.
	* cfghooks.h: (struct profile_record) Relocate here.
	Relocate 2 prototypes from basic-block.h.
	* basic-block.h: Move prototypes and struct to new header files.
	Include cfgbuild.h, cfgcleanup.h, and dominance.h.
	* rtl.h: Move a few prototypes to new header files.
	* cfgcleanup.c (merge_memattrs): Make static.
	* genopinit.c (main): Add predict.h to list of includes.
	* predict.h: Update prototype list to match predict.c.
	* predict.c (maybe_hot_count_p): Export.
	(cgraph_edge::maybe_hot_p): Move to cgraph.c.
	(cgraph_node::optimize_for_size_p): Move to cgraph.h.
	* cgraph.h (cgraph_node::optimize_for_size_p): Relocate here.
	* cgraph.c (cgraph_edge::maybe_hot_p): Relocate here.
	* profile.h: Adjust prototypes.
	* ifcvt.h: New.  Relocate struct ce_if_block here.
	* ifcvt.c: Include ifcvt.h.

	* config/frv/frv.c: Include ifcvt.h.
	* config/frv/frv-protos.h: Add 'struct' to ce_if_block * parameters.


Index: cfgbuild.h
===================================================================
--- cfgbuild.h	(revision 0)
+++ cfgbuild.h	(working copy)
@@ -0,0 +1,28 @@
+/* Control flow graph building header file.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_CFGBUILD_H
+#define GCC_CFGBUILD_H
+
+extern bool inside_basic_block_p (const rtx_insn *);
+extern bool control_flow_insn_p (const rtx_insn *);
+extern void rtl_make_eh_edge (sbitmap, basic_block, rtx);
+extern void find_many_sub_basic_blocks (sbitmap);
+
+#endif /* GCC_CFGBUILD_H */
Index: cfgcleanup.h
===================================================================
--- cfgcleanup.h	(revision 0)
+++ cfgcleanup.h	(working copy)
@@ -0,0 +1,34 @@
+/* Control flow optimization header file.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+
+#ifndef GCC_CFGCLEANUP_H
+#define GCC_CFGCLEANUP_H
+
+enum replace_direction { dir_none, dir_forward, dir_backward, dir_both };
+
+extern int flow_find_cross_jump (basic_block, basic_block, rtx_insn **,
+				 rtx_insn **, enum replace_direction*);
+extern int flow_find_head_matching_sequence (basic_block, basic_block,
+					     rtx_insn **, rtx_insn **, int);
+extern bool delete_unreachable_blocks (void);
+extern void delete_dead_jumptables (void);
+extern bool cleanup_cfg (int);
+
+#endif /* GCC_CFGCLEANUP_H */
Index: cfgloopmanip.h
===================================================================
--- cfgloopmanip.h	(revision 0)
+++ cfgloopmanip.h	(working copy)
@@ -0,0 +1,63 @@
+/* Loop manipulation header.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_CFGLOOPMANIP_H
+#define GCC_CFGLOOPMANIP_H
+
+enum
+{
+  CP_SIMPLE_PREHEADERS = 1,
+  CP_FALLTHRU_PREHEADERS = 2
+};
+
+#define DLTHE_FLAG_UPDATE_FREQ	1	/* Update frequencies in
+					   duplicate_loop_to_header_edge.  */
+#define DLTHE_RECORD_COPY_NUMBER 2	/* Record copy number in the aux
+					   field of newly create BB.  */
+#define DLTHE_FLAG_COMPLETTE_PEEL 4	/* Update frequencies expecting
+					   a complete peeling.  */
+extern edge mfb_kj_edge;
+
+extern bool remove_path (edge);
+extern void place_new_loop (struct function *, struct loop *);
+extern void add_loop (struct loop *, struct loop *);
+extern void scale_loop_frequencies (struct loop *, int, int);
+extern void scale_loop_profile (struct loop *, int, gcov_type);
+extern edge create_empty_if_region_on_edge (edge, tree);
+extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
+					       tree *, tree *, struct loop *);
+extern struct loop *loopify (edge, edge,
+			     basic_block, edge, edge, bool,
+			     unsigned, unsigned);
+extern void unloop (struct loop *, bool *, bitmap);
+extern void copy_loop_info (struct loop *loop, struct loop *target);
+extern struct loop * duplicate_loop (struct loop *, struct loop *);
+extern void duplicate_subloops (struct loop *, struct loop *);
+extern bool can_duplicate_loop_p (const struct loop *loop);
+extern bool duplicate_loop_to_header_edge (struct loop *, edge,
+					   unsigned, sbitmap, edge,
+ 					   vec<edge> *, int);
+extern bool mfb_keep_just (edge);
+basic_block create_preheader (struct loop *, int);
+extern void create_preheaders (int);
+extern void force_single_succ_latches (void);
+struct loop * loop_version (struct loop *, void *,
+			    basic_block *, unsigned, unsigned, unsigned, bool);
+
+#endif /* GCC_CFGLOOPMANIP_H */
Index: dominance.h
===================================================================
--- dominance.h	(revision 0)
+++ dominance.h	(working copy)
@@ -0,0 +1,78 @@
+/* Calculate (post)dominators header file.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_DOMINANCE_H
+#define GCC_DOMINANCE_H
+
+enum cdi_direction
+{
+  CDI_DOMINATORS = 1,
+  CDI_POST_DOMINATORS = 2
+};
+
+/* State of dominance information.  */
+
+enum dom_state
+{
+  DOM_NONE,		/* Not computed at all.  */
+  DOM_NO_FAST_QUERY,	/* The data is OK, but the fast query data are not usable.  */
+  DOM_OK		/* Everything is ok.  */
+};
+
+extern void calculate_dominance_info (enum cdi_direction);
+extern void free_dominance_info (function *, enum cdi_direction);
+extern void free_dominance_info (enum cdi_direction);
+extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
+extern void set_immediate_dominator (enum cdi_direction, basic_block,
+				     basic_block);
+extern vec<basic_block> get_dominated_by (enum cdi_direction, basic_block);
+extern vec<basic_block> get_dominated_by_region (enum cdi_direction,
+							 basic_block *,
+							 unsigned);
+extern vec<basic_block> get_dominated_to_depth (enum cdi_direction,
+							basic_block, int);
+extern vec<basic_block> get_all_dominated_blocks (enum cdi_direction,
+							  basic_block);
+extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
+					   basic_block);
+extern basic_block nearest_common_dominator (enum cdi_direction,
+					     basic_block, basic_block);
+extern basic_block nearest_common_dominator_for_set (enum cdi_direction,
+						     bitmap);
+extern bool dominated_by_p (enum cdi_direction, const_basic_block,
+			    const_basic_block);
+unsigned bb_dom_dfs_in (enum cdi_direction, basic_block);
+unsigned bb_dom_dfs_out (enum cdi_direction, basic_block);
+extern void verify_dominators (enum cdi_direction);
+basic_block recompute_dominator (enum cdi_direction, basic_block);
+extern void iterate_fix_dominators (enum cdi_direction,
+				    vec<basic_block> , bool);
+extern void add_to_dominance_info (enum cdi_direction, basic_block);
+extern void delete_from_dominance_info (enum cdi_direction, basic_block);
+extern basic_block first_dom_son (enum cdi_direction, basic_block);
+extern basic_block next_dom_son (enum cdi_direction, basic_block);
+extern enum dom_state dom_info_state (function *, enum cdi_direction);
+extern enum dom_state dom_info_state (enum cdi_direction);
+extern void set_dom_info_availability (enum cdi_direction, enum dom_state);
+extern bool dom_info_available_p (function *, enum cdi_direction);
+extern bool dom_info_available_p (enum cdi_direction);
+
+
+
+#endif /* GCC_DOMINANCE_H */
Index: cfgloop.h
===================================================================
--- cfgloop.h	(revision 216518)
+++ cfgloop.h	(working copy)
@@ -32,6 +32,7 @@
 #include "hard-reg-set.h"
 #include "input.h"
 #include "function.h"
+#include "cfgloopmanip.h"
 
 /* Structure to hold decision about unrolling/peeling.  */
 enum lpt_dec
@@ -271,8 +272,6 @@
 /* Loop data structure manipulation/querying.  */
 extern void flow_loop_tree_node_add (struct loop *, struct loop *);
 extern void flow_loop_tree_node_remove (struct loop *);
-extern void place_new_loop (struct function *, struct loop *);
-extern void add_loop (struct loop *, struct loop *);
 extern bool flow_loop_nested_p	(const struct loop *, const struct loop *);
 extern bool flow_bb_inside_loop_p (const struct loop *, const_basic_block);
 extern struct loop * find_common_loop (struct loop *, struct loop *);
@@ -310,16 +309,7 @@
 extern void cancel_loop_tree (struct loop *);
 extern void delete_loop (struct loop *);
 
-enum
-{
-  CP_SIMPLE_PREHEADERS = 1,
-  CP_FALLTHRU_PREHEADERS = 2
-};
 
-basic_block create_preheader (struct loop *, int);
-extern void create_preheaders (int);
-extern void force_single_succ_latches (void);
-
 extern void verify_loop_structure (void);
 
 /* Loop analysis.  */
@@ -328,37 +318,8 @@
 extern unsigned expected_loop_iterations (const struct loop *);
 extern rtx doloop_condition_get (rtx);
 
-
-/* Loop manipulation.  */
-extern bool can_duplicate_loop_p (const struct loop *loop);
-
-#define DLTHE_FLAG_UPDATE_FREQ	1	/* Update frequencies in
-					   duplicate_loop_to_header_edge.  */
-#define DLTHE_RECORD_COPY_NUMBER 2	/* Record copy number in the aux
-					   field of newly create BB.  */
-#define DLTHE_FLAG_COMPLETTE_PEEL 4	/* Update frequencies expecting
-					   a complete peeling.  */
-
-extern edge create_empty_if_region_on_edge (edge, tree);
-extern struct loop *create_empty_loop_on_edge (edge, tree, tree, tree, tree,
-					       tree *, tree *, struct loop *);
-extern struct loop * duplicate_loop (struct loop *, struct loop *);
-extern void copy_loop_info (struct loop *loop, struct loop *target);
-extern void duplicate_subloops (struct loop *, struct loop *);
-extern bool duplicate_loop_to_header_edge (struct loop *, edge,
-					   unsigned, sbitmap, edge,
- 					   vec<edge> *, int);
-extern struct loop *loopify (edge, edge,
-			     basic_block, edge, edge, bool,
-			     unsigned, unsigned);
-struct loop * loop_version (struct loop *, void *,
-			    basic_block *, unsigned, unsigned, unsigned, bool);
-extern bool remove_path (edge);
-extern void unloop (struct loop *, bool *, bitmap);
-extern void scale_loop_frequencies (struct loop *, int, int);
 void mark_loop_for_removal (loop_p);
 
-
 /* Induction variable analysis.  */
 
 /* The description of induction variable.  The things are a bit complicated
@@ -742,7 +703,6 @@
 
 extern void doloop_optimize_loops (void);
 extern void move_loop_invariants (void);
-extern void scale_loop_profile (struct loop *loop, int scale, gcov_type iteration_bound);
 extern vec<basic_block> get_loop_hot_path (const struct loop *loop);
 
 /* Returns the outermost loop of the loop nest that contains LOOP.*/
Index: cfghooks.h
===================================================================
--- cfghooks.h	(revision 216517)
+++ cfghooks.h	(working copy)
@@ -23,6 +23,38 @@
 
 /* Only basic-block.h includes this.  */
 
+/* Structure to gather statistic about profile consistency, per pass.
+   An array of this structure, indexed by pass static number, is allocated
+   in passes.c.  The structure is defined here so that different CFG modes
+   can do their book-keeping via CFG hooks.
+
+   For every field[2], field[0] is the count before the pass runs, and
+   field[1] is the post-pass count.  This allows us to monitor the effect
+   of each individual pass on the profile consistency.
+   
+   This structure is not supposed to be used by anything other than passes.c
+   and one CFG hook per CFG mode.  */
+struct profile_record
+{
+  /* The number of basic blocks where sum(freq) of the block's predecessors
+     doesn't match reasonably well with the incoming frequency.  */
+  int num_mismatched_freq_in[2];
+  /* Likewise for a basic block's successors.  */
+  int num_mismatched_freq_out[2];
+  /* The number of basic blocks where sum(count) of the block's predecessors
+     doesn't match reasonably well with the incoming frequency.  */
+  int num_mismatched_count_in[2];
+  /* Likewise for a basic block's successors.  */
+  int num_mismatched_count_out[2];
+  /* A weighted cost of the run-time of the function body.  */
+  gcov_type time[2];
+  /* A weighted cost of the size of the function body.  */
+  int size[2];
+  /* True iff this pass actually was run.  */
+  bool run;
+};
+
+
 struct cfg_hooks
 {
   /* Name of the corresponding ir.  */
@@ -156,9 +188,11 @@
 extern void verify_flow_info (void);
 extern void dump_bb (FILE *, basic_block, int, int);
 extern void dump_bb_for_graph (pretty_printer *, basic_block);
+extern void dump_flow_info (FILE *, int);
 
 extern edge redirect_edge_and_branch (edge, basic_block);
 extern basic_block redirect_edge_and_branch_force (edge, basic_block);
+extern edge redirect_edge_succ_nodup (edge, basic_block);
 extern bool can_remove_branch_p (const_edge);
 extern void remove_branch (edge);
 extern void remove_edge (edge);
Index: basic-block.h
===================================================================
--- basic-block.h	(revision 216518)
+++ basic-block.h	(working copy)
@@ -33,6 +33,9 @@
 #include "cfg.h"
 #include "cfganal.h"
 #include "lcm.h"
+#include "cfgbuild.h"
+#include "cfgcleanup.h"
+#include "dominance.h"
 
 /* Use gcov_type to hold basic block counters.  Should be at least
    64bit.  Although a counter cannot be negative, we use a signed
@@ -85,38 +88,6 @@
 #define EDGE_COMPLEX \
   (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL | EDGE_EH | EDGE_PRESERVE)
 
-/* Structure to gather statistic about profile consistency, per pass.
-   An array of this structure, indexed by pass static number, is allocated
-   in passes.c.  The structure is defined here so that different CFG modes
-   can do their book-keeping via CFG hooks.
-
-   For every field[2], field[0] is the count before the pass runs, and
-   field[1] is the post-pass count.  This allows us to monitor the effect
-   of each individual pass on the profile consistency.
-   
-   This structure is not supposed to be used by anything other than passes.c
-   and one CFG hook per CFG mode.  */
-struct profile_record
-{
-  /* The number of basic blocks where sum(freq) of the block's predecessors
-     doesn't match reasonably well with the incoming frequency.  */
-  int num_mismatched_freq_in[2];
-  /* Likewise for a basic block's successors.  */
-  int num_mismatched_freq_out[2];
-  /* The number of basic blocks where sum(count) of the block's predecessors
-     doesn't match reasonably well with the incoming frequency.  */
-  int num_mismatched_count_in[2];
-  /* Likewise for a basic block's successors.  */
-  int num_mismatched_count_out[2];
-  /* A weighted cost of the run-time of the function body.  */
-  gcov_type time[2];
-  /* A weighted cost of the size of the function body.  */
-  int size[2];
-  /* True iff this pass actually was run.  */
-  bool run;
-};
-
-
 struct GTY(()) rtl_bb_info {
   /* The first insn of the block is embedded into bb->il.x.  */
   /* The last insn of the block.  */
@@ -249,15 +220,6 @@
 #define BB_COPY_PARTITION(dstbb, srcbb) \
   BB_SET_PARTITION (dstbb, BB_PARTITION (srcbb))
 
-/* State of dominance information.  */
-
-enum dom_state
-{
-  DOM_NONE,		/* Not computed at all.  */
-  DOM_NO_FAST_QUERY,	/* The data is OK, but the fast query data are not usable.  */
-  DOM_OK		/* Everything is ok.  */
-};
-
 /* What sort of profiling information we have.  */
 enum profile_status_d
 {
@@ -383,31 +345,6 @@
 /* The two blocks that are always in the cfg.  */
 #define NUM_FIXED_BLOCKS (2)
 
-
-extern edge redirect_edge_succ_nodup (edge, basic_block);
-
-/* Structure to group all of the information to process IF-THEN and
-   IF-THEN-ELSE blocks for the conditional execution support.  This
-   needs to be in a public file in case the IFCVT macros call
-   functions passing the ce_if_block data structure.  */
-
-struct ce_if_block
-{
-  basic_block test_bb;			/* First test block.  */
-  basic_block then_bb;			/* THEN block.  */
-  basic_block else_bb;			/* ELSE block or NULL.  */
-  basic_block join_bb;			/* Join THEN/ELSE blocks.  */
-  basic_block last_test_bb;		/* Last bb to hold && or || tests.  */
-  int num_multiple_test_blocks;		/* # of && and || basic blocks.  */
-  int num_and_and_blocks;		/* # of && blocks.  */
-  int num_or_or_blocks;			/* # of || blocks.  */
-  int num_multiple_test_insns;		/* # of insns in && and || blocks.  */
-  int and_and_p;			/* Complex test is &&.  */
-  int num_then_insns;			/* # of insns in THEN block.  */
-  int num_else_insns;			/* # of insns in ELSE block.  */
-  int pass;				/* Pass number.  */
-};
-
 /* The base value for branch probability notes and edge probabilities.  */
 #define REG_BR_PROB_BASE  10000
 
@@ -649,96 +586,6 @@
 #define CLEANUP_CFGLAYOUT	32	/* Do cleanup in cfglayout mode.  */
 #define CLEANUP_CFG_CHANGED	64      /* The caller changed the CFG.  */
 
-extern void dump_flow_info (FILE *, int);
-
-/* In predict.c */
-extern bool maybe_hot_bb_p (struct function *, const_basic_block);
-extern bool maybe_hot_edge_p (edge);
-extern bool probably_never_executed_bb_p (struct function *, const_basic_block);
-extern bool probably_never_executed_edge_p (struct function *, edge);
-extern bool optimize_bb_for_size_p (const_basic_block);
-extern bool optimize_bb_for_speed_p (const_basic_block);
-extern bool optimize_edge_for_size_p (edge);
-extern bool optimize_edge_for_speed_p (edge);
-extern bool optimize_loop_for_size_p (struct loop *);
-extern bool optimize_loop_for_speed_p (struct loop *);
-extern bool optimize_loop_nest_for_size_p (struct loop *);
-extern bool optimize_loop_nest_for_speed_p (struct loop *);
-extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor);
-extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor);
-extern void gimple_predict_edge (edge, enum br_predictor, int);
-extern void rtl_predict_edge (edge, enum br_predictor, int);
-extern void predict_edge_def (edge, enum br_predictor, enum prediction);
-extern void guess_outgoing_edge_probabilities (basic_block);
-extern void remove_predictions_associated_with_edge (edge);
-extern bool edge_probability_reliable_p (const_edge);
-extern bool br_prob_note_reliable_p (const_rtx);
-extern bool predictable_edge_p (edge);
-
-/* In cfgbuild.c.  */
-extern void find_many_sub_basic_blocks (sbitmap);
-extern void rtl_make_eh_edge (sbitmap, basic_block, rtx);
-
-enum replace_direction { dir_none, dir_forward, dir_backward, dir_both };
-
-/* In cfgcleanup.c.  */
-extern bool cleanup_cfg (int);
-extern int flow_find_cross_jump (basic_block, basic_block, rtx_insn **,
-				 rtx_insn **, enum replace_direction*);
-extern int flow_find_head_matching_sequence (basic_block, basic_block,
-					     rtx_insn **, rtx_insn **, int);
-
-extern bool delete_unreachable_blocks (void);
-
-extern bool inside_basic_block_p (const rtx_insn *);
-extern bool control_flow_insn_p (const rtx_insn *);
-extern rtx_insn *get_last_bb_insn (basic_block);
-
-/* In dominance.c */
-
-enum cdi_direction
-{
-  CDI_DOMINATORS = 1,
-  CDI_POST_DOMINATORS = 2
-};
-
-extern enum dom_state dom_info_state (function *, enum cdi_direction);
-extern enum dom_state dom_info_state (enum cdi_direction);
-extern void set_dom_info_availability (enum cdi_direction, enum dom_state);
-extern bool dom_info_available_p (function *, enum cdi_direction);
-extern bool dom_info_available_p (enum cdi_direction);
-extern void calculate_dominance_info (enum cdi_direction);
-extern void free_dominance_info (function *, enum cdi_direction);
-extern void free_dominance_info (enum cdi_direction);
-extern basic_block nearest_common_dominator (enum cdi_direction,
-					     basic_block, basic_block);
-extern basic_block nearest_common_dominator_for_set (enum cdi_direction,
-						     bitmap);
-extern void set_immediate_dominator (enum cdi_direction, basic_block,
-				     basic_block);
-extern basic_block get_immediate_dominator (enum cdi_direction, basic_block);
-extern bool dominated_by_p (enum cdi_direction, const_basic_block, const_basic_block);
-extern vec<basic_block> get_dominated_by (enum cdi_direction, basic_block);
-extern vec<basic_block> get_dominated_by_region (enum cdi_direction,
-							 basic_block *,
-							 unsigned);
-extern vec<basic_block> get_dominated_to_depth (enum cdi_direction,
-							basic_block, int);
-extern vec<basic_block> get_all_dominated_blocks (enum cdi_direction,
-							  basic_block);
-extern void add_to_dominance_info (enum cdi_direction, basic_block);
-extern void delete_from_dominance_info (enum cdi_direction, basic_block);
-basic_block recompute_dominator (enum cdi_direction, basic_block);
-extern void redirect_immediate_dominators (enum cdi_direction, basic_block,
-					   basic_block);
-extern void iterate_fix_dominators (enum cdi_direction,
-				    vec<basic_block> , bool);
-extern void verify_dominators (enum cdi_direction);
-extern basic_block first_dom_son (enum cdi_direction, basic_block);
-extern basic_block next_dom_son (enum cdi_direction, basic_block);
-unsigned bb_dom_dfs_in (enum cdi_direction, basic_block);
-unsigned bb_dom_dfs_out (enum cdi_direction, basic_block);
-
 #include "cfghooks.h"
 
 /* Return true if BB is in a transaction.  */
@@ -793,19 +640,6 @@
   return e;
 }
 
-/* In cfgloopmanip.c.  */
-extern edge mfb_kj_edge;
-extern bool mfb_keep_just (edge);
-
-/* In cfgexpand.c.  */
-extern void rtl_profile_for_bb (basic_block);
-extern void rtl_profile_for_edge (edge);
-extern void default_rtl_profile (void);
-
-/* In profile.c.  */
-typedef struct gcov_working_set_info gcov_working_set_t;
-extern gcov_working_set_t *find_working_set (unsigned pct_times_10);
-
 /* Check tha probability is sane.  */
 
 static inline void
Index: rtl.h
===================================================================
--- rtl.h	(revision 216517)
+++ rtl.h	(working copy)
@@ -3388,9 +3388,6 @@
 extern void dump_combine_total_stats (FILE *);
 extern rtx make_compound_operation (rtx, enum rtx_code);
 
-/* In cfgcleanup.c  */
-extern void delete_dead_jumptables (void);
-
 /* In sched-rgn.c.  */
 extern void schedule_insns (void);
 
@@ -3531,10 +3528,6 @@
 /* In toplev.c */
 extern GTY(()) rtx stack_limit_rtx;
 
-/* In predict.c */
-extern void invert_br_probabilities (rtx);
-extern bool expensive_function_p (int);
-
 /* In var-tracking.c */
 extern unsigned int variable_tracking_main (void);
 
@@ -3577,8 +3570,6 @@
 extern void insn_locations_finalize (void);
 extern void set_curr_insn_location (location_t);
 extern location_t curr_insn_location (void);
-extern bool optimize_insn_for_size_p (void);
-extern bool optimize_insn_for_speed_p (void);
 
 /* rtl-error.c */
 extern void _fatal_insn_not_found (const_rtx, const char *, int, const char *)
Index: cfgcleanup.c
===================================================================
--- cfgcleanup.c	(revision 216517)
+++ cfgcleanup.c	(working copy)
@@ -872,7 +872,7 @@
 /* Removes the memory attributes of MEM expression
    if they are not equal.  */
 
-void
+static void
 merge_memattrs (rtx x, rtx y)
 {
   int i;
Index: genopinit.c
===================================================================
--- genopinit.c	(revision 216517)
+++ genopinit.c	(working copy)
@@ -408,6 +408,7 @@
 	   "#include \"stor-layout.h\"\n"
 	   "#include \"calls.h\"\n"
 	   "#include \"rtl.h\"\n"
+	   "#include \"predict.h\"\n"
 	   "#include \"tm_p.h\"\n"
 	   "#include \"flags.h\"\n"
 	   "#include \"insn-config.h\"\n"
Index: predict.h
===================================================================
--- predict.h	(revision 216517)
+++ predict.h	(working copy)
@@ -45,17 +45,48 @@
    TAKEN
 };
 
+extern gcov_type get_hot_bb_threshold (void);
+extern void set_hot_bb_threshold (gcov_type);
+extern bool maybe_hot_count_p (struct function *, gcov_type);
+extern bool maybe_hot_bb_p (struct function *, const_basic_block);
+extern bool maybe_hot_edge_p (edge);
+extern bool probably_never_executed_bb_p (struct function *, const_basic_block);
+extern bool probably_never_executed_edge_p (struct function *, edge);
+extern bool optimize_function_for_size_p (struct function *);
+extern bool optimize_function_for_speed_p (struct function *);
+extern bool optimize_bb_for_size_p (const_basic_block);
+extern bool optimize_bb_for_speed_p (const_basic_block);
+extern bool optimize_edge_for_size_p (edge);
+extern bool optimize_edge_for_speed_p (edge);
+extern bool optimize_insn_for_size_p (void);
+extern bool optimize_insn_for_speed_p (void);
+extern bool optimize_loop_for_size_p (struct loop *);
+extern bool optimize_loop_for_speed_p (struct loop *);
+extern bool optimize_loop_nest_for_speed_p (struct loop *);
+extern bool optimize_loop_nest_for_size_p (struct loop *);
+extern bool predictable_edge_p (edge);
+extern void rtl_profile_for_bb (basic_block);
+extern void rtl_profile_for_edge (edge);
+extern void default_rtl_profile (void);
+extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor);
+extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor);
+extern bool edge_probability_reliable_p (const_edge);
+extern bool br_prob_note_reliable_p (const_rtx);
 extern void predict_insn_def (rtx_insn *, enum br_predictor, enum prediction);
+extern void rtl_predict_edge (edge, enum br_predictor, int);
+extern void gimple_predict_edge (edge, enum br_predictor, int);
+extern void remove_predictions_associated_with_edge (edge);
+extern void predict_edge_def (edge, enum br_predictor, enum prediction);
+extern void invert_br_probabilities (rtx);
+extern void guess_outgoing_edge_probabilities (basic_block);
+extern void tree_estimate_probability (void);
+extern void handle_missing_profiles (void);
 extern int counts_to_freqs (void);
-extern void handle_missing_profiles (void);
+extern bool expensive_function_p (int);
 extern void estimate_bb_frequencies (bool);
+extern void compute_function_frequency (void);
+extern tree build_predict_expr (enum br_predictor, enum prediction);
 extern const char *predictor_name (enum br_predictor);
-extern tree build_predict_expr (enum br_predictor, enum prediction);
-extern void tree_estimate_probability (void);
-extern void compute_function_frequency (void);
 extern void rebuild_frequencies (void);
 
-extern bool optimize_function_for_size_p (struct function *);
-extern bool optimize_function_for_speed_p (struct function *);
-
 #endif  /* GCC_PREDICT_H */
Index: predict.c
===================================================================
--- predict.c	(revision 216517)
+++ predict.c	(working copy)
@@ -167,7 +167,7 @@
 
 /* Return TRUE if frequency FREQ is considered to be hot.  */
 
-static inline bool
+bool
 maybe_hot_count_p (struct function *fun, gcov_type count)
 {
   if (fun && profile_status_for_fn (fun) != PROFILE_READ)
@@ -190,39 +190,6 @@
   return maybe_hot_frequency_p (fun, bb->frequency);
 }
 
-/* Return true if the call can be hot.  */
-
-bool
-cgraph_edge::maybe_hot_p (void)
-{
-  if (profile_info && flag_branch_probabilities
-      && !maybe_hot_count_p (NULL, count))
-    return false;
-  if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
-      || (callee
-	  && callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))
-    return false;
-  if (caller->frequency > NODE_FREQUENCY_UNLIKELY_EXECUTED
-      && (callee
-	  && callee->frequency <= NODE_FREQUENCY_EXECUTED_ONCE))
-    return false;
-  if (optimize_size)
-    return false;
-  if (caller->frequency == NODE_FREQUENCY_HOT)
-    return true;
-  if (caller->frequency == NODE_FREQUENCY_EXECUTED_ONCE
-      && frequency < CGRAPH_FREQ_BASE * 3 / 2)
-    return false;
-  if (flag_guess_branch_prob)
-    {
-      if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) == 0
-	  || frequency <= (CGRAPH_FREQ_BASE
-				 / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)))
-        return false;
-    }
-  return true;
-}
-
 /* Return true in case BB can be CPU intensive and should be optimized
    for maximal performance.  */
 
@@ -234,8 +201,6 @@
   return maybe_hot_frequency_p (cfun, EDGE_FREQUENCY (e));
 }
 
-
-
 /* Return true if profile COUNT and FREQUENCY, or function FUN static
    node frequency reflects never being executed.  */
    
@@ -304,19 +269,6 @@
   return probably_never_executed (fun, e->count, EDGE_FREQUENCY (e));
 }
 
-/* Return true if function should be optimized for size.  */
-
-bool
-cgraph_node::optimize_for_size_p (void)
-{
-  if (optimize_size)
-    return true;
-  if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
-    return true;
-  else
-    return false;
-}
-
 /* Return true when current function should always be optimized for size.  */
 
 bool
Index: cgraph.h
===================================================================
--- cgraph.h	(revision 216517)
+++ cgraph.h	(working copy)
@@ -2705,6 +2705,19 @@
   gcc_checking_assert (!global.inlined_to);
 }
 
+/* Return true if function should be optimized for size.  */
+
+inline bool
+cgraph_node::optimize_for_size_p (void)
+{
+  if (optimize_size)
+    return true;
+  if (frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)
+    return true;
+  else
+    return false;
+}
+
 inline symtab_node * symtab_node::get_create (tree node)
 {
   if (TREE_CODE (node) == VAR_DECL)
Index: cgraph.c
===================================================================
--- cgraph.c	(revision 216517)
+++ cgraph.c	(working copy)
@@ -64,6 +64,8 @@
 #include "gimple-pretty-print.h"
 #include "expr.h"
 #include "tree-dfa.h"
+#include "profile.h"
+#include "params.h"
 
 /* FIXME: Only for PROP_loops, but cgraph shouldn't have to know about this.  */
 #include "tree-pass.h"
@@ -2310,6 +2312,38 @@
     return callee->cannot_return_p ();
 }
 
+/* Return true if the call can be hot.  */
+
+bool
+cgraph_edge::maybe_hot_p (void)
+{
+  if (profile_info && flag_branch_probabilities
+      && !maybe_hot_count_p (NULL, count))
+    return false;
+  if (caller->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
+      || (callee
+	  && callee->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))
+    return false;
+  if (caller->frequency > NODE_FREQUENCY_UNLIKELY_EXECUTED
+      && (callee
+	  && callee->frequency <= NODE_FREQUENCY_EXECUTED_ONCE))
+    return false;
+  if (optimize_size) return false;
+  if (caller->frequency == NODE_FREQUENCY_HOT)
+    return true;
+  if (caller->frequency == NODE_FREQUENCY_EXECUTED_ONCE
+      && frequency < CGRAPH_FREQ_BASE * 3 / 2)
+    return false;
+  if (flag_guess_branch_prob)
+    {
+      if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION) == 0
+	  || frequency <= (CGRAPH_FREQ_BASE
+				 / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)))
+        return false;
+    }
+  return true;
+}
+
 /* Return true when function can be removed from callgraph
    if all direct calls are eliminated.  */
 
Index: profile.h
===================================================================
--- profile.h	(revision 216517)
+++ profile.h	(working copy)
@@ -37,6 +37,9 @@
 
 #define EDGE_INFO(e)  ((struct edge_profile_info *) (e)->aux)
 
+typedef struct gcov_working_set_info gcov_working_set_t;
+extern gcov_working_set_t *find_working_set (unsigned pct_times_10);
+
 /* Smoothes the initial assigned basic block and edge counts using
    a minimum cost flow algorithm. */
 extern void mcf_smooth_cfg (void);
@@ -52,8 +55,4 @@
    profile.c.  */
 extern const struct gcov_ctr_summary *profile_info;
 
-/* In predict.c.  */
-extern gcov_type get_hot_bb_threshold (void);
-extern void set_hot_bb_threshold (gcov_type);
-
 #endif /* PROFILE_H */
Index: ifcvt.h
===================================================================
--- ifcvt.h	(revision 0)
+++ ifcvt.h	(working copy)
@@ -0,0 +1,43 @@
+/* If-conversion header file.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_IFCVT_H
+#define GCC_IFCVT_H
+
+/* Structure to group all of the information to process IF-THEN and
+   IF-THEN-ELSE blocks for the conditional execution support.  */
+
+struct ce_if_block
+{
+  basic_block test_bb;			/* First test block.  */
+  basic_block then_bb;			/* THEN block.  */
+  basic_block else_bb;			/* ELSE block or NULL.  */
+  basic_block join_bb;			/* Join THEN/ELSE blocks.  */
+  basic_block last_test_bb;		/* Last bb to hold && or || tests.  */
+  int num_multiple_test_blocks;		/* # of && and || basic blocks.  */
+  int num_and_and_blocks;		/* # of && blocks.  */
+  int num_or_or_blocks;			/* # of || blocks.  */
+  int num_multiple_test_insns;		/* # of insns in && and || blocks.  */
+  int and_and_p;			/* Complex test is &&.  */
+  int num_then_insns;			/* # of insns in THEN block.  */
+  int num_else_insns;			/* # of insns in ELSE block.  */
+  int pass;				/* Pass number.  */
+};
+
+#endif /* GCC_IFCVT_H */
Index: ifcvt.c
===================================================================
--- ifcvt.c	(revision 216517)
+++ ifcvt.c	(working copy)
@@ -47,6 +47,7 @@
 #include "df.h"
 #include "dbgcnt.h"
 #include "shrink-wrap.h"
+#include "ifcvt.h"
 
 #ifndef HAVE_conditional_move
 #define HAVE_conditional_move 0
Index: config/frv/frv.c
===================================================================
--- config/frv/frv.c	(revision 216517)
+++ config/frv/frv.c	(working copy)
@@ -57,6 +57,7 @@
 #include "df.h"
 #include "dumpfile.h"
 #include "builtins.h"
+#include "ifcvt.h"
 
 #ifndef FRV_INLINE
 #define FRV_INLINE inline
Index: config/frv/frv-protos.h
===================================================================
--- config/frv/frv-protos.h	(revision 216517)
+++ config/frv/frv-protos.h	(working copy)
@@ -62,14 +62,14 @@
 extern void frv_split_double_load	(rtx, rtx);
 extern void frv_split_double_store	(rtx, rtx);
 #ifdef BB_HEAD
-extern void frv_ifcvt_init_extra_fields	(ce_if_block *);
-extern void frv_ifcvt_modify_tests	(ce_if_block *, rtx *, rtx *);
+extern void frv_ifcvt_init_extra_fields	(struct ce_if_block *);
+extern void frv_ifcvt_modify_tests	(struct ce_if_block *, rtx *, rtx *);
 extern void frv_ifcvt_modify_multiple_tests
-					(ce_if_block *, basic_block,
+					(struct ce_if_block *, basic_block,
 					 rtx *, rtx *);
-extern rtx frv_ifcvt_modify_insn	(ce_if_block *, rtx, rtx);
-extern void frv_ifcvt_modify_final	(ce_if_block *);
-extern void frv_ifcvt_modify_cancel	(ce_if_block *);
+extern rtx frv_ifcvt_modify_insn	(struct ce_if_block *, rtx, rtx);
+extern void frv_ifcvt_modify_final	(struct ce_if_block *);
+extern void frv_ifcvt_modify_cancel	(struct ce_if_block *);
 #endif
 extern enum reg_class frv_secondary_reload_class
 					(enum reg_class,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]