aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-family/array-notation-common.c
diff options
context:
space:
mode:
authorBalaji V. Iyer <balaji.v.iyer@intel.com>2013-06-21 19:36:47 +0000
committerBalaji V. Iyer <bviyer@gcc.gnu.org>2013-06-21 12:36:47 -0700
commit2ce86d2eb54f42359291f388a833fa05b6f1bf19 (patch)
treee7207dc359e56d6ee18d5ceeab12e6a330340857 /gcc/c-family/array-notation-common.c
parentfa1e55b0a0c843b58c6e628fb3c29afa36fcf778 (diff)
downloadgcc-2ce86d2eb54f42359291f388a833fa05b6f1bf19.zip
gcc-2ce86d2eb54f42359291f388a833fa05b6f1bf19.tar.gz
gcc-2ce86d2eb54f42359291f388a833fa05b6f1bf19.tar.bz2
Implemented Cilk Plus Array Notation for C++
Implemented Cilk Plus Array Notation for C++ gcc/c-family/ChangeLog 2013-06-21 Balaji V. Iyer <balaji.v.iyer@intel.com> * c-common.h (struct cilkplus_an_parts): New structure. (struct cilkplus_an_loop_parts): Likewise. (cilkplus_extract_an_triplets): New prototype. (fix_sec_implicit_args): Likewise. * array-notation-common.c (cilkplus_extract_an_triplets): New function. (fix_sec_implicit_args): Likewise. gcc/cp/ChangeLog 2013-06-21 Balaji V. Iyer <balaji.v.iyer@intel.com> * call.c (convert_like_real): Added a check if array notation is present in expression. If so, then no conversion of arguments is necessary. (build_over_call): Likewise. * typeck.c (cp_build_function_call_vec): Likewise. (convert_for_assignment): Likewise. (cp_build_array_ref): Reject array notations with a rank greater than 1 as an array's index. (cp_build_binary_op): If array notations are preent in op, then call find_correct_array_notation_type. (cp_build_addr_expr_1): Handle ARRAY_NOTATION_REF similar to ARRAY_REF. * cp-array-notation.c: New file. * cp-objcp-common.c (cp_common_init_ts): Marked ARRAY_NOTATION_REF tree as typed. * cp-tree.h (fix_array_notation_exprs): New prototype. * semantics.c (finish_return_stmt): Reject array notations as return value. (cxx_eval_constant_expression): Added ARRAY_NOTATION_REF case. (potential_constant_expression_1): Likewise. * tree.c (lvalue_kind): Likewise. * error.c (dump_decl): Likewise. (dump_expr): Likewise. * pt.c (ARRAY_NOTATION_REF): Likewise. (type_unification_real): Do not unify any arguments if array notations are found in arg. (instantiate_decl): Added a check for array notaitons inside the function body. If so, then expand them. * parser.c (cp_parser_array_notation): New function. (cp_parser_postfix_open_square_expression): Added a check for colons inside square braces. If found, then handle the array access as an array notation access. Also, disable auto-correction from a single colon to scope when Cilk Plus is enabled. (cp_parser_compound_statement): Added a check for array notations inside the statement. If found, then expand them. (cp_parser_ctor_initializer_opt_and_function_body): Likewise. (cp_parser_function_definition_after_declarator): Likewise. (cp_parser_selection_statement): Searched for array notations inside condition. If so, then emit an error. (cp_parser_iteration_statement): Likewise. (cp_parser_direct_declarator): Reject array notations inside a variable or array declaration. * Make-lang.in (CXX_AND_OBJCXX_OBJS): Added cp/cp-array-notation.o. gcc/testsuite/ChangeLog 2013-06-21 Balaji V. Iyer <balaji.v.iyer@intel.com> * c-c++-common/cilk-plus/AN/array_test1.c: Make this an execution test. Also changed the returns from error as distinct values so that debugging can get easier. * c-c++-common/cilk-plus/AN/if_test_errors.c (main): Made certain errors specific to C, if necessary. Also added new error hooks for C++. * c-c++-common/cilk-plus/AN/misc.c (main): Likewise. * c-c++-common/cilk-plus/AN/parser_errors.c (main): Likewise. * c-c++-common/cilk-plus/AN/parser_errors2.c (main): Likewise. * c-c++-common/cilk-plus/AN/parser_errors3.c (main): Likewise. * c-c++-common/cilk-plus/AN/pr57541.c (main): Likewise. * c-c++-common/cilk-plus/AN/parser_errors4.c (main): In addition to the same changes as parser_errors3.c, spaces were added between colons to not confuse C++ compiler with 2 colons as scope. * c-c++-common/cilk-plus/AN/vla.c: Make this test C specific. * g++.dg/cilk-plus/AN/array_test1_tplt.cc: New test. * g++.dg/cilk-plus/AN/array_test2_tplt.cc: Likewise. * g++.dg/cilk-plus/AN/array_test_ND_tplt.cc: Likewise. * g++.dg/cilk-plus/AN/braced_list.cc: Likewise. * g++.dg/cilk-plus/AN/builtin_fn_custom_tplt.cc: Likewise. * g++.dg/cilk-plus/AN/builtin_fn_mutating_tplt.cc: Likewise. * g++.dg/cilk-plus/AN/fp_triplet_values_tplt.c: Likewise. * g++.dg/cilk-plus/AN/preincr_test.cc: Likewise. * g++.dg/cilk-plus/AN/postincr_test.cc: Likewise. * g++.dg/cilk-plus/cilk-plus.exp: New script. * gcc/testsuite/g++.dg/dg.exp: Included Cilk Plus C++ tests in the list. From-SVN: r200319
Diffstat (limited to 'gcc/c-family/array-notation-common.c')
-rw-r--r--gcc/c-family/array-notation-common.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/gcc/c-family/array-notation-common.c b/gcc/c-family/array-notation-common.c
index c82d7dc..0e2a431 100644
--- a/gcc/c-family/array-notation-common.c
+++ b/gcc/c-family/array-notation-common.c
@@ -560,3 +560,100 @@ find_correct_array_notation_type (tree op)
}
return return_type;
}
+
+/* Extracts all the array notation triplet information from LIST and stores
+ them in the following fields of the 2-D array NODE(size x rank):
+ START, LENGTH and STRIDE, holding the starting index, length, and stride,
+ respectively. In addition, it also sets two bool fields, IS_VECTOR and
+ COUNT_DOWN, in NODE indicating whether a certain value at a certain field
+ is a vector and if the array is accessed from high to low. */
+
+void
+cilkplus_extract_an_triplets (vec<tree, va_gc> *list, size_t size, size_t rank,
+ vec<vec<struct cilkplus_an_parts> > *node)
+{
+ vec<vec<tree> > array_exprs = vNULL;
+ struct cilkplus_an_parts init = { NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE,
+ false };
+ node->safe_grow_cleared (size);
+ array_exprs.safe_grow_cleared (size);
+ for (size_t ii = 0; ii < size; ii++)
+ for (size_t jj = 0; jj < rank; jj++)
+ {
+ (*node)[ii].safe_push (init);
+ array_exprs[ii].safe_push (NULL_TREE);
+ }
+
+ for (size_t ii = 0; ii < size; ii++)
+ {
+ size_t jj = 0;
+ tree ii_tree = (*list)[ii];
+ while (ii_tree)
+ if (TREE_CODE (ii_tree) == ARRAY_NOTATION_REF)
+ {
+ array_exprs[ii][jj] = ii_tree;
+ jj++;
+ ii_tree = ARRAY_NOTATION_ARRAY (ii_tree);
+ }
+ else if (TREE_CODE (ii_tree) == ARRAY_REF)
+ ii_tree = TREE_OPERAND (ii_tree, 0);
+ else if (TREE_CODE (ii_tree) == VAR_DECL
+ || TREE_CODE (ii_tree) == CALL_EXPR
+ || TREE_CODE (ii_tree) == PARM_DECL)
+ break;
+ else
+ gcc_unreachable ();
+ }
+ for (size_t ii = 0; ii < size; ii++)
+ if (TREE_CODE ((*list)[ii]) == ARRAY_NOTATION_REF)
+ for (size_t jj = 0; jj < rank; jj++)
+ if (TREE_CODE (array_exprs[ii][jj]) == 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));
+ }
+}
+
+/* Replaces all the __sec_implicit_arg functions in LIST with the induction
+ variable stored in VAR at the appropriate location pointed by the
+ __sec_implicit_arg's first parameter. Emits an error if the parameter is
+ not between 0 and RANK. */
+
+vec <tree, va_gc> *
+fix_sec_implicit_args (location_t loc, vec <tree, va_gc> *list,
+ vec<an_loop_parts> an_loop_info, size_t rank,
+ tree orig_stmt)
+{
+ vec <tree, va_gc> *array_operand = NULL;
+ for (size_t ii = 0; ii < vec_safe_length (list); ii++)
+ if (TREE_CODE ((*list)[ii]) == CALL_EXPR
+ && TREE_CODE (CALL_EXPR_FN ((*list)[ii])) == ADDR_EXPR
+ && is_sec_implicit_index_fn (CALL_EXPR_FN ((*list)[ii])))
+ {
+ int idx = extract_sec_implicit_index_arg (loc, (*list)[ii]);
+ if (idx < (int) rank && idx >= 0)
+ vec_safe_push (array_operand, an_loop_info[idx].var);
+ else if (idx == -1)
+ /* In this case, the returning function would have emitted an
+ error thus it is not necessary to do so again. */
+ return NULL;
+ else
+ {
+ error_at (loc, "__sec_implicit_index argument %d must be "
+ "less than the rank of %qE", idx, orig_stmt);
+ return NULL;
+ }
+ }
+ else
+ /* Save the existing value into the array operand. */
+ vec_safe_push (array_operand, (*list)[ii]);
+ return array_operand;
+}