00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_CFGLOOP_H
00023 #define GCC_CFGLOOP_H
00024
00025 #include "basic-block.h"
00026
00027 #include "rtl.h"
00028
00029
00030 enum lpt_dec
00031 {
00032 LPT_NONE,
00033 LPT_PEEL_COMPLETELY,
00034 LPT_PEEL_SIMPLE,
00035 LPT_UNROLL_CONSTANT,
00036 LPT_UNROLL_RUNTIME,
00037 LPT_UNROLL_STUPID
00038 };
00039
00040 struct lpt_decision
00041 {
00042 enum lpt_dec decision;
00043 unsigned times;
00044 };
00045
00046
00047
00048 struct nb_iter_bound
00049 {
00050 tree bound;
00051
00052 tree at_stmt;
00053
00054 struct nb_iter_bound *next;
00055
00056 };
00057
00058
00059 struct loop
00060 {
00061
00062 int num;
00063
00064
00065 basic_block header;
00066
00067
00068 basic_block latch;
00069
00070
00071 struct lpt_decision lpt_decision;
00072
00073
00074 unsigned ninsns;
00075
00076
00077 unsigned av_ninsns;
00078
00079
00080 unsigned num_nodes;
00081
00082
00083 int depth;
00084
00085
00086 struct loop **pred;
00087
00088
00089
00090 int level;
00091
00092
00093 struct loop *outer;
00094
00095
00096 struct loop *inner;
00097
00098
00099 struct loop *next;
00100
00101
00102 struct loop *copy;
00103
00104
00105 void *aux;
00106
00107
00108
00109
00110
00111
00112 tree nb_iterations;
00113
00114
00115
00116 tree estimated_nb_iterations;
00117
00118
00119 struct nb_iter_bound *bounds;
00120
00121
00122
00123 edge single_exit;
00124
00125
00126
00127
00128
00129 bool parallel_p;
00130 };
00131
00132
00133 enum
00134 {
00135 LOOPS_HAVE_PREHEADERS = 1,
00136 LOOPS_HAVE_SIMPLE_LATCHES = 2,
00137 LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
00138 LOOPS_HAVE_MARKED_SINGLE_EXITS = 8
00139 };
00140
00141 #define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
00142 | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
00143
00144
00145 struct loops
00146 {
00147
00148 unsigned num;
00149
00150
00151 int state;
00152
00153
00154
00155
00156
00157 struct loop **parray;
00158
00159
00160 struct loop *tree_root;
00161
00162
00163 struct cfg
00164 {
00165
00166 int *dfs_order;
00167
00168
00169
00170 int *rc_order;
00171 } cfg;
00172
00173
00174 sbitmap shared_headers;
00175 };
00176
00177
00178
00179 extern struct loops *current_loops;
00180
00181
00182 extern int flow_loops_find (struct loops *);
00183 extern void flow_loops_free (struct loops *);
00184 extern void flow_loops_dump (const struct loops *, FILE *,
00185 void (*)(const struct loop *, FILE *, int), int);
00186 extern void flow_loop_dump (const struct loop *, FILE *,
00187 void (*)(const struct loop *, FILE *, int), int);
00188 extern void flow_loop_free (struct loop *);
00189 int flow_loop_nodes_find (basic_block, struct loop *);
00190 void fix_loop_structure (struct loops *, bitmap changed_bbs);
00191 void mark_irreducible_loops (struct loops *);
00192 void mark_single_exit_loops (struct loops *);
00193
00194
00195 extern void flow_loop_tree_node_add (struct loop *, struct loop *);
00196 extern void flow_loop_tree_node_remove (struct loop *);
00197 extern bool flow_loop_nested_p (const struct loop *, const struct loop *);
00198 extern bool flow_bb_inside_loop_p (const struct loop *, const basic_block);
00199 extern struct loop * find_common_loop (struct loop *, struct loop *);
00200 struct loop *superloop_at_depth (struct loop *, unsigned);
00201 extern unsigned tree_num_loop_insns (struct loop *);
00202 extern int num_loop_insns (struct loop *);
00203 extern int average_num_loop_insns (struct loop *);
00204 extern unsigned get_loop_level (const struct loop *);
00205 extern bool loop_exit_edge_p (const struct loop *, edge);
00206 extern void mark_loop_exit_edges (struct loops *);
00207
00208
00209 extern basic_block *get_loop_body (const struct loop *);
00210 extern basic_block *get_loop_body_in_dom_order (const struct loop *);
00211 extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
00212 extern edge *get_loop_exit_edges (const struct loop *, unsigned *);
00213 extern unsigned num_loop_branches (const struct loop *);
00214
00215 extern edge loop_preheader_edge (const struct loop *);
00216 extern edge loop_latch_edge (const struct loop *);
00217
00218 extern void add_bb_to_loop (basic_block, struct loop *);
00219 extern void remove_bb_from_loops (basic_block);
00220
00221 extern void cancel_loop_tree (struct loops *, struct loop *);
00222
00223 extern basic_block loop_split_edge_with (edge, rtx);
00224 extern int fix_loop_placement (struct loop *);
00225
00226 enum
00227 {
00228 CP_SIMPLE_PREHEADERS = 1
00229 };
00230
00231 extern void create_preheaders (struct loops *, int);
00232 extern void force_single_succ_latches (struct loops *);
00233
00234 extern void verify_loop_structure (struct loops *);
00235
00236
00237 extern bool just_once_each_iteration_p (const struct loop *, basic_block);
00238 extern unsigned expected_loop_iterations (const struct loop *);
00239 extern rtx doloop_condition_get (rtx);
00240
00241
00242 extern bool can_duplicate_loop_p (struct loop *loop);
00243
00244 #define DLTHE_FLAG_UPDATE_FREQ 1
00245
00246 #define DLTHE_RECORD_COPY_NUMBER 2
00247
00248 #define DLTHE_FLAG_COMPLETTE_PEEL 4
00249
00250
00251 extern struct loop * duplicate_loop (struct loops *, struct loop *,
00252 struct loop *);
00253 extern bool duplicate_loop_to_header_edge (struct loop *, edge, struct loops *,
00254 unsigned, sbitmap, edge, edge *,
00255 unsigned *, int);
00256 extern struct loop *loopify (struct loops *, edge, edge,
00257 basic_block, edge, edge, bool);
00258 struct loop * loop_version (struct loops *, struct loop *, void *,
00259 basic_block *, bool);
00260 extern bool remove_path (struct loops *, edge);
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 struct rtx_iv
00284 {
00285
00286
00287 rtx base, step;
00288
00289
00290 enum rtx_code extend;
00291
00292
00293 rtx delta, mult;
00294
00295
00296 enum machine_mode extend_mode;
00297
00298
00299 enum machine_mode mode;
00300
00301
00302 unsigned first_special : 1;
00303 };
00304
00305
00306
00307
00308 struct niter_desc
00309 {
00310
00311 edge out_edge;
00312
00313
00314 edge in_edge;
00315
00316
00317
00318 bool simple_p;
00319
00320
00321 bool const_iter;
00322
00323
00324 unsigned HOST_WIDEST_INT niter;
00325
00326
00327 unsigned HOST_WIDEST_INT niter_max;
00328
00329
00330 rtx assumptions;
00331
00332
00333
00334 rtx noloop_assumptions;
00335
00336
00337 rtx infinite;
00338
00339
00340 bool signed_p;
00341
00342
00343 enum machine_mode mode;
00344
00345
00346 rtx niter_expr;
00347 };
00348
00349 extern void iv_analysis_loop_init (struct loop *);
00350 extern bool iv_analyze (rtx, rtx, struct rtx_iv *);
00351 extern bool iv_analyze_result (rtx, rtx, struct rtx_iv *);
00352 extern bool iv_analyze_expr (rtx, rtx, enum machine_mode, struct rtx_iv *);
00353 extern rtx get_iv_value (struct rtx_iv *, rtx);
00354 extern bool biv_p (rtx, rtx);
00355 extern void find_simple_exit (struct loop *, struct niter_desc *);
00356 extern void iv_analysis_done (void);
00357 extern struct df *iv_current_loop_df (void);
00358
00359 extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
00360 extern void free_simple_loop_desc (struct loop *loop);
00361
00362 static inline struct niter_desc *
00363 simple_loop_desc (struct loop *loop)
00364 {
00365 return (struct niter_desc *) loop->aux;
00366 }
00367
00368
00369
00370 extern unsigned target_avail_regs;
00371 extern unsigned target_res_regs;
00372 extern unsigned target_small_cost;
00373
00374 extern unsigned target_pres_cost;
00375
00376 extern unsigned target_spill_cost;
00377
00378
00379
00380
00381 extern unsigned global_cost_for_size (unsigned, unsigned, unsigned);
00382 extern void init_set_costs (void);
00383
00384
00385 extern struct loops *loop_optimizer_init (unsigned);
00386 extern void loop_optimizer_finalize (struct loops *);
00387
00388
00389 extern void unswitch_loops (struct loops *);
00390
00391 enum
00392 {
00393 UAP_PEEL = 1,
00394 UAP_UNROLL = 2,
00395 UAP_UNROLL_ALL = 4
00396 };
00397
00398 extern void unroll_and_peel_loops (struct loops *, int);
00399 extern void doloop_optimize_loops (struct loops *);
00400 extern void move_loop_invariants (struct loops *);
00401 extern void record_estimate (struct loop *, tree, tree, tree);
00402
00403 #endif