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 2, or (at your option) any later
+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
for more details.
You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA. */
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
#include "config.h"
#include "system.h"
sbitmap_free (headers);
loops->exits = NULL;
- loops->state = 0;
return VEC_length (loop_p, loops->larray);
}
/* Return nonzero if basic block BB belongs to LOOP. */
bool
-flow_bb_inside_loop_p (const struct loop *loop, const basic_block bb)
+flow_bb_inside_loop_p (const struct loop *loop, const_basic_block bb)
{
struct loop *source_loop;
/* Enumeration predicate for get_loop_body_with_size. */
static bool
-glb_enum_p (basic_block bb, void *glb_loop)
+glb_enum_p (const_basic_block bb, const void *glb_loop)
{
- struct loop *loop = (struct loop *) glb_loop;
+ const struct loop *const loop = (const struct loop *) glb_loop;
return (bb != loop->header
&& dominated_by_p (CDI_DOMINATORS, bb, loop->header));
}
unsigned max_size)
{
return dfs_enumerate_from (loop->header, 1, glb_enum_p,
- body, max_size, (void *) loop);
+ body, max_size, loop);
}
/* Gets basic blocks of a LOOP. Header is the 0-th block, rest is in dfs
static hashval_t
loop_exit_hash (const void *ex)
{
- struct loop_exit *exit = (struct loop_exit *) ex;
+ const struct loop_exit *const exit = (const struct loop_exit *) ex;
return htab_hash_pointer (exit->e);
}
static int
loop_exit_eq (const void *ex, const void *e)
{
- struct loop_exit *exit = (struct loop_exit *) ex;
+ const struct loop_exit *const exit = (const struct loop_exit *) ex;
return exit->e == e;
}
struct loop_exit *exits = NULL, *exit;
struct loop *aloop, *cloop;
- if ((current_loops->state & LOOPS_HAVE_RECORDED_EXITS) == 0)
+ if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
return;
if (!removed
if (!current_loops)
return;
- if (current_loops->state & LOOPS_HAVE_RECORDED_EXITS)
+ if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
return;
- current_loops->state |= LOOPS_HAVE_RECORDED_EXITS;
+ loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
gcc_assert (current_loops->exits == NULL);
current_loops->exits = htab_create_alloc (2 * number_of_loops (),
void
release_recorded_exits (void)
{
- gcc_assert (current_loops->state & LOOPS_HAVE_RECORDED_EXITS);
+ gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS));
htab_delete (current_loops->exits);
current_loops->exits = NULL;
- current_loops->state &= ~LOOPS_HAVE_RECORDED_EXITS;
+ loops_state_clear (LOOPS_HAVE_RECORDED_EXITS);
}
/* Returns the list of the exit edges of a LOOP. */
/* If we maintain the lists of exits, use them. Otherwise we must
scan the body of the loop. */
- if (current_loops->state & LOOPS_HAVE_RECORDED_EXITS)
+ if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
{
for (exit = loop->exits->next; exit->e; exit = exit->next)
VEC_safe_push (edge, heap, edges, exit->e);
{
i = loop->num;
- if ((current_loops->state & LOOPS_HAVE_PREHEADERS)
+ if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
&& EDGE_COUNT (loop->header->preds) != 2)
{
error ("loop %d's header does not have exactly 2 entries", i);
err = 1;
}
- if (current_loops->state & LOOPS_HAVE_SIMPLE_LATCHES)
+ if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
{
if (!single_succ_p (loop->latch))
{
error ("loop %d's header does not belong directly to it", i);
err = 1;
}
- if ((current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
+ if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
&& (loop_latch_edge (loop)->flags & EDGE_IRREDUCIBLE_LOOP))
{
error ("loop %d's latch is marked as part of irreducible region", i);
}
/* Check irreducible loops. */
- if (current_loops->state & LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
+ if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
{
/* Record old info. */
irreds = sbitmap_alloc (last_basic_block);
}
}
- if ((current_loops->state & LOOPS_HAVE_RECORDED_EXITS) == 0)
+ if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
{
if (loop->exits->next != loop->exits)
{
}
}
- if (current_loops->state & LOOPS_HAVE_RECORDED_EXITS)
+ if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
{
unsigned n_exits = 0, eloops;
edge e;
edge_iterator ei;
- gcc_assert ((current_loops->state & LOOPS_HAVE_PREHEADERS) != 0);
+ gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS));
FOR_EACH_EDGE (e, ei, loop->header->preds)
if (e->src != loop->latch)
/* Returns true if E is an exit of LOOP. */
bool
-loop_exit_edge_p (const struct loop *loop, edge e)
+loop_exit_edge_p (const struct loop *loop, const_edge e)
{
return (flow_bb_inside_loop_p (loop, e->src)
&& !flow_bb_inside_loop_p (loop, e->dest));
{
struct loop_exit *exit = loop->exits->next;
- if ((current_loops->state & LOOPS_HAVE_RECORDED_EXITS) == 0)
+ if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
return NULL;
if (exit->e && exit->next == loop->exits)