> +/* Returns true if there is a length mismatch among exprssions that are at
> the
> + same dimension and one the same side of the equal sign. The Array
> notation
> + lengths (LIST) is passed in as a 2D vector of trees. */
> +
> +static bool
> +cp_length_mismatch_in_expr_p (location_t loc, vec<vec<tree> >list)
Other than working on a vec<>, how does this differ from the
length_mismatch_in_expr_p (location_t loc, tree **list, size_t x, size_t y)
in c-family?
> +static inline void
> +clear_all_an_vectors (vec <vec<tree> > *value, vec<vec<tree> > *start,
> + vec <vec<tree> > *length, vec<vec<tree> > *stride,
> + vec<vec<bool> > *is_vector, vec<vec<bool> > *count_down,
> + vec<tree> *incr, vec<tree> *cmp, vec<tree> *ind_init,
> + vec<tree> *var)
> +{
> + value->release ();
> + start->release ();
> + length->release ();
> + stride->release ();
> + is_vector->release ();
> + count_down->release ();
> + incr->release ();
> + cmp->release ();
> + ind_init->release ();
> + var->release ();
> +}
10 arrays kept in sync? It's at this point that we should realize that there's
a mistake in how we're arranging the data. This should be one array, with the
element being a structure.
That should significantly improve quite a lot of the functions in this file.
> + init = ARITHMETIC_TYPE_P (new_var_type) ? build_zero_cst (new_var_type)
> + : integer_zero_node;
Why the test for ARITHMETIC_TYPE_P? Surely we always want something of
new_var_type.
> + if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ADD
> + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MUL)
> + new_expr = build_x_modify_expr (location, *new_var, code, func_parm,
> + tf_warning_or_error);
> + if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO
> + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_NONZERO
> + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO
> + || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO)
Why not another switch statement here?
r~