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 tree additional;
00054
00055
00056 struct nb_iter_bound *next;
00057
00058 };
00059
00060
00061 struct loop
00062 {
00063
00064 int num;
00065
00066
00067 basic_block header;
00068
00069
00070 basic_block latch;
00071
00072
00073 basic_block pre_header;
00074
00075
00076 struct lpt_decision lpt_decision;
00077
00078
00079 unsigned ninsns;
00080
00081
00082 unsigned av_ninsns;
00083
00084
00085
00086
00087 edge *pre_header_edges;
00088
00089
00090 int num_pre_header_edges;
00091
00092
00093
00094 basic_block first;
00095
00096
00097
00098 basic_block last;
00099
00100
00101 unsigned num_nodes;
00102
00103
00104 edge *entry_edges;
00105
00106
00107 int num_entries;
00108
00109
00110 edge *exit_edges;
00111
00112
00113 int num_exits;
00114
00115
00116 sbitmap exits_doms;
00117
00118
00119 int depth;
00120
00121
00122 struct loop **pred;
00123
00124
00125
00126 int level;
00127
00128
00129 struct loop *outer;
00130
00131
00132 struct loop *inner;
00133
00134
00135 struct loop *next;
00136
00137
00138 struct loop *copy;
00139
00140
00141 int invalid;
00142
00143
00144 void *aux;
00145
00146
00147
00148
00149
00150 rtx start;
00151
00152
00153 rtx end;
00154
00155
00156
00157 rtx top;
00158
00159
00160 rtx scan_start;
00161
00162
00163 rtx sink;
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174 rtx exit_labels;
00175
00176
00177
00178 int exit_count;
00179
00180
00181
00182
00183
00184
00185 tree nb_iterations;
00186
00187
00188
00189 tree estimated_nb_iterations;
00190
00191
00192 struct nb_iter_bound *bounds;
00193
00194
00195
00196 edge single_exit;
00197
00198
00199
00200
00201
00202 bool parallel_p;
00203 };
00204
00205
00206 enum
00207 {
00208 LOOPS_HAVE_PREHEADERS = 1,
00209 LOOPS_HAVE_SIMPLE_LATCHES = 2,
00210 LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
00211 LOOPS_HAVE_MARKED_SINGLE_EXITS = 8
00212 };
00213
00214
00215 struct loops
00216 {
00217
00218 unsigned num;
00219
00220
00221
00222 struct loop *array;
00223
00224
00225
00226
00227
00228
00229
00230 struct loop **parray;
00231
00232
00233 struct loop *tree_root;
00234
00235
00236 struct cfg
00237 {
00238
00239 int *dfs_order;
00240
00241
00242
00243 int *rc_order;
00244 } cfg;
00245
00246
00247 sbitmap shared_headers;
00248
00249
00250 int state;
00251 };
00252
00253
00254
00255 extern struct loops *current_loops;
00256
00257
00258
00259 #define LOOP_TREE 1
00260 #define LOOP_PRE_HEADER 2
00261 #define LOOP_ENTRY_EDGES 4
00262 #define LOOP_EXIT_EDGES 8
00263 #define LOOP_EDGES (LOOP_ENTRY_EDGES | LOOP_EXIT_EDGES)
00264 #define LOOP_ALL 15
00265
00266
00267 extern int flow_loops_find (struct loops *, int flags);
00268 extern void flow_loops_free (struct loops *);
00269 extern void flow_loops_dump (const struct loops *, FILE *,
00270 void (*)(const struct loop *, FILE *, int), int);
00271 extern void flow_loop_dump (const struct loop *, FILE *,
00272 void (*)(const struct loop *, FILE *, int), int);
00273 extern int flow_loop_scan (struct loop *, int);
00274 extern void flow_loop_free (struct loop *);
00275 void mark_irreducible_loops (struct loops *);
00276 void mark_single_exit_loops (struct loops *);
00277 extern void create_loop_notes (void);
00278
00279
00280 extern void flow_loop_tree_node_add (struct loop *, struct loop *);
00281 extern void flow_loop_tree_node_remove (struct loop *);
00282 extern bool flow_loop_outside_edge_p (const struct loop *, edge);
00283 extern bool flow_loop_nested_p (const struct loop *, const struct loop *);
00284 extern bool flow_bb_inside_loop_p (const struct loop *, const basic_block);
00285 extern struct loop * find_common_loop (struct loop *, struct loop *);
00286 struct loop *superloop_at_depth (struct loop *, unsigned);
00287 extern unsigned tree_num_loop_insns (struct loop *);
00288 extern int num_loop_insns (struct loop *);
00289 extern int average_num_loop_insns (struct loop *);
00290 extern unsigned get_loop_level (const struct loop *);
00291
00292
00293 extern basic_block *get_loop_body (const struct loop *);
00294 extern basic_block *get_loop_body_in_dom_order (const struct loop *);
00295 extern basic_block *get_loop_body_in_bfs_order (const struct loop *);
00296 extern edge *get_loop_exit_edges (const struct loop *, unsigned *);
00297 extern unsigned num_loop_branches (const struct loop *);
00298
00299 extern edge loop_preheader_edge (const struct loop *);
00300 extern edge loop_latch_edge (const struct loop *);
00301
00302 extern void add_bb_to_loop (basic_block, struct loop *);
00303 extern void remove_bb_from_loops (basic_block);
00304
00305 extern void cancel_loop (struct loops *, struct loop *);
00306 extern void cancel_loop_tree (struct loops *, struct loop *);
00307
00308 extern basic_block loop_split_edge_with (edge, rtx);
00309 extern int fix_loop_placement (struct loop *);
00310
00311 enum
00312 {
00313 CP_SIMPLE_PREHEADERS = 1
00314 };
00315
00316 extern void create_preheaders (struct loops *, int);
00317 extern void force_single_succ_latches (struct loops *);
00318
00319 extern void verify_loop_structure (struct loops *);
00320
00321
00322 extern bool just_once_each_iteration_p (struct loop *, basic_block);
00323 extern unsigned expected_loop_iterations (const struct loop *);
00324
00325
00326 extern bool can_duplicate_loop_p (struct loop *loop);
00327
00328 #define DLTHE_FLAG_UPDATE_FREQ 1
00329
00330
00331 extern struct loop * duplicate_loop (struct loops *, struct loop *,
00332 struct loop *);
00333 extern int duplicate_loop_to_header_edge (struct loop *, edge, struct loops *,
00334 unsigned, sbitmap, edge, edge *,
00335 unsigned *, int);
00336 extern struct loop *loopify (struct loops *, edge, edge,
00337 basic_block, edge, edge, bool);
00338 extern bool remove_path (struct loops *, edge);
00339 extern edge split_loop_bb (basic_block, void *);
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362 struct rtx_iv
00363 {
00364
00365
00366 rtx base, step;
00367
00368
00369 enum rtx_code extend;
00370
00371
00372 rtx delta, mult;
00373
00374
00375 enum machine_mode extend_mode;
00376
00377
00378 enum machine_mode mode;
00379
00380
00381 unsigned analysed : 1;
00382
00383
00384 unsigned first_special : 1;
00385 };
00386
00387
00388
00389
00390 struct niter_desc
00391 {
00392
00393 edge out_edge;
00394
00395
00396 edge in_edge;
00397
00398
00399
00400 bool simple_p;
00401
00402
00403 bool const_iter;
00404
00405
00406 unsigned HOST_WIDEST_INT niter;
00407
00408
00409 unsigned HOST_WIDEST_INT niter_max;
00410
00411
00412 rtx assumptions;
00413
00414
00415
00416 rtx noloop_assumptions;
00417
00418
00419 rtx infinite;
00420
00421
00422 bool signed_p;
00423
00424
00425 enum machine_mode mode;
00426
00427
00428 rtx niter_expr;
00429 };
00430
00431 extern void iv_analysis_loop_init (struct loop *);
00432 extern rtx iv_get_reaching_def (rtx, rtx);
00433 extern bool iv_analyze (rtx, rtx, struct rtx_iv *);
00434 extern rtx get_iv_value (struct rtx_iv *, rtx);
00435 extern bool biv_p (rtx, rtx);
00436 extern void find_simple_exit (struct loop *, struct niter_desc *);
00437 extern void iv_analysis_done (void);
00438
00439 extern struct niter_desc *get_simple_loop_desc (struct loop *loop);
00440 extern void free_simple_loop_desc (struct loop *loop);
00441
00442 static inline struct niter_desc *
00443 simple_loop_desc (struct loop *loop)
00444 {
00445 return loop->aux;
00446 }
00447
00448
00449
00450 extern unsigned target_avail_regs;
00451 extern unsigned target_res_regs;
00452 extern unsigned target_small_cost;
00453
00454 extern unsigned target_pres_cost;
00455
00456 extern unsigned target_spill_cost;
00457
00458
00459
00460
00461 extern unsigned global_cost_for_size (unsigned, unsigned, unsigned);
00462 extern void init_set_costs (void);
00463
00464
00465 extern struct loops *loop_optimizer_init (FILE *);
00466 extern void loop_optimizer_finalize (struct loops *, FILE *);
00467
00468
00469 extern void unswitch_loops (struct loops *);
00470
00471 enum
00472 {
00473 UAP_PEEL = 1,
00474 UAP_UNROLL = 2,
00475 UAP_UNROLL_ALL = 4
00476 };
00477
00478 extern void unroll_and_peel_loops (struct loops *, int);
00479 extern void doloop_optimize_loops (struct loops *);
00480 extern void move_loop_invariants (struct loops *);
00481 extern void record_estimate (struct loop *, tree, tree, tree);
00482
00483
00484
00485
00486 #define LOOP_PREFETCH 1
00487
00488 extern void loop_optimize (rtx, FILE *, int);
00489
00490 #endif