On 06/28/2013 12:54 AM, Iyer, Balaji V wrote:
/* If stride and start are of same type and the induction var
is not, convert induction variable to stride's type. */
if (TREE_TYPE (start) == TREE_TYPE (stride)
&& TREE_TYPE (stride) != TREE_TYPE (var))
{
st = start;
str = stride;
v = build_c_cast (loc, TREE_TYPE (str), var);
}
else if (TREE_TYPE (start) != TREE_TYPE (stride))
{
/* If we reach here, then the stride and start are of
different types, and so it doesn't really matter what
the induction variable type is, convert everything to
integer. The reason why we pick an integer
instead of something like size_t is because the stride
and length can be + or -. */
st = build_c_cast (loc, ptrdiff_type_node, start);
str = build_c_cast (loc, ptrdiff_type_node, stride);
v = build_c_cast (loc, ptrdiff_type_node, var);
}
else
{
st = start;
str = stride;
v = var;
}
I still think that what you want is to unconditionally convert start and
stride to ptrdiff_t, either here or in build_array_notation_ref.
+ tree ii_tree = array_exprs[ii][jj];
+ (*node)[ii][jj].is_vector = true;
+ (*node)[ii][jj].value = ARRAY_NOTATION_ARRAY (ii_tree);
+ (*node)[ii][jj].start = ARRAY_NOTATION_START (ii_tree);
+ (*node)[ii][jj].length =
+ fold_build1 (CONVERT_EXPR, integer_type_node,
+ ARRAY_NOTATION_LENGTH (ii_tree));
+ (*node)[ii][jj].stride =
+ fold_build1 (CONVERT_EXPR, integer_type_node,
+ ARRAY_NOTATION_STRIDE (ii_tree));
I still don't understand what the purpose of cilkplus_an_parts is; it
seems to have exactly the same information as the ARRAY_NOTATION_REF, so
you might as well keep the array of ARRAY_NOTATION_REF instead of
copying it into an array of cilkplus_an_parts.
+ stride = RECUR (ARRAY_NOTATION_STRIDE (t));
+ if (!cilkplus_an_triplet_types_ok_p (loc, start_index, length, stride,
+ TREE_TYPE (op1)))
+ RETURN (error_mark_node);
You don't need to check the triplet types in tsubst, since you're
checking them in build_array_notation_ref.
Jason