#include "hashtab.h"
#include "tree-pass.h"
#include "diagnostic-core.h"
+#include "params.h"
/* This implements the pass that does predicate aware warning on uses of
possibly uninitialized variables. The pass first collects the set of
/* Computes the control dependence chains (paths of edges)
for DEP_BB up to the dominating basic block BB (the head node of a
- chain should be dominated by it). CD_CHAINS is pointer to a
- dynamic array holding the result chains. CUR_CD_CHAIN is the current
+ chain should be dominated by it). CD_CHAINS is pointer to an
+ array holding the result chains. CUR_CD_CHAIN is the current
chain being computed. *NUM_CHAINS is total number of chains. The
function returns true if the information is successfully computed,
return false if there is no control dependence or not computed. */
compute_control_dep_chain (basic_block bb, basic_block dep_bb,
vec<edge> *cd_chains,
size_t *num_chains,
- vec<edge> *cur_cd_chain)
+ vec<edge> *cur_cd_chain,
+ int *num_calls)
{
edge_iterator ei;
edge e;
if (EDGE_COUNT (bb->succs) < 2)
return false;
+ if (*num_calls > PARAM_VALUE (PARAM_UNINIT_CONTROL_DEP_ATTEMPTS))
+ return false;
+ ++*num_calls;
+
/* Could use a set instead. */
cur_chain_len = cur_cd_chain->length ();
if (cur_chain_len > MAX_CHAIN_LEN)
/* Now check if DEP_BB is indirectly control dependent on BB. */
if (compute_control_dep_chain (cd_bb, dep_bb, cd_chains,
- num_chains, cur_cd_chain))
+ num_chains, cur_cd_chain, num_calls))
{
found_cd_chain = true;
break;
basic_block use_bb)
{
size_t num_chains = 0, i;
- vec<edge> *dep_chains = 0;
- vec<edge> cur_chain = vNULL;
+ int num_calls = 0;
+ vec<edge> dep_chains[MAX_NUM_CHAINS];
+ auto_vec<edge, MAX_CHAIN_LEN + 1> cur_chain;
bool has_valid_pred = false;
basic_block cd_root = 0;
- typedef vec<edge> vec_edge_heap;
- dep_chains = XCNEWVEC (vec_edge_heap, MAX_NUM_CHAINS);
-
/* First find the closest bb that is control equivalent to PHI_BB
that also dominates USE_BB. */
cd_root = phi_bb;
break;
}
- compute_control_dep_chain (cd_root, use_bb,
- dep_chains, &num_chains,
- &cur_chain);
+ compute_control_dep_chain (cd_root, use_bb, dep_chains, &num_chains,
+ &cur_chain, &num_calls);
has_valid_pred
- = convert_control_dep_chain_into_preds (dep_chains,
- num_chains,
- preds);
- /* Free individual chain */
- cur_chain.release ();
+ = convert_control_dep_chain_into_preds (dep_chains, num_chains, preds);
for (i = 0; i < num_chains; i++)
dep_chains[i].release ();
- free (dep_chains);
return has_valid_pred;
}
find_def_preds (pred_chain_union *preds, gimple phi)
{
size_t num_chains = 0, i, n;
- vec<edge> *dep_chains = 0;
- vec<edge> cur_chain = vNULL;
+ vec<edge> dep_chains[MAX_NUM_CHAINS];
+ auto_vec<edge, MAX_CHAIN_LEN + 1> cur_chain;
vec<edge> def_edges = vNULL;
bool has_valid_pred = false;
basic_block phi_bb, cd_root = 0;
pointer_set_t *visited_phis;
- typedef vec<edge> vec_edge_heap;
- dep_chains = XCNEWVEC (vec_edge_heap, MAX_NUM_CHAINS);
-
phi_bb = gimple_bb (phi);
/* First find the closest dominating bb to be
the control dependence root */
for (i = 0; i < n; i++)
{
size_t prev_nc, j;
+ int num_calls = 0;
edge opnd_edge;
opnd_edge = def_edges[i];
prev_nc = num_chains;
- compute_control_dep_chain (cd_root, opnd_edge->src,
- dep_chains, &num_chains,
- &cur_chain);
- /* Free individual chain */
- cur_chain.release ();
+ compute_control_dep_chain (cd_root, opnd_edge->src, dep_chains,
+ &num_chains, &cur_chain, &num_calls);
/* Now update the newly added chains with
the phi operand edge: */
if (EDGE_COUNT (opnd_edge->src->succs) > 1)
{
- if (prev_nc == num_chains
- && num_chains < MAX_NUM_CHAINS)
- num_chains++;
+ if (prev_nc == num_chains && num_chains < MAX_NUM_CHAINS)
+ dep_chains[num_chains++] = vNULL;
for (j = prev_nc; j < num_chains; j++)
- {
- dep_chains[j].safe_push (opnd_edge);
- }
+ dep_chains[j].safe_push (opnd_edge);
}
}
has_valid_pred
- = convert_control_dep_chain_into_preds (dep_chains,
- num_chains,
- preds);
+ = convert_control_dep_chain_into_preds (dep_chains, num_chains, preds);
for (i = 0; i < num_chains; i++)
dep_chains[i].release ();
- free (dep_chains);
return has_valid_pred;
}