]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfgloop.c
runtime: Update for change to libbacktrace library.
[thirdparty/gcc.git] / gcc / cfgloop.c
CommitLineData
402209ff 1/* Natural loop discovery code for GNU compiler.
d1e082c2 2 Copyright (C) 2000-2013 Free Software Foundation, Inc.
402209ff
JH
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
9dcd6f09 8Software Foundation; either version 3, or (at your option) any later
402209ff
JH
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
9dcd6f09
NC
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
402209ff
JH
19
20#include "config.h"
21#include "system.h"
4977bab6
ZW
22#include "coretypes.h"
23#include "tm.h"
402209ff 24#include "rtl.h"
a310245f 25#include "function.h"
402209ff 26#include "basic-block.h"
3d436d2a 27#include "cfgloop.h"
718f9c0f 28#include "diagnostic-core.h"
3d436d2a 29#include "flags.h"
6de9cd9a 30#include "tree.h"
442b4905 31#include "gimple.h"
5be5c238 32#include "gimple-iterator.h"
442b4905 33#include "gimple-ssa.h"
89f8f30f 34#include "pointer-set.h"
9e2f83a5 35#include "ggc.h"
7ee2468b 36#include "dumpfile.h"
f470c378 37
d73be268 38static void flow_loops_cfg_dump (FILE *);
402209ff
JH
39\f
40/* Dump loop related CFG information. */
41
42static void
d73be268 43flow_loops_cfg_dump (FILE *file)
402209ff 44{
e0082a72 45 basic_block bb;
402209ff 46
d73be268 47 if (!file)
402209ff
JH
48 return;
49
e0082a72 50 FOR_EACH_BB (bb)
402209ff
JH
51 {
52 edge succ;
628f6a4e 53 edge_iterator ei;
402209ff 54
e0082a72 55 fprintf (file, ";; %d succs { ", bb->index);
628f6a4e 56 FOR_EACH_EDGE (succ, ei, bb->succs)
0b17ab2f 57 fprintf (file, "%d ", succ->dest->index);
2ecfd709 58 fprintf (file, "}\n");
402209ff 59 }
402209ff
JH
60}
61
da7d8304 62/* Return nonzero if the nodes of LOOP are a subset of OUTER. */
402209ff 63
2ecfd709 64bool
d329e058 65flow_loop_nested_p (const struct loop *outer, const struct loop *loop)
402209ff 66{
9ba025a2
ZD
67 unsigned odepth = loop_depth (outer);
68
69 return (loop_depth (loop) > odepth
9771b263 70 && (*loop->superloops)[odepth] == outer);
402209ff
JH
71}
72
1ad03593
SP
73/* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
74 loops within LOOP. */
a7e5372d
ZD
75
76struct loop *
77superloop_at_depth (struct loop *loop, unsigned depth)
78{
9ba025a2
ZD
79 unsigned ldepth = loop_depth (loop);
80
81 gcc_assert (depth <= ldepth);
a7e5372d 82
9ba025a2 83 if (depth == ldepth)
a7e5372d
ZD
84 return loop;
85
9771b263 86 return (*loop->superloops)[depth];
a7e5372d
ZD
87}
88
89f8f30f
ZD
89/* Returns the list of the latch edges of LOOP. */
90
9771b263 91static vec<edge>
89f8f30f
ZD
92get_loop_latch_edges (const struct loop *loop)
93{
94 edge_iterator ei;
95 edge e;
6e1aa848 96 vec<edge> ret = vNULL;
89f8f30f
ZD
97
98 FOR_EACH_EDGE (e, ei, loop->header->preds)
99 {
100 if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
9771b263 101 ret.safe_push (e);
89f8f30f
ZD
102 }
103
104 return ret;
105}
106
402209ff
JH
107/* Dump the loop information specified by LOOP to the stream FILE
108 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
109
110void
d329e058
AJ
111flow_loop_dump (const struct loop *loop, FILE *file,
112 void (*loop_dump_aux) (const struct loop *, FILE *, int),
113 int verbose)
402209ff 114{
2ecfd709 115 basic_block *bbs;
3d436d2a 116 unsigned i;
9771b263 117 vec<edge> latches;
89f8f30f 118 edge e;
2ecfd709 119
402209ff
JH
120 if (! loop || ! loop->header)
121 return;
122
7490e6c4 123 fprintf (file, ";;\n;; Loop %d\n", loop->num);
402209ff 124
89f8f30f
ZD
125 fprintf (file, ";; header %d, ", loop->header->index);
126 if (loop->latch)
127 fprintf (file, "latch %d\n", loop->latch->index);
128 else
129 {
130 fprintf (file, "multiple latches:");
131 latches = get_loop_latch_edges (loop);
9771b263 132 FOR_EACH_VEC_ELT (latches, i, e)
89f8f30f 133 fprintf (file, " %d", e->src->index);
9771b263 134 latches.release ();
89f8f30f
ZD
135 fprintf (file, "\n");
136 }
137
99f8a411 138 fprintf (file, ";; depth %d, outer %ld\n",
9ba025a2
ZD
139 loop_depth (loop), (long) (loop_outer (loop)
140 ? loop_outer (loop)->num : -1));
402209ff 141
2ecfd709
ZD
142 fprintf (file, ";; nodes:");
143 bbs = get_loop_body (loop);
144 for (i = 0; i < loop->num_nodes; i++)
145 fprintf (file, " %d", bbs[i]->index);
146 free (bbs);
147 fprintf (file, "\n");
5f0d2358 148
402209ff
JH
149 if (loop_dump_aux)
150 loop_dump_aux (loop, file, verbose);
151}
152
d73be268 153/* Dump the loop information about loops to the stream FILE,
402209ff
JH
154 using auxiliary dump callback function LOOP_DUMP_AUX if non null. */
155
156void
d73be268 157flow_loops_dump (FILE *file, void (*loop_dump_aux) (const struct loop *, FILE *, int), int verbose)
402209ff 158{
42fd6772
ZD
159 loop_iterator li;
160 struct loop *loop;
402209ff 161
d73be268 162 if (!current_loops || ! file)
402209ff
JH
163 return;
164
0fc822d0 165 fprintf (file, ";; %d loops found\n", number_of_loops (cfun));
2ecfd709 166
42fd6772 167 FOR_EACH_LOOP (li, loop, LI_INCLUDE_ROOT)
402209ff 168 {
2ecfd709 169 flow_loop_dump (loop, file, loop_dump_aux, verbose);
402209ff
JH
170 }
171
172 if (verbose)
d73be268 173 flow_loops_cfg_dump (file);
402209ff
JH
174}
175
2ecfd709 176/* Free data allocated for LOOP. */
9e2f83a5 177
35b07080 178void
d329e058 179flow_loop_free (struct loop *loop)
2ecfd709 180{
6270df4c
ZD
181 struct loop_exit *exit, *next;
182
9771b263 183 vec_free (loop->superloops);
6270df4c
ZD
184
185 /* Break the list of the loop exit records. They will be freed when the
186 corresponding edge is rescanned or removed, and this avoids
187 accessing the (already released) head of the list stored in the
188 loop structure. */
9e2f83a5 189 for (exit = loop->exits->next; exit != loop->exits; exit = next)
6270df4c
ZD
190 {
191 next = exit->next;
192 exit->next = exit;
193 exit->prev = exit;
194 }
9e2f83a5
ZD
195
196 ggc_free (loop->exits);
197 ggc_free (loop);
2ecfd709
ZD
198}
199
402209ff
JH
200/* Free all the memory allocated for LOOPS. */
201
202void
d329e058 203flow_loops_free (struct loops *loops)
402209ff 204{
42fd6772 205 if (loops->larray)
402209ff 206 {
3d436d2a 207 unsigned i;
42fd6772 208 loop_p loop;
402209ff
JH
209
210 /* Free the loop descriptors. */
9771b263 211 FOR_EACH_VEC_SAFE_ELT (loops->larray, i, loop)
402209ff 212 {
2ecfd709
ZD
213 if (!loop)
214 continue;
215
216 flow_loop_free (loop);
402209ff 217 }
5f0d2358 218
9771b263 219 vec_free (loops->larray);
402209ff
JH
220 }
221}
222
2ecfd709
ZD
223/* Find the nodes contained within the LOOP with header HEADER.
224 Return the number of nodes within the loop. */
402209ff 225
2b271002 226int
d329e058 227flow_loop_nodes_find (basic_block header, struct loop *loop)
402209ff 228{
6e1aa848 229 vec<basic_block> stack = vNULL;
2ecfd709 230 int num_nodes = 1;
89f8f30f
ZD
231 edge latch;
232 edge_iterator latch_ei;
402209ff 233
2ecfd709 234 header->loop_father = loop;
402209ff 235
89f8f30f 236 FOR_EACH_EDGE (latch, latch_ei, loop->header->preds)
402209ff 237 {
89f8f30f
ZD
238 if (latch->src->loop_father == loop
239 || !dominated_by_p (CDI_DOMINATORS, latch->src, loop->header))
240 continue;
241
402209ff 242 num_nodes++;
9771b263 243 stack.safe_push (latch->src);
89f8f30f 244 latch->src->loop_father = loop;
d329e058 245
9771b263 246 while (!stack.is_empty ())
402209ff 247 {
2ecfd709
ZD
248 basic_block node;
249 edge e;
628f6a4e 250 edge_iterator ei;
402209ff 251
9771b263 252 node = stack.pop ();
d329e058 253
628f6a4e 254 FOR_EACH_EDGE (e, ei, node->preds)
402209ff 255 {
2ecfd709
ZD
256 basic_block ancestor = e->src;
257
89f8f30f 258 if (ancestor->loop_father != loop)
2ecfd709
ZD
259 {
260 ancestor->loop_father = loop;
2ecfd709 261 num_nodes++;
9771b263 262 stack.safe_push (ancestor);
2ecfd709 263 }
402209ff
JH
264 }
265 }
266 }
9771b263 267 stack.release ();
89f8f30f 268
402209ff
JH
269 return num_nodes;
270}
271
9ba025a2
ZD
272/* Records the vector of superloops of the loop LOOP, whose immediate
273 superloop is FATHER. */
274
35b07080 275static void
9ba025a2 276establish_preds (struct loop *loop, struct loop *father)
35b07080 277{
9ba025a2
ZD
278 loop_p ploop;
279 unsigned depth = loop_depth (father) + 1;
280 unsigned i;
a310245f 281
9771b263
DN
282 loop->superloops = 0;
283 vec_alloc (loop->superloops, depth);
284 FOR_EACH_VEC_SAFE_ELT (father->superloops, i, ploop)
285 loop->superloops->quick_push (ploop);
286 loop->superloops->quick_push (father);
35b07080
ZD
287
288 for (ploop = loop->inner; ploop; ploop = ploop->next)
9ba025a2 289 establish_preds (ploop, loop);
35b07080
ZD
290}
291
2ecfd709 292/* Add LOOP to the loop hierarchy tree where FATHER is father of the
35b07080
ZD
293 added loop. If LOOP has some children, take care of that their
294 pred field will be initialized correctly. */
402209ff 295
2ecfd709 296void
d329e058 297flow_loop_tree_node_add (struct loop *father, struct loop *loop)
402209ff 298{
2ecfd709
ZD
299 loop->next = father->inner;
300 father->inner = loop;
2ecfd709 301
9ba025a2 302 establish_preds (loop, father);
402209ff
JH
303}
304
2ecfd709 305/* Remove LOOP from the loop hierarchy tree. */
402209ff 306
2ecfd709 307void
d329e058 308flow_loop_tree_node_remove (struct loop *loop)
402209ff 309{
2ecfd709 310 struct loop *prev, *father;
402209ff 311
9ba025a2 312 father = loop_outer (loop);
402209ff 313
2ecfd709
ZD
314 /* Remove loop from the list of sons. */
315 if (father->inner == loop)
316 father->inner = loop->next;
317 else
318 {
9ba025a2
ZD
319 for (prev = father->inner; prev->next != loop; prev = prev->next)
320 continue;
2ecfd709
ZD
321 prev->next = loop->next;
322 }
402209ff 323
9771b263 324 loop->superloops = NULL;
402209ff
JH
325}
326
6270df4c
ZD
327/* Allocates and returns new loop structure. */
328
329struct loop *
330alloc_loop (void)
331{
a9429e29 332 struct loop *loop = ggc_alloc_cleared_loop ();
9e2f83a5 333
a9429e29 334 loop->exits = ggc_alloc_cleared_loop_exit ();
9e2f83a5 335 loop->exits->next = loop->exits->prev = loop->exits;
204b560f 336 loop->can_be_parallel = false;
6270df4c 337
6270df4c
ZD
338 return loop;
339}
340
4ed88ee3
ZD
341/* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
342 (including the root of the loop tree). */
343
dd366ec3
RB
344void
345init_loops_structure (struct function *fn,
346 struct loops *loops, unsigned num_loops)
4ed88ee3
ZD
347{
348 struct loop *root;
349
350 memset (loops, 0, sizeof *loops);
9771b263 351 vec_alloc (loops->larray, num_loops);
4ed88ee3
ZD
352
353 /* Dummy loop containing whole function. */
354 root = alloc_loop ();
0cae8d31 355 root->num_nodes = n_basic_blocks_for_fn (fn);
dd366ec3
RB
356 root->latch = EXIT_BLOCK_PTR_FOR_FUNCTION (fn);
357 root->header = ENTRY_BLOCK_PTR_FOR_FUNCTION (fn);
358 ENTRY_BLOCK_PTR_FOR_FUNCTION (fn)->loop_father = root;
359 EXIT_BLOCK_PTR_FOR_FUNCTION (fn)->loop_father = root;
4ed88ee3 360
9771b263 361 loops->larray->quick_push (root);
4ed88ee3
ZD
362 loops->tree_root = root;
363}
364
0375167b
RB
365/* Returns whether HEADER is a loop header. */
366
367bool
368bb_loop_header_p (basic_block header)
369{
370 edge_iterator ei;
371 edge e;
372
373 /* If we have an abnormal predecessor, do not consider the
374 loop (not worth the problems). */
375 if (bb_has_abnormal_pred (header))
376 return false;
377
378 /* Look for back edges where a predecessor is dominated
379 by this block. A natural loop has a single entry
380 node (header) that dominates all the nodes in the
381 loop. It also has single back edge to the header
382 from a latch node. */
383 FOR_EACH_EDGE (e, ei, header->preds)
384 {
385 basic_block latch = e->src;
386 if (latch != ENTRY_BLOCK_PTR
387 && dominated_by_p (CDI_DOMINATORS, latch, header))
388 return true;
389 }
390
391 return false;
392}
393
5f0d2358 394/* Find all the natural loops in the function and save in LOOPS structure and
391886c8 395 recalculate loop_father information in basic block structures.
0375167b
RB
396 If LOOPS is non-NULL then the loop structures for already recorded loops
397 will be re-used and their number will not change. We assume that no
398 stale loops exist in LOOPS.
399 When LOOPS is NULL it is allocated and re-built from scratch.
400 Return the built LOOPS structure. */
402209ff 401
0375167b 402struct loops *
70388d94 403flow_loops_find (struct loops *loops)
402209ff 404{
0375167b 405 bool from_scratch = (loops == NULL);
402209ff 406 int *rc_order;
0375167b
RB
407 int b;
408 unsigned i;
409 vec<loop_p> larray;
402209ff 410
4ed88ee3
ZD
411 /* Ensure that the dominators are computed. */
412 calculate_dominance_info (CDI_DOMINATORS);
402209ff 413
0375167b 414 if (!loops)
4ed88ee3 415 {
0375167b 416 loops = ggc_alloc_cleared_loops ();
dd366ec3 417 init_loops_structure (cfun, loops, 1);
4ed88ee3 418 }
402209ff 419
0375167b
RB
420 /* Ensure that loop exits were released. */
421 gcc_assert (loops->exits == NULL);
402209ff 422
0375167b
RB
423 /* Taking care of this degenerate case makes the rest of
424 this code simpler. */
0cae8d31 425 if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
0375167b 426 return loops;
2ecfd709 427
0375167b 428 /* The root loop node contains all basic-blocks. */
0cae8d31 429 loops->tree_root->num_nodes = n_basic_blocks_for_fn (cfun);
d329e058 430
0375167b
RB
431 /* Compute depth first search order of the CFG so that outer
432 natural loops will be found before inner natural loops. */
0cae8d31 433 rc_order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
0375167b 434 pre_and_rev_post_order_compute (NULL, rc_order, false);
16f2b86a 435
0375167b
RB
436 /* Gather all loop headers in reverse completion order and allocate
437 loop structures for loops that are not already present. */
c3284718 438 larray.create (loops->larray->length ());
0cae8d31 439 for (b = 0; b < n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS; b++)
0375167b
RB
440 {
441 basic_block header = BASIC_BLOCK (rc_order[b]);
442 if (bb_loop_header_p (header))
402209ff 443 {
0375167b 444 struct loop *loop;
2ecfd709 445
0375167b
RB
446 /* The current active loop tree has valid loop-fathers for
447 header blocks. */
448 if (!from_scratch
449 && header->loop_father->header == header)
2ecfd709 450 {
0375167b
RB
451 loop = header->loop_father;
452 /* If we found an existing loop remove it from the
453 loop tree. It is going to be inserted again
454 below. */
455 flow_loop_tree_node_remove (loop);
2ecfd709 456 }
0375167b
RB
457 else
458 {
459 /* Otherwise allocate a new loop structure for the loop. */
460 loop = alloc_loop ();
461 /* ??? We could re-use unused loop slots here. */
462 loop->num = loops->larray->length ();
463 vec_safe_push (loops->larray, loop);
464 loop->header = header;
465
466 if (!from_scratch
467 && dump_file && (dump_flags & TDF_DETAILS))
468 fprintf (dump_file, "flow_loops_find: discovered new "
469 "loop %d with header %d\n",
470 loop->num, header->index);
471 }
6aaf596b
RB
472 /* Reset latch, we recompute it below. */
473 loop->latch = NULL;
0375167b 474 larray.safe_push (loop);
402209ff 475 }
402209ff 476
0375167b
RB
477 /* Make blocks part of the loop root node at start. */
478 header->loop_father = loops->tree_root;
479 }
2ecfd709 480
0375167b 481 free (rc_order);
2ecfd709 482
0375167b
RB
483 /* Now iterate over the loops found, insert them into the loop tree
484 and assign basic-block ownership. */
485 for (i = 0; i < larray.length (); ++i)
402209ff 486 {
0375167b
RB
487 struct loop *loop = larray[i];
488 basic_block header = loop->header;
489 edge_iterator ei;
490 edge e;
402209ff 491
0375167b
RB
492 flow_loop_tree_node_add (header->loop_father, loop);
493 loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
402209ff 494
0375167b
RB
495 /* Look for the latch for this header block, if it has just a
496 single one. */
497 FOR_EACH_EDGE (e, ei, header->preds)
402209ff 498 {
0375167b 499 basic_block latch = e->src;
89f8f30f 500
0375167b 501 if (flow_bb_inside_loop_p (loop, latch))
402209ff 502 {
0375167b 503 if (loop->latch != NULL)
402209ff 504 {
0375167b
RB
505 /* More than one latch edge. */
506 loop->latch = NULL;
507 break;
402209ff 508 }
0375167b 509 loop->latch = latch;
402209ff 510 }
402209ff 511 }
2ecfd709 512 }
3d436d2a 513
c3284718 514 larray.release ();
36579663 515
0375167b 516 return loops;
402209ff
JH
517}
518
89f8f30f
ZD
519/* Ratio of frequencies of edges so that one of more latch edges is
520 considered to belong to inner loop with same header. */
521#define HEAVY_EDGE_RATIO 8
522
523/* Minimum number of samples for that we apply
524 find_subloop_latch_edge_by_profile heuristics. */
525#define HEAVY_EDGE_MIN_SAMPLES 10
526
527/* If the profile info is available, finds an edge in LATCHES that much more
528 frequent than the remaining edges. Returns such an edge, or NULL if we do
529 not find one.
530
531 We do not use guessed profile here, only the measured one. The guessed
532 profile is usually too flat and unreliable for this (and it is mostly based
533 on the loop structure of the program, so it does not make much sense to
534 derive the loop structure from it). */
b8698a0f 535
89f8f30f 536static edge
9771b263 537find_subloop_latch_edge_by_profile (vec<edge> latches)
89f8f30f
ZD
538{
539 unsigned i;
540 edge e, me = NULL;
541 gcov_type mcount = 0, tcount = 0;
542
9771b263 543 FOR_EACH_VEC_ELT (latches, i, e)
89f8f30f
ZD
544 {
545 if (e->count > mcount)
546 {
547 me = e;
548 mcount = e->count;
549 }
550 tcount += e->count;
551 }
552
553 if (tcount < HEAVY_EDGE_MIN_SAMPLES
554 || (tcount - mcount) * HEAVY_EDGE_RATIO > tcount)
555 return NULL;
556
557 if (dump_file)
558 fprintf (dump_file,
559 "Found latch edge %d -> %d using profile information.\n",
560 me->src->index, me->dest->index);
561 return me;
562}
563
564/* Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based
565 on the structure of induction variables. Returns this edge, or NULL if we
566 do not find any.
567
568 We are quite conservative, and look just for an obvious simple innermost
569 loop (which is the case where we would lose the most performance by not
570 disambiguating the loop). More precisely, we look for the following
571 situation: The source of the chosen latch edge dominates sources of all
572 the other latch edges. Additionally, the header does not contain a phi node
573 such that the argument from the chosen edge is equal to the argument from
574 another edge. */
575
576static edge
9771b263 577find_subloop_latch_edge_by_ivs (struct loop *loop ATTRIBUTE_UNUSED, vec<edge> latches)
89f8f30f 578{
9771b263 579 edge e, latch = latches[0];
89f8f30f 580 unsigned i;
726a989a
RB
581 gimple phi;
582 gimple_stmt_iterator psi;
583 tree lop;
89f8f30f
ZD
584 basic_block bb;
585
586 /* Find the candidate for the latch edge. */
9771b263 587 for (i = 1; latches.iterate (i, &e); i++)
89f8f30f
ZD
588 if (dominated_by_p (CDI_DOMINATORS, latch->src, e->src))
589 latch = e;
590
591 /* Verify that it dominates all the latch edges. */
9771b263 592 FOR_EACH_VEC_ELT (latches, i, e)
89f8f30f
ZD
593 if (!dominated_by_p (CDI_DOMINATORS, e->src, latch->src))
594 return NULL;
595
596 /* Check for a phi node that would deny that this is a latch edge of
597 a subloop. */
726a989a 598 for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
89f8f30f 599 {
726a989a 600 phi = gsi_stmt (psi);
89f8f30f
ZD
601 lop = PHI_ARG_DEF_FROM_EDGE (phi, latch);
602
603 /* Ignore the values that are not changed inside the subloop. */
604 if (TREE_CODE (lop) != SSA_NAME
605 || SSA_NAME_DEF_STMT (lop) == phi)
606 continue;
726a989a 607 bb = gimple_bb (SSA_NAME_DEF_STMT (lop));
89f8f30f
ZD
608 if (!bb || !flow_bb_inside_loop_p (loop, bb))
609 continue;
610
9771b263 611 FOR_EACH_VEC_ELT (latches, i, e)
89f8f30f
ZD
612 if (e != latch
613 && PHI_ARG_DEF_FROM_EDGE (phi, e) == lop)
614 return NULL;
615 }
616
617 if (dump_file)
618 fprintf (dump_file,
619 "Found latch edge %d -> %d using iv structure.\n",
620 latch->src->index, latch->dest->index);
621 return latch;
622}
623
624/* If we can determine that one of the several latch edges of LOOP behaves
625 as a latch edge of a separate subloop, returns this edge. Otherwise
626 returns NULL. */
627
628static edge
629find_subloop_latch_edge (struct loop *loop)
630{
9771b263 631 vec<edge> latches = get_loop_latch_edges (loop);
89f8f30f
ZD
632 edge latch = NULL;
633
9771b263 634 if (latches.length () > 1)
89f8f30f
ZD
635 {
636 latch = find_subloop_latch_edge_by_profile (latches);
637
638 if (!latch
639 /* We consider ivs to guess the latch edge only in SSA. Perhaps we
640 should use cfghook for this, but it is hard to imagine it would
641 be useful elsewhere. */
642 && current_ir_type () == IR_GIMPLE)
643 latch = find_subloop_latch_edge_by_ivs (loop, latches);
644 }
645
9771b263 646 latches.release ();
89f8f30f
ZD
647 return latch;
648}
649
650/* Callback for make_forwarder_block. Returns true if the edge E is marked
651 in the set MFB_REIS_SET. */
652
653static struct pointer_set_t *mfb_reis_set;
654static bool
655mfb_redirect_edges_in_set (edge e)
656{
657 return pointer_set_contains (mfb_reis_set, e);
658}
659
660/* Creates a subloop of LOOP with latch edge LATCH. */
661
662static void
663form_subloop (struct loop *loop, edge latch)
664{
665 edge_iterator ei;
666 edge e, new_entry;
667 struct loop *new_loop;
b8698a0f 668
89f8f30f
ZD
669 mfb_reis_set = pointer_set_create ();
670 FOR_EACH_EDGE (e, ei, loop->header->preds)
671 {
672 if (e != latch)
673 pointer_set_insert (mfb_reis_set, e);
674 }
675 new_entry = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
676 NULL);
677 pointer_set_destroy (mfb_reis_set);
678
679 loop->header = new_entry->src;
680
681 /* Find the blocks and subloops that belong to the new loop, and add it to
682 the appropriate place in the loop tree. */
683 new_loop = alloc_loop ();
684 new_loop->header = new_entry->dest;
685 new_loop->latch = latch->src;
686 add_loop (new_loop, loop);
687}
688
689/* Make all the latch edges of LOOP to go to a single forwarder block --
690 a new latch of LOOP. */
691
692static void
693merge_latch_edges (struct loop *loop)
694{
9771b263 695 vec<edge> latches = get_loop_latch_edges (loop);
89f8f30f
ZD
696 edge latch, e;
697 unsigned i;
698
9771b263 699 gcc_assert (latches.length () > 0);
89f8f30f 700
9771b263
DN
701 if (latches.length () == 1)
702 loop->latch = latches[0]->src;
89f8f30f
ZD
703 else
704 {
705 if (dump_file)
706 fprintf (dump_file, "Merged latch edges of loop %d\n", loop->num);
707
708 mfb_reis_set = pointer_set_create ();
9771b263 709 FOR_EACH_VEC_ELT (latches, i, e)
89f8f30f
ZD
710 pointer_set_insert (mfb_reis_set, e);
711 latch = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
712 NULL);
713 pointer_set_destroy (mfb_reis_set);
714
715 loop->header = latch->dest;
716 loop->latch = latch->src;
717 }
718
9771b263 719 latches.release ();
89f8f30f
ZD
720}
721
722/* LOOP may have several latch edges. Transform it into (possibly several)
723 loops with single latch edge. */
724
725static void
726disambiguate_multiple_latches (struct loop *loop)
727{
728 edge e;
729
ea2c620c 730 /* We eliminate the multiple latches by splitting the header to the forwarder
89f8f30f
ZD
731 block F and the rest R, and redirecting the edges. There are two cases:
732
733 1) If there is a latch edge E that corresponds to a subloop (we guess
734 that based on profile -- if it is taken much more often than the
735 remaining edges; and on trees, using the information about induction
736 variables of the loops), we redirect E to R, all the remaining edges to
737 F, then rescan the loops and try again for the outer loop.
738 2) If there is no such edge, we redirect all latch edges to F, and the
739 entry edges to R, thus making F the single latch of the loop. */
740
741 if (dump_file)
742 fprintf (dump_file, "Disambiguating loop %d with multiple latches\n",
743 loop->num);
744
745 /* During latch merging, we may need to redirect the entry edges to a new
746 block. This would cause problems if the entry edge was the one from the
747 entry block. To avoid having to handle this case specially, split
748 such entry edge. */
749 e = find_edge (ENTRY_BLOCK_PTR, loop->header);
750 if (e)
751 split_edge (e);
752
753 while (1)
754 {
755 e = find_subloop_latch_edge (loop);
756 if (!e)
757 break;
758
759 form_subloop (loop, e);
760 }
761
762 merge_latch_edges (loop);
763}
764
765/* Split loops with multiple latch edges. */
766
767void
768disambiguate_loops_with_multiple_latches (void)
769{
770 loop_iterator li;
771 struct loop *loop;
772
773 FOR_EACH_LOOP (li, loop, 0)
774 {
775 if (!loop->latch)
776 disambiguate_multiple_latches (loop);
777 }
778}
779
da7d8304 780/* Return nonzero if basic block BB belongs to LOOP. */
2ecfd709 781bool
ed7a4b4b 782flow_bb_inside_loop_p (const struct loop *loop, const_basic_block bb)
2ecfd709
ZD
783{
784 struct loop *source_loop;
785
786 if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
787 return 0;
788
789 source_loop = bb->loop_father;
790 return loop == source_loop || flow_loop_nested_p (loop, source_loop);
791}
792
89f8f30f 793/* Enumeration predicate for get_loop_body_with_size. */
2ecfd709 794static bool
ed7a4b4b 795glb_enum_p (const_basic_block bb, const void *glb_loop)
2ecfd709 796{
ed7a4b4b 797 const struct loop *const loop = (const struct loop *) glb_loop;
89f8f30f
ZD
798 return (bb != loop->header
799 && dominated_by_p (CDI_DOMINATORS, bb, loop->header));
800}
801
802/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
803 order against direction of edges from latch. Specially, if
804 header != latch, latch is the 1-st block. LOOP cannot be the fake
805 loop tree root, and its size must be at most MAX_SIZE. The blocks
806 in the LOOP body are stored to BODY, and the size of the LOOP is
807 returned. */
808
809unsigned
810get_loop_body_with_size (const struct loop *loop, basic_block *body,
811 unsigned max_size)
812{
813 return dfs_enumerate_from (loop->header, 1, glb_enum_p,
ed7a4b4b 814 body, max_size, loop);
2ecfd709
ZD
815}
816
8d28e87d
ZD
817/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
818 order against direction of edges from latch. Specially, if
819 header != latch, latch is the 1-st block. */
89f8f30f 820
2ecfd709 821basic_block *
d329e058 822get_loop_body (const struct loop *loop)
2ecfd709 823{
89f8f30f 824 basic_block *body, bb;
3d436d2a 825 unsigned tv = 0;
2ecfd709 826
341c100f 827 gcc_assert (loop->num_nodes);
2ecfd709 828
c302207e 829 body = XNEWVEC (basic_block, loop->num_nodes);
2ecfd709
ZD
830
831 if (loop->latch == EXIT_BLOCK_PTR)
832 {
89f8f30f
ZD
833 /* There may be blocks unreachable from EXIT_BLOCK, hence we need to
834 special-case the fake loop that contains the whole function. */
0cae8d31 835 gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks_for_fn (cfun));
89f8f30f
ZD
836 body[tv++] = loop->header;
837 body[tv++] = EXIT_BLOCK_PTR;
2ecfd709 838 FOR_EACH_BB (bb)
89f8f30f 839 body[tv++] = bb;
2ecfd709 840 }
89f8f30f
ZD
841 else
842 tv = get_loop_body_with_size (loop, body, loop->num_nodes);
2ecfd709 843
341c100f 844 gcc_assert (tv == loop->num_nodes);
89f8f30f 845 return body;
2ecfd709
ZD
846}
847
50654f6c
ZD
848/* Fills dominance descendants inside LOOP of the basic block BB into
849 array TOVISIT from index *TV. */
850
851static void
852fill_sons_in_loop (const struct loop *loop, basic_block bb,
853 basic_block *tovisit, int *tv)
854{
855 basic_block son, postpone = NULL;
856
857 tovisit[(*tv)++] = bb;
858 for (son = first_dom_son (CDI_DOMINATORS, bb);
859 son;
860 son = next_dom_son (CDI_DOMINATORS, son))
861 {
862 if (!flow_bb_inside_loop_p (loop, son))
863 continue;
864
865 if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
866 {
867 postpone = son;
868 continue;
869 }
870 fill_sons_in_loop (loop, son, tovisit, tv);
871 }
872
873 if (postpone)
874 fill_sons_in_loop (loop, postpone, tovisit, tv);
875}
876
877/* Gets body of a LOOP (that must be different from the outermost loop)
878 sorted by dominance relation. Additionally, if a basic block s dominates
879 the latch, then only blocks dominated by s are be after it. */
880
881basic_block *
882get_loop_body_in_dom_order (const struct loop *loop)
883{
884 basic_block *tovisit;
885 int tv;
886
341c100f 887 gcc_assert (loop->num_nodes);
50654f6c 888
c302207e 889 tovisit = XNEWVEC (basic_block, loop->num_nodes);
50654f6c 890
341c100f 891 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
50654f6c
ZD
892
893 tv = 0;
894 fill_sons_in_loop (loop, loop->header, tovisit, &tv);
895
341c100f 896 gcc_assert (tv == (int) loop->num_nodes);
50654f6c
ZD
897
898 return tovisit;
899}
900
e855c69d
AB
901/* Gets body of a LOOP sorted via provided BB_COMPARATOR. */
902
903basic_block *
b8698a0f 904get_loop_body_in_custom_order (const struct loop *loop,
e855c69d
AB
905 int (*bb_comparator) (const void *, const void *))
906{
907 basic_block *bbs = get_loop_body (loop);
908
909 qsort (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator);
910
911 return bbs;
912}
913
40923b20
DP
914/* Get body of a LOOP in breadth first sort order. */
915
916basic_block *
917get_loop_body_in_bfs_order (const struct loop *loop)
918{
919 basic_block *blocks;
920 basic_block bb;
921 bitmap visited;
922 unsigned int i = 0;
923 unsigned int vc = 1;
924
341c100f
NS
925 gcc_assert (loop->num_nodes);
926 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
40923b20 927
c302207e 928 blocks = XNEWVEC (basic_block, loop->num_nodes);
8bdbfff5 929 visited = BITMAP_ALLOC (NULL);
40923b20
DP
930
931 bb = loop->header;
932 while (i < loop->num_nodes)
933 {
934 edge e;
628f6a4e 935 edge_iterator ei;
c22cacf3 936
fcaa4ca4
NF
937 if (bitmap_set_bit (visited, bb->index))
938 /* This basic block is now visited */
939 blocks[i++] = bb;
c22cacf3 940
628f6a4e 941 FOR_EACH_EDGE (e, ei, bb->succs)
c22cacf3
MS
942 {
943 if (flow_bb_inside_loop_p (loop, e->dest))
944 {
fcaa4ca4
NF
945 if (bitmap_set_bit (visited, e->dest->index))
946 blocks[i++] = e->dest;
c22cacf3
MS
947 }
948 }
949
341c100f 950 gcc_assert (i >= vc);
c22cacf3 951
40923b20
DP
952 bb = blocks[vc++];
953 }
c22cacf3 954
8bdbfff5 955 BITMAP_FREE (visited);
40923b20
DP
956 return blocks;
957}
958
6270df4c
ZD
959/* Hash function for struct loop_exit. */
960
961static hashval_t
962loop_exit_hash (const void *ex)
963{
5f754896 964 const struct loop_exit *const exit = (const struct loop_exit *) ex;
6270df4c
ZD
965
966 return htab_hash_pointer (exit->e);
967}
968
969/* Equality function for struct loop_exit. Compares with edge. */
970
971static int
972loop_exit_eq (const void *ex, const void *e)
973{
5f754896 974 const struct loop_exit *const exit = (const struct loop_exit *) ex;
6270df4c
ZD
975
976 return exit->e == e;
977}
978
979/* Frees the list of loop exit descriptions EX. */
980
981static void
982loop_exit_free (void *ex)
983{
984 struct loop_exit *exit = (struct loop_exit *) ex, *next;
985
986 for (; exit; exit = next)
987 {
988 next = exit->next_e;
b8698a0f 989
6270df4c
ZD
990 exit->next->prev = exit->prev;
991 exit->prev->next = exit->next;
992
9e2f83a5 993 ggc_free (exit);
6270df4c
ZD
994 }
995}
996
997/* Returns the list of records for E as an exit of a loop. */
998
999static struct loop_exit *
1000get_exit_descriptions (edge e)
1001{
ae50c0cb
TN
1002 return (struct loop_exit *) htab_find_with_hash (current_loops->exits, e,
1003 htab_hash_pointer (e));
6270df4c
ZD
1004}
1005
1006/* Updates the lists of loop exits in that E appears.
1007 If REMOVED is true, E is being removed, and we
1008 just remove it from the lists of exits.
1009 If NEW_EDGE is true and E is not a loop exit, we
1010 do not try to remove it from loop exit lists. */
1011
1012void
1013rescan_loop_exit (edge e, bool new_edge, bool removed)
1014{
1015 void **slot;
1016 struct loop_exit *exits = NULL, *exit;
1017 struct loop *aloop, *cloop;
1018
f87000d0 1019 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c
ZD
1020 return;
1021
1022 if (!removed
1023 && e->src->loop_father != NULL
1024 && e->dest->loop_father != NULL
1025 && !flow_bb_inside_loop_p (e->src->loop_father, e->dest))
1026 {
1027 cloop = find_common_loop (e->src->loop_father, e->dest->loop_father);
1028 for (aloop = e->src->loop_father;
1029 aloop != cloop;
9ba025a2 1030 aloop = loop_outer (aloop))
6270df4c 1031 {
a9429e29 1032 exit = ggc_alloc_loop_exit ();
6270df4c
ZD
1033 exit->e = e;
1034
9e2f83a5
ZD
1035 exit->next = aloop->exits->next;
1036 exit->prev = aloop->exits;
6270df4c
ZD
1037 exit->next->prev = exit;
1038 exit->prev->next = exit;
1039
1040 exit->next_e = exits;
1041 exits = exit;
1042 }
b8698a0f 1043 }
6270df4c
ZD
1044
1045 if (!exits && new_edge)
1046 return;
1047
1048 slot = htab_find_slot_with_hash (current_loops->exits, e,
1049 htab_hash_pointer (e),
1050 exits ? INSERT : NO_INSERT);
1051 if (!slot)
1052 return;
1053
1054 if (exits)
1055 {
1056 if (*slot)
1057 loop_exit_free (*slot);
1058 *slot = exits;
1059 }
1060 else
1061 htab_clear_slot (current_loops->exits, slot);
1062}
1063
1064/* For each loop, record list of exit edges, and start maintaining these
1065 lists. */
1066
1067void
1068record_loop_exits (void)
1069{
1070 basic_block bb;
1071 edge_iterator ei;
1072 edge e;
1073
4839cb59
ZD
1074 if (!current_loops)
1075 return;
1076
f87000d0 1077 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1078 return;
f87000d0 1079 loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
6270df4c
ZD
1080
1081 gcc_assert (current_loops->exits == NULL);
0fc822d0 1082 current_loops->exits = htab_create_ggc (2 * number_of_loops (cfun),
a9429e29
LB
1083 loop_exit_hash, loop_exit_eq,
1084 loop_exit_free);
6270df4c
ZD
1085
1086 FOR_EACH_BB (bb)
1087 {
1088 FOR_EACH_EDGE (e, ei, bb->succs)
1089 {
1090 rescan_loop_exit (e, true, false);
1091 }
1092 }
1093}
1094
1095/* Dumps information about the exit in *SLOT to FILE.
1096 Callback for htab_traverse. */
1097
1098static int
1099dump_recorded_exit (void **slot, void *file)
1100{
ae50c0cb 1101 struct loop_exit *exit = (struct loop_exit *) *slot;
6270df4c
ZD
1102 unsigned n = 0;
1103 edge e = exit->e;
1104
1105 for (; exit != NULL; exit = exit->next_e)
1106 n++;
1107
ae50c0cb 1108 fprintf ((FILE*) file, "Edge %d->%d exits %u loops\n",
6270df4c
ZD
1109 e->src->index, e->dest->index, n);
1110
1111 return 1;
1112}
1113
1114/* Dumps the recorded exits of loops to FILE. */
1115
1116extern void dump_recorded_exits (FILE *);
1117void
1118dump_recorded_exits (FILE *file)
1119{
1120 if (!current_loops->exits)
1121 return;
1122 htab_traverse (current_loops->exits, dump_recorded_exit, file);
1123}
1124
1125/* Releases lists of loop exits. */
1126
1127void
1128release_recorded_exits (void)
1129{
f87000d0 1130 gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS));
6270df4c
ZD
1131 htab_delete (current_loops->exits);
1132 current_loops->exits = NULL;
f87000d0 1133 loops_state_clear (LOOPS_HAVE_RECORDED_EXITS);
6270df4c
ZD
1134}
1135
ca83d385
ZD
1136/* Returns the list of the exit edges of a LOOP. */
1137
9771b263 1138vec<edge>
ca83d385 1139get_loop_exit_edges (const struct loop *loop)
35b07080 1140{
6e1aa848 1141 vec<edge> edges = vNULL;
ca83d385
ZD
1142 edge e;
1143 unsigned i;
1144 basic_block *body;
628f6a4e 1145 edge_iterator ei;
6270df4c 1146 struct loop_exit *exit;
35b07080 1147
341c100f 1148 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
35b07080 1149
6270df4c
ZD
1150 /* If we maintain the lists of exits, use them. Otherwise we must
1151 scan the body of the loop. */
f87000d0 1152 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1153 {
9e2f83a5 1154 for (exit = loop->exits->next; exit->e; exit = exit->next)
9771b263 1155 edges.safe_push (exit->e);
6270df4c
ZD
1156 }
1157 else
1158 {
1159 body = get_loop_body (loop);
1160 for (i = 0; i < loop->num_nodes; i++)
1161 FOR_EACH_EDGE (e, ei, body[i]->succs)
1162 {
1163 if (!flow_bb_inside_loop_p (loop, e->dest))
9771b263 1164 edges.safe_push (e);
6270df4c
ZD
1165 }
1166 free (body);
1167 }
35b07080
ZD
1168
1169 return edges;
1170}
1171
50654f6c
ZD
1172/* Counts the number of conditional branches inside LOOP. */
1173
1174unsigned
1175num_loop_branches (const struct loop *loop)
1176{
1177 unsigned i, n;
1178 basic_block * body;
1179
341c100f 1180 gcc_assert (loop->latch != EXIT_BLOCK_PTR);
50654f6c
ZD
1181
1182 body = get_loop_body (loop);
1183 n = 0;
1184 for (i = 0; i < loop->num_nodes; i++)
628f6a4e 1185 if (EDGE_COUNT (body[i]->succs) >= 2)
50654f6c
ZD
1186 n++;
1187 free (body);
1188
1189 return n;
1190}
1191
2ecfd709
ZD
1192/* Adds basic block BB to LOOP. */
1193void
d329e058
AJ
1194add_bb_to_loop (basic_block bb, struct loop *loop)
1195{
9ba025a2
ZD
1196 unsigned i;
1197 loop_p ploop;
6270df4c
ZD
1198 edge_iterator ei;
1199 edge e;
1200
1201 gcc_assert (bb->loop_father == NULL);
1202 bb->loop_father = loop;
6270df4c 1203 loop->num_nodes++;
9771b263 1204 FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
9ba025a2 1205 ploop->num_nodes++;
6270df4c
ZD
1206
1207 FOR_EACH_EDGE (e, ei, bb->succs)
1208 {
1209 rescan_loop_exit (e, true, false);
1210 }
1211 FOR_EACH_EDGE (e, ei, bb->preds)
1212 {
1213 rescan_loop_exit (e, true, false);
1214 }
598ec7bd 1215}
2ecfd709
ZD
1216
1217/* Remove basic block BB from loops. */
1218void
d329e058
AJ
1219remove_bb_from_loops (basic_block bb)
1220{
9771b263 1221 unsigned i;
6270df4c 1222 struct loop *loop = bb->loop_father;
9ba025a2 1223 loop_p ploop;
6270df4c
ZD
1224 edge_iterator ei;
1225 edge e;
1226
1227 gcc_assert (loop != NULL);
1228 loop->num_nodes--;
9771b263 1229 FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
9ba025a2 1230 ploop->num_nodes--;
6270df4c 1231 bb->loop_father = NULL;
6270df4c
ZD
1232
1233 FOR_EACH_EDGE (e, ei, bb->succs)
1234 {
1235 rescan_loop_exit (e, false, true);
1236 }
1237 FOR_EACH_EDGE (e, ei, bb->preds)
1238 {
1239 rescan_loop_exit (e, false, true);
1240 }
a310245f 1241}
2ecfd709
ZD
1242
1243/* Finds nearest common ancestor in loop tree for given loops. */
1244struct loop *
d329e058 1245find_common_loop (struct loop *loop_s, struct loop *loop_d)
2ecfd709 1246{
9ba025a2
ZD
1247 unsigned sdepth, ddepth;
1248
2ecfd709
ZD
1249 if (!loop_s) return loop_d;
1250 if (!loop_d) return loop_s;
d329e058 1251
9ba025a2
ZD
1252 sdepth = loop_depth (loop_s);
1253 ddepth = loop_depth (loop_d);
1254
1255 if (sdepth < ddepth)
9771b263 1256 loop_d = (*loop_d->superloops)[sdepth];
9ba025a2 1257 else if (sdepth > ddepth)
9771b263 1258 loop_s = (*loop_s->superloops)[ddepth];
2ecfd709
ZD
1259
1260 while (loop_s != loop_d)
1261 {
9ba025a2
ZD
1262 loop_s = loop_outer (loop_s);
1263 loop_d = loop_outer (loop_d);
2ecfd709
ZD
1264 }
1265 return loop_s;
1266}
1267
42fd6772
ZD
1268/* Removes LOOP from structures and frees its data. */
1269
1270void
1271delete_loop (struct loop *loop)
1272{
1273 /* Remove the loop from structure. */
1274 flow_loop_tree_node_remove (loop);
1275
1276 /* Remove loop from loops array. */
9771b263 1277 (*current_loops->larray)[loop->num] = NULL;
42fd6772
ZD
1278
1279 /* Free loop data. */
1280 flow_loop_free (loop);
1281}
1282
3d436d2a 1283/* Cancels the LOOP; it must be innermost one. */
b00bf166
KH
1284
1285static void
d73be268 1286cancel_loop (struct loop *loop)
3d436d2a
ZD
1287{
1288 basic_block *bbs;
1289 unsigned i;
9ba025a2 1290 struct loop *outer = loop_outer (loop);
3d436d2a 1291
341c100f 1292 gcc_assert (!loop->inner);
3d436d2a
ZD
1293
1294 /* Move blocks up one level (they should be removed as soon as possible). */
1295 bbs = get_loop_body (loop);
1296 for (i = 0; i < loop->num_nodes; i++)
9ba025a2 1297 bbs[i]->loop_father = outer;
3d436d2a 1298
b78384e0 1299 free (bbs);
42fd6772 1300 delete_loop (loop);
3d436d2a
ZD
1301}
1302
1303/* Cancels LOOP and all its subloops. */
1304void
d73be268 1305cancel_loop_tree (struct loop *loop)
3d436d2a
ZD
1306{
1307 while (loop->inner)
d73be268
ZD
1308 cancel_loop_tree (loop->inner);
1309 cancel_loop (loop);
3d436d2a
ZD
1310}
1311
d73be268 1312/* Checks that information about loops is correct
e0bb17a8 1313 -- sizes of loops are all right
2ecfd709
ZD
1314 -- results of get_loop_body really belong to the loop
1315 -- loop header have just single entry edge and single latch edge
1316 -- loop latches have only single successor that is header of their loop
3d436d2a 1317 -- irreducible loops are correctly marked
cc360b36 1318 -- the cached loop depth and loop father of each bb is correct
2ecfd709 1319 */
24e47c76 1320DEBUG_FUNCTION void
d73be268 1321verify_loop_structure (void)
2ecfd709 1322{
3d436d2a
ZD
1323 unsigned *sizes, i, j;
1324 sbitmap irreds;
a271b42d 1325 basic_block bb, *bbs;
2ecfd709
ZD
1326 struct loop *loop;
1327 int err = 0;
35b07080 1328 edge e;
0fc822d0 1329 unsigned num = number_of_loops (cfun);
42fd6772 1330 loop_iterator li;
6270df4c 1331 struct loop_exit *exit, *mexit;
7d776ee2 1332 bool dom_available = dom_info_available_p (CDI_DOMINATORS);
0375167b 1333 sbitmap visited;
2ecfd709 1334
a9e0d843
RB
1335 if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
1336 {
1337 error ("loop verification on loop tree that needs fixup");
1338 err = 1;
1339 }
1340
7d776ee2
RG
1341 /* We need up-to-date dominators, compute or verify them. */
1342 if (!dom_available)
1343 calculate_dominance_info (CDI_DOMINATORS);
1344 else
1345 verify_dominators (CDI_DOMINATORS);
510dbcce 1346
f64fb0fa
MP
1347 /* Check the headers. */
1348 FOR_EACH_BB (bb)
a271b42d 1349 if (bb_loop_header_p (bb))
f64fb0fa 1350 {
a271b42d
RB
1351 if (bb->loop_father->header == NULL)
1352 {
1353 error ("loop with header %d marked for removal", bb->index);
1354 err = 1;
1355 }
1356 else if (bb->loop_father->header != bb)
1357 {
1358 error ("loop with header %d not in loop tree", bb->index);
1359 err = 1;
1360 }
1361 }
1362 else if (bb->loop_father->header == bb)
1363 {
1364 error ("non-loop with header %d not marked for removal", bb->index);
f64fb0fa
MP
1365 err = 1;
1366 }
1367
a271b42d 1368 /* Check the recorded loop father and sizes of loops. */
0375167b 1369 visited = sbitmap_alloc (last_basic_block);
f61e445a 1370 bitmap_clear (visited);
0cae8d31 1371 bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
cc360b36
SB
1372 FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1373 {
a271b42d 1374 unsigned n;
cc360b36 1375
a271b42d
RB
1376 if (loop->header == NULL)
1377 {
1378 error ("removed loop %d in loop tree", loop->num);
1379 err = 1;
1380 continue;
1381 }
1382
0cae8d31 1383 n = get_loop_body_with_size (loop, bbs, n_basic_blocks_for_fn (cfun));
a271b42d
RB
1384 if (loop->num_nodes != n)
1385 {
1386 error ("size of loop %d should be %d, not %d",
1387 loop->num, n, loop->num_nodes);
1388 err = 1;
1389 }
1390
1391 for (j = 0; j < n; j++)
cc360b36
SB
1392 {
1393 bb = bbs[j];
1394
0375167b
RB
1395 if (!flow_bb_inside_loop_p (loop, bb))
1396 {
1397 error ("bb %d does not belong to loop %d",
1398 bb->index, loop->num);
1399 err = 1;
1400 }
1401
cc360b36 1402 /* Ignore this block if it is in an inner loop. */
d7c028c0 1403 if (bitmap_bit_p (visited, bb->index))
cc360b36 1404 continue;
d7c028c0 1405 bitmap_set_bit (visited, bb->index);
cc360b36
SB
1406
1407 if (bb->loop_father != loop)
1408 {
1409 error ("bb %d has father loop %d, should be loop %d",
1410 bb->index, bb->loop_father->num, loop->num);
1411 err = 1;
1412 }
1413 }
cc360b36 1414 }
a271b42d 1415 free (bbs);
0375167b 1416 sbitmap_free (visited);
2ecfd709
ZD
1417
1418 /* Check headers and latches. */
42fd6772 1419 FOR_EACH_LOOP (li, loop, 0)
2ecfd709 1420 {
42fd6772 1421 i = loop->num;
a271b42d
RB
1422 if (loop->header == NULL)
1423 continue;
0375167b
RB
1424 if (!bb_loop_header_p (loop->header))
1425 {
1426 error ("loop %d%'s header is not a loop header", i);
1427 err = 1;
1428 }
f87000d0 1429 if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
628f6a4e 1430 && EDGE_COUNT (loop->header->preds) != 2)
2ecfd709 1431 {
d8a07487 1432 error ("loop %d%'s header does not have exactly 2 entries", i);
2ecfd709
ZD
1433 err = 1;
1434 }
6aaf596b
RB
1435 if (loop->latch)
1436 {
1437 if (!find_edge (loop->latch, loop->header))
1438 {
1439 error ("loop %d%'s latch does not have an edge to its header", i);
1440 err = 1;
1441 }
1442 if (!dominated_by_p (CDI_DOMINATORS, loop->latch, loop->header))
1443 {
1444 error ("loop %d%'s latch is not dominated by its header", i);
1445 err = 1;
1446 }
1447 }
f87000d0 1448 if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
2ecfd709 1449 {
c5cbcccf 1450 if (!single_succ_p (loop->latch))
2ecfd709 1451 {
d8a07487 1452 error ("loop %d%'s latch does not have exactly 1 successor", i);
2ecfd709
ZD
1453 err = 1;
1454 }
c5cbcccf 1455 if (single_succ (loop->latch) != loop->header)
2ecfd709 1456 {
d8a07487 1457 error ("loop %d%'s latch does not have header as successor", i);
2ecfd709
ZD
1458 err = 1;
1459 }
1460 if (loop->latch->loop_father != loop)
1461 {
d8a07487 1462 error ("loop %d%'s latch does not belong directly to it", i);
2ecfd709
ZD
1463 err = 1;
1464 }
1465 }
1466 if (loop->header->loop_father != loop)
1467 {
d8a07487 1468 error ("loop %d%'s header does not belong directly to it", i);
2ecfd709
ZD
1469 err = 1;
1470 }
f87000d0 1471 if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
35b07080
ZD
1472 && (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
1473 {
d8a07487 1474 error ("loop %d%'s latch is marked as part of irreducible region", i);
35b07080
ZD
1475 err = 1;
1476 }
2ecfd709
ZD
1477 }
1478
3d436d2a 1479 /* Check irreducible loops. */
f87000d0 1480 if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
3d436d2a
ZD
1481 {
1482 /* Record old info. */
1483 irreds = sbitmap_alloc (last_basic_block);
1484 FOR_EACH_BB (bb)
35b07080 1485 {
628f6a4e 1486 edge_iterator ei;
35b07080 1487 if (bb->flags & BB_IRREDUCIBLE_LOOP)
d7c028c0 1488 bitmap_set_bit (irreds, bb->index);
35b07080 1489 else
d7c028c0 1490 bitmap_clear_bit (irreds, bb->index);
628f6a4e 1491 FOR_EACH_EDGE (e, ei, bb->succs)
35b07080 1492 if (e->flags & EDGE_IRREDUCIBLE_LOOP)
d329e058 1493 e->flags |= EDGE_ALL_FLAGS + 1;
35b07080 1494 }
3d436d2a
ZD
1495
1496 /* Recount it. */
d73be268 1497 mark_irreducible_loops ();
3d436d2a
ZD
1498
1499 /* Compare. */
1500 FOR_EACH_BB (bb)
1501 {
628f6a4e
BE
1502 edge_iterator ei;
1503
3d436d2a 1504 if ((bb->flags & BB_IRREDUCIBLE_LOOP)
d7c028c0 1505 && !bitmap_bit_p (irreds, bb->index))
3d436d2a 1506 {
ab532386 1507 error ("basic block %d should be marked irreducible", bb->index);
3d436d2a
ZD
1508 err = 1;
1509 }
1510 else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
d7c028c0 1511 && bitmap_bit_p (irreds, bb->index))
3d436d2a 1512 {
ab532386 1513 error ("basic block %d should not be marked irreducible", bb->index);
3d436d2a
ZD
1514 err = 1;
1515 }
628f6a4e 1516 FOR_EACH_EDGE (e, ei, bb->succs)
35b07080
ZD
1517 {
1518 if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1519 && !(e->flags & (EDGE_ALL_FLAGS + 1)))
1520 {
ab532386 1521 error ("edge from %d to %d should be marked irreducible",
35b07080
ZD
1522 e->src->index, e->dest->index);
1523 err = 1;
1524 }
1525 else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1526 && (e->flags & (EDGE_ALL_FLAGS + 1)))
1527 {
ab532386 1528 error ("edge from %d to %d should not be marked irreducible",
35b07080
ZD
1529 e->src->index, e->dest->index);
1530 err = 1;
1531 }
1532 e->flags &= ~(EDGE_ALL_FLAGS + 1);
1533 }
3d436d2a
ZD
1534 }
1535 free (irreds);
1536 }
1537
6270df4c
ZD
1538 /* Check the recorded loop exits. */
1539 FOR_EACH_LOOP (li, loop, 0)
82b85a85 1540 {
9e2f83a5 1541 if (!loop->exits || loop->exits->e != NULL)
6270df4c
ZD
1542 {
1543 error ("corrupted head of the exits list of loop %d",
1544 loop->num);
1545 err = 1;
1546 }
1547 else
1548 {
1549 /* Check that the list forms a cycle, and all elements except
1550 for the head are nonnull. */
9e2f83a5 1551 for (mexit = loop->exits, exit = mexit->next, i = 0;
6270df4c
ZD
1552 exit->e && exit != mexit;
1553 exit = exit->next)
1554 {
1555 if (i++ & 1)
1556 mexit = mexit->next;
1557 }
1558
9e2f83a5 1559 if (exit != loop->exits)
6270df4c
ZD
1560 {
1561 error ("corrupted exits list of loop %d", loop->num);
1562 err = 1;
1563 }
1564 }
1565
f87000d0 1566 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1567 {
9e2f83a5 1568 if (loop->exits->next != loop->exits)
6270df4c
ZD
1569 {
1570 error ("nonempty exits list of loop %d, but exits are not recorded",
1571 loop->num);
1572 err = 1;
1573 }
1574 }
1575 }
1576
f87000d0 1577 if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c
ZD
1578 {
1579 unsigned n_exits = 0, eloops;
1580
a271b42d 1581 sizes = XCNEWVEC (unsigned, num);
42fd6772 1582 memset (sizes, 0, sizeof (unsigned) * num);
82b85a85
ZD
1583 FOR_EACH_BB (bb)
1584 {
628f6a4e 1585 edge_iterator ei;
d73be268 1586 if (bb->loop_father == current_loops->tree_root)
82b85a85 1587 continue;
628f6a4e 1588 FOR_EACH_EDGE (e, ei, bb->succs)
82b85a85 1589 {
82b85a85
ZD
1590 if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
1591 continue;
1592
6270df4c
ZD
1593 n_exits++;
1594 exit = get_exit_descriptions (e);
1595 if (!exit)
1596 {
d8a07487 1597 error ("exit %d->%d not recorded",
6270df4c
ZD
1598 e->src->index, e->dest->index);
1599 err = 1;
1600 }
1601 eloops = 0;
1602 for (; exit; exit = exit->next_e)
1603 eloops++;
1604
82b85a85 1605 for (loop = bb->loop_father;
661bc682
RB
1606 loop != e->dest->loop_father
1607 /* When a loop exit is also an entry edge which
1608 can happen when avoiding CFG manipulations
1609 then the last loop exited is the outer loop
1610 of the loop entered. */
1611 && loop != loop_outer (e->dest->loop_father);
9ba025a2 1612 loop = loop_outer (loop))
82b85a85 1613 {
6270df4c 1614 eloops--;
82b85a85 1615 sizes[loop->num]++;
6270df4c
ZD
1616 }
1617
1618 if (eloops != 0)
1619 {
d8a07487 1620 error ("wrong list of exited loops for edge %d->%d",
6270df4c
ZD
1621 e->src->index, e->dest->index);
1622 err = 1;
82b85a85
ZD
1623 }
1624 }
1625 }
1626
6270df4c 1627 if (n_exits != htab_elements (current_loops->exits))
82b85a85 1628 {
d8a07487 1629 error ("too many loop exits recorded");
6270df4c
ZD
1630 err = 1;
1631 }
82b85a85 1632
6270df4c
ZD
1633 FOR_EACH_LOOP (li, loop, 0)
1634 {
1635 eloops = 0;
9e2f83a5 1636 for (exit = loop->exits->next; exit->e; exit = exit->next)
6270df4c
ZD
1637 eloops++;
1638 if (eloops != sizes[loop->num])
82b85a85 1639 {
6270df4c
ZD
1640 error ("%d exits recorded for loop %d (having %d exits)",
1641 eloops, loop->num, sizes[loop->num]);
82b85a85
ZD
1642 err = 1;
1643 }
1644 }
a271b42d
RB
1645
1646 free (sizes);
82b85a85
ZD
1647 }
1648
341c100f 1649 gcc_assert (!err);
82b85a85 1650
7d776ee2
RG
1651 if (!dom_available)
1652 free_dominance_info (CDI_DOMINATORS);
2ecfd709
ZD
1653}
1654
1655/* Returns latch edge of LOOP. */
1656edge
d329e058 1657loop_latch_edge (const struct loop *loop)
2ecfd709 1658{
9ff3d2de 1659 return find_edge (loop->latch, loop->header);
402209ff 1660}
2ecfd709
ZD
1661
1662/* Returns preheader edge of LOOP. */
1663edge
d329e058 1664loop_preheader_edge (const struct loop *loop)
2ecfd709
ZD
1665{
1666 edge e;
628f6a4e 1667 edge_iterator ei;
2ecfd709 1668
f87000d0 1669 gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS));
c7b852c8 1670
628f6a4e
BE
1671 FOR_EACH_EDGE (e, ei, loop->header->preds)
1672 if (e->src != loop->latch)
1673 break;
2ecfd709
ZD
1674
1675 return e;
1676}
70388d94
ZD
1677
1678/* Returns true if E is an exit of LOOP. */
1679
1680bool
ed7a4b4b 1681loop_exit_edge_p (const struct loop *loop, const_edge e)
70388d94
ZD
1682{
1683 return (flow_bb_inside_loop_p (loop, e->src)
1684 && !flow_bb_inside_loop_p (loop, e->dest));
1685}
ac8f6c69
ZD
1686
1687/* Returns the single exit edge of LOOP, or NULL if LOOP has either no exit
6270df4c
ZD
1688 or more than one exit. If loops do not have the exits recorded, NULL
1689 is returned always. */
ac8f6c69
ZD
1690
1691edge
1692single_exit (const struct loop *loop)
1693{
9e2f83a5 1694 struct loop_exit *exit = loop->exits->next;
ac8f6c69 1695
f87000d0 1696 if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
6270df4c 1697 return NULL;
ac8f6c69 1698
9e2f83a5 1699 if (exit->e && exit->next == loop->exits)
6270df4c
ZD
1700 return exit->e;
1701 else
1702 return NULL;
ac8f6c69 1703}
f8bf9252 1704
f4ce375d 1705/* Returns true when BB has an incoming edge exiting LOOP. */
f8bf9252
SP
1706
1707bool
f4ce375d 1708loop_exits_to_bb_p (struct loop *loop, basic_block bb)
f8bf9252
SP
1709{
1710 edge e;
1711 edge_iterator ei;
1712
1713 FOR_EACH_EDGE (e, ei, bb->preds)
1714 if (loop_exit_edge_p (loop, e))
1715 return true;
1716
1717 return false;
1718}
f4ce375d
VK
1719
1720/* Returns true when BB has an outgoing edge exiting LOOP. */
1721
1722bool
1723loop_exits_from_bb_p (struct loop *loop, basic_block bb)
1724{
1725 edge e;
1726 edge_iterator ei;
1727
1728 FOR_EACH_EDGE (e, ei, bb->succs)
1729 if (loop_exit_edge_p (loop, e))
1730 return true;
1731
1732 return false;
1733}
e25a6711
TJ
1734
1735/* Return location corresponding to the loop control condition if possible. */
1736
1737location_t
1738get_loop_location (struct loop *loop)
1739{
1740 rtx insn = NULL;
1741 struct niter_desc *desc = NULL;
1742 edge exit;
1743
1744 /* For a for or while loop, we would like to return the location
1745 of the for or while statement, if possible. To do this, look
1746 for the branch guarding the loop back-edge. */
1747
1748 /* If this is a simple loop with an in_edge, then the loop control
1749 branch is typically at the end of its source. */
1750 desc = get_simple_loop_desc (loop);
1751 if (desc->in_edge)
1752 {
1753 FOR_BB_INSNS_REVERSE (desc->in_edge->src, insn)
1754 {
1755 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1756 return INSN_LOCATION (insn);
1757 }
1758 }
1759 /* If loop has a single exit, then the loop control branch
1760 must be at the end of its source. */
1761 if ((exit = single_exit (loop)))
1762 {
1763 FOR_BB_INSNS_REVERSE (exit->src, insn)
1764 {
1765 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1766 return INSN_LOCATION (insn);
1767 }
1768 }
1769 /* Next check the latch, to see if it is non-empty. */
1770 FOR_BB_INSNS_REVERSE (loop->latch, insn)
1771 {
1772 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1773 return INSN_LOCATION (insn);
1774 }
1775 /* Finally, if none of the above identifies the loop control branch,
1776 return the first location in the loop header. */
1777 FOR_BB_INSNS (loop->header, insn)
1778 {
1779 if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1780 return INSN_LOCATION (insn);
1781 }
1782 /* If all else fails, simply return the current function location. */
1783 return DECL_SOURCE_LOCATION (current_function_decl);
1784}
1785
71343877
AM
1786/* Records that every statement in LOOP is executed I_BOUND times.
1787 REALISTIC is true if I_BOUND is expected to be close to the real number
1788 of iterations. UPPER is true if we are sure the loop iterates at most
1789 I_BOUND times. */
1790
1791void
1792record_niter_bound (struct loop *loop, double_int i_bound, bool realistic,
1793 bool upper)
1794{
1795 /* Update the bounds only when there is no previous estimation, or when the
1796 current estimation is smaller. */
1797 if (upper
1798 && (!loop->any_upper_bound
1799 || i_bound.ult (loop->nb_iterations_upper_bound)))
1800 {
1801 loop->any_upper_bound = true;
1802 loop->nb_iterations_upper_bound = i_bound;
1803 }
1804 if (realistic
1805 && (!loop->any_estimate
1806 || i_bound.ult (loop->nb_iterations_estimate)))
1807 {
1808 loop->any_estimate = true;
1809 loop->nb_iterations_estimate = i_bound;
1810 }
1811
1812 /* If an upper bound is smaller than the realistic estimate of the
1813 number of iterations, use the upper bound instead. */
1814 if (loop->any_upper_bound
1815 && loop->any_estimate
1816 && loop->nb_iterations_upper_bound.ult (loop->nb_iterations_estimate))
1817 loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
1818}
1819
1ef88893 1820/* Similar to get_estimated_loop_iterations, but returns the estimate only
71343877
AM
1821 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
1822 on the number of iterations of LOOP could not be derived, returns -1. */
1823
1824HOST_WIDE_INT
1ef88893 1825get_estimated_loop_iterations_int (struct loop *loop)
71343877
AM
1826{
1827 double_int nit;
1828 HOST_WIDE_INT hwi_nit;
1829
1830 if (!get_estimated_loop_iterations (loop, &nit))
1831 return -1;
1832
1833 if (!nit.fits_shwi ())
1834 return -1;
1835 hwi_nit = nit.to_shwi ();
1836
1837 return hwi_nit < 0 ? -1 : hwi_nit;
1838}
1839
1840/* Returns an upper bound on the number of executions of statements
1841 in the LOOP. For statements before the loop exit, this exceeds
1842 the number of execution of the latch by one. */
1843
1844HOST_WIDE_INT
1845max_stmt_executions_int (struct loop *loop)
1846{
1ef88893 1847 HOST_WIDE_INT nit = get_max_loop_iterations_int (loop);
71343877
AM
1848 HOST_WIDE_INT snit;
1849
1850 if (nit == -1)
1851 return -1;
1852
1853 snit = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) nit + 1);
1854
1855 /* If the computation overflows, return -1. */
1856 return snit < 0 ? -1 : snit;
1857}
1858
1859/* Sets NIT to the estimated number of executions of the latch of the
1860 LOOP. If we have no reliable estimate, the function returns false, otherwise
1861 returns true. */
1862
1863bool
1864get_estimated_loop_iterations (struct loop *loop, double_int *nit)
1865{
1866 /* Even if the bound is not recorded, possibly we can derrive one from
1867 profile. */
1868 if (!loop->any_estimate)
1869 {
1870 if (loop->header->count)
1871 {
1872 *nit = gcov_type_to_double_int
1873 (expected_loop_iterations_unbounded (loop) + 1);
1874 return true;
1875 }
1876 return false;
1877 }
1878
1879 *nit = loop->nb_iterations_estimate;
1880 return true;
1881}
1882
1883/* Sets NIT to an upper bound for the maximum number of executions of the
1884 latch of the LOOP. If we have no reliable estimate, the function returns
1885 false, otherwise returns true. */
1886
1887bool
1888get_max_loop_iterations (struct loop *loop, double_int *nit)
1889{
1890 if (!loop->any_upper_bound)
1891 return false;
1892
1893 *nit = loop->nb_iterations_upper_bound;
1894 return true;
1895}
1ef88893
AM
1896
1897/* Similar to get_max_loop_iterations, but returns the estimate only
1898 if it fits to HOST_WIDE_INT. If this is not the case, or the estimate
1899 on the number of iterations of LOOP could not be derived, returns -1. */
1900
1901HOST_WIDE_INT
1902get_max_loop_iterations_int (struct loop *loop)
1903{
1904 double_int nit;
1905 HOST_WIDE_INT hwi_nit;
1906
1907 if (!get_max_loop_iterations (loop, &nit))
1908 return -1;
1909
1910 if (!nit.fits_shwi ())
1911 return -1;
1912 hwi_nit = nit.to_shwi ();
1913
1914 return hwi_nit < 0 ? -1 : hwi_nit;
1915}
1916
4484a35a 1917/* Returns the loop depth of the loop BB belongs to. */
1ef88893 1918
4484a35a
AM
1919int
1920bb_loop_depth (const_basic_block bb)
1921{
1922 return bb->loop_father ? loop_depth (bb->loop_father) : 0;
1923}