#include "tm.h"
#include "tree.h"
-#include "diagnostic.h"
#include "tree-pretty-print.h"
#include "gimple-pretty-print.h"
#include "basic-block.h"
as necessary. */
static sbitmap processed;
-/* Vector indicating that last_stmt if a basic block has already been
- marked as necessary. */
+/* Vector indicating that the last statement of a basic block has already
+ been marked as necessary. */
static sbitmap last_stmt_necessary;
/* Vector indicating that BB contains statements that are live. */
/* If STMT is not already marked necessary, mark it, and add it to the
worklist if ADD_TO_WORKLIST is true. */
+
static inline void
mark_stmt_necessary (gimple stmt, bool add_to_worklist)
{
}
-/* Make corresponding control dependent edges necessary. We only
- have to do this once for each basic block, so we clear the bitmap
- after we're done.
+/* Mark the last statement of BB as necessary. */
+
+static void
+mark_last_stmt_necessary (basic_block bb)
+{
+ gimple stmt = last_stmt (bb);
+
+ SET_BIT (last_stmt_necessary, bb->index);
+ SET_BIT (bb_contains_live_stmts, bb->index);
+
+ /* We actually mark the statement only if it is a control statement. */
+ if (stmt && is_ctrl_stmt (stmt))
+ mark_stmt_necessary (stmt, true);
+}
+
+
+/* Mark control dependent edges of BB as necessary. We have to do this only
+ once for each basic block so we set the appropriate bit after we're done.
+
+ When IGNORE_SELF is true, ignore BB in the list of control dependences. */
- When IGNORE_SELF it true, ignore BB from the list of control dependences. */
static void
-mark_control_dependent_edges_necessary (basic_block bb, struct edge_list *el, bool ignore_self)
+mark_control_dependent_edges_necessary (basic_block bb, struct edge_list *el,
+ bool ignore_self)
{
bitmap_iterator bi;
unsigned edge_number;
EXECUTE_IF_CONTROL_DEPENDENT (bi, bb->index, edge_number)
{
- gimple stmt;
basic_block cd_bb = INDEX_EDGE_PRED_BB (el, edge_number);
if (ignore_self && cd_bb == bb)
continue;
}
- if (TEST_BIT (last_stmt_necessary, cd_bb->index))
- continue;
- SET_BIT (last_stmt_necessary, cd_bb->index);
- SET_BIT (bb_contains_live_stmts, cd_bb->index);
-
- stmt = last_stmt (cd_bb);
- if (stmt && is_ctrl_stmt (stmt))
- mark_stmt_necessary (stmt, true);
+ if (!TEST_BIT (last_stmt_necessary, cd_bb->index))
+ mark_last_stmt_necessary (cd_bb);
}
+
if (!skipped)
SET_BIT (visited_control_parents, bb->index);
}
gimple_stmt_iterator gsi;
edge e;
gimple phi, stmt;
+ int flags;
FOR_EACH_BB (bb)
{
/* Pure and const functions are finite and thus have no infinite loops in
them. */
- if ((TREE_READONLY (current_function_decl)
- || DECL_PURE_P (current_function_decl))
- && !DECL_LOOPING_CONST_OR_PURE_P (current_function_decl))
+ flags = flags_from_decl_or_type (current_function_decl);
+ if ((flags & (ECF_CONST|ECF_PURE)) && !(flags & ECF_LOOPING_CONST_OR_PURE))
return;
/* Prevent the empty possibly infinite loops from being removed. */
{
while (handled_component_p (ref))
ref = TREE_OPERAND (ref, 0);
+ if (TREE_CODE (ref) == MEM_REF
+ && TREE_CODE (TREE_OPERAND (ref, 0)) == ADDR_EXPR)
+ ref = TREE_OPERAND (TREE_OPERAND (ref, 0), 0);
return !(DECL_P (ref)
&& !may_be_aliased (ref));
}
if (aggressive)
{
- /* Mark the last statements of the basic blocks that the block
- containing STMT is control dependent on, but only if we haven't
+ /* Mark the last statement of the basic blocks on which the block
+ containing STMT is control dependent, but only if we haven't
already done so. */
basic_block bb = gimple_bb (stmt);
if (bb != ENTRY_BLOCK_PTR
- && ! TEST_BIT (visited_control_parents, bb->index))
+ && !TEST_BIT (visited_control_parents, bb->index))
mark_control_dependent_edges_necessary (bb, el, false);
}
!= get_immediate_dominator (CDI_POST_DOMINATORS, arg_bb))
{
if (!TEST_BIT (last_stmt_necessary, arg_bb->index))
- {
- gimple stmt2;
- SET_BIT (last_stmt_necessary, arg_bb->index);
- SET_BIT (bb_contains_live_stmts, arg_bb->index);
-
- stmt2 = last_stmt (arg_bb);
- if (stmt2 && is_ctrl_stmt (stmt2))
- mark_stmt_necessary (stmt2, true);
- }
+ mark_last_stmt_necessary (arg_bb);
}
else if (arg_bb != ENTRY_BLOCK_PTR
- && ! TEST_BIT (visited_control_parents, arg_bb->index))
+ && !TEST_BIT (visited_control_parents,
+ arg_bb->index))
mark_control_dependent_edges_necessary (arg_bb, el, true);
}
}
struct edge_list *el = NULL;
bool something_changed = 0;
+ calculate_dominance_info (CDI_DOMINATORS);
+
/* Preheaders are needed for SCEV to work.
Simple lateches and recorded exits improve chances that loop will
proved to be finite in testcases such as in loop-15.c and loop-24.c */