Ok, fixed all the changes you mentioned. Here is the patch. Thanks,
Balaji V. Iyer. -----Original Message----- From: H.J. Lu [mailto:hjl.to...@gmail.com] Sent: Friday, September 09, 2011 11:54 AM To: Iyer, Balaji V Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH][Cilkplus] Patch to fix Template type inside cilk_for On Fri, Sep 9, 2011 at 8:37 AM, Iyer, Balaji V <balaji.v.i...@intel.com> wrote: > Here is a fixed patch with all the changes you have requested. diff --git a/gcc/ChangeLog.cilk b/gcc/ChangeLog.cilk index 8880b0a..299febb 100644 --- a/gcc/ChangeLog.cilk +++ b/gcc/ChangeLog.cilk @@ -2,6 +2,9 @@ * gimplify.c (gimplify_call_expr): Removed if (SPAWN_CALL_P (*expr)) statement. + * tree.c (walk_tree_1): Added "case CILK_FOR_STMT:". + * tree.h (CILK_FOR_VAR): Changed TREE_OPERAND(..., 4) to + TREE_OPERAND(..., 5). Please use a separate ChangeLog entry. + * g++.dg/cilk-plus/template_cilk_for_plus_equal.cpp: New. Likewise. 2011-09-06 Balaji V. Iyer <balaji.v.i...@intel.com> diff --git a/gcc/cp/ChangeLog.cilk b/gcc/cp/ChangeLog.cilk index b49f3bf..4c54dc6 100644 --- a/gcc/cp/ChangeLog.cilk +++ b/gcc/cp/ChangeLog.cilk @@ -1,3 +1,10 @@ +2011-09-08 Balaji V. Iyer <balaji.v.i...@intel.com> + + * cp-tree.h (FOR_SCOPE): Changed FOR_STMT_CHECK to FOR_STMT_CHECK2 + * cilk.c (check_incr): Added a check for variable entity name match, not just + var. Removed the assert to check if operand 0 is the variable. + (cp_extract_for_fields): Likewise. + Please limit to 72 columns. -- H.J.
diff --git a/gcc/ChangeLog.cilk b/gcc/ChangeLog.cilk index 8880b0a..aadf5da 100644 --- a/gcc/ChangeLog.cilk +++ b/gcc/ChangeLog.cilk @@ -1,7 +1,13 @@ +2011-09-09 Balaji V. Iyer <balaji.v.i...@intel.com> + + * tree.c (walk_tree_1): Added "case CILK_FOR_STMT:". + * tree.h (CILK_FOR_VAR): Changed TREE_OPERAND(..., 4) to + TREE_OPERAND(..., 5). + 2011-09-08 Balaji V. Iyer <balaji.v.i...@intel.com> - * gimplify.c (gimplify_call_expr): Removed if (SPAWN_CALL_P (*expr)) - statement. + * gimplify.c (gimplify_call_expr): Removed if + (SPAWN_CALL_P (*expr)) statement. 2011-09-06 Balaji V. Iyer <balaji.v.i...@intel.com> diff --git a/gcc/cp/ChangeLog.cilk b/gcc/cp/ChangeLog.cilk index b49f3bf..9e58fcd 100644 --- a/gcc/cp/ChangeLog.cilk +++ b/gcc/cp/ChangeLog.cilk @@ -1,3 +1,12 @@ +2011-09-08 Balaji V. Iyer <balaji.v.i...@intel.com> + + * cp-tree.h (FOR_SCOPE): Changed FOR_STMT_CHECK to + FOR_STMT_CHECK2 + * cilk.c (check_incr): Added a check for variable entity name + match, not just var. Removed the assert to check if operand 0 + is the variable. + (cp_extract_for_fields): Likewise. + 2011-09-07 Balaji V. Iyer <balaji.v.i...@intel.com> * parser.c (cp_parser_jump_statement): Removed "IN_CILK_FOR | " from diff --git a/gcc/cp/cilk.c b/gcc/cp/cilk.c index 139ec27..49af1d7 100644 --- a/gcc/cp/cilk.c +++ b/gcc/cp/cilk.c @@ -1024,17 +1024,18 @@ check_incr(tree var, tree arith_type, tree incr) if (TREE_CODE (incr) == MODIFY_EXPR) { modify = true; - if (TREE_OPERAND (incr, 0) != var) + if (TREE_OPERAND (incr, 0) != var + && DECL_NAME (TREE_OPERAND (incr, 0)) != DECL_NAME (var)) { error("Cilk for increment does not modify the loop variable.\n"); return false; } incr = TREE_OPERAND (incr, 1); incr_code = TREE_CODE (incr); - gcc_assert (TREE_OPERAND (incr, 0) == var); } - else if (TREE_OPERAND (incr, 0) != var) + else if (TREE_OPERAND (incr, 0) != var + && DECL_NAME (TREE_OPERAND (incr, 0)) != DECL_NAME (var)) { error ("Cilk for increment does not modify the loop variable."); return false; @@ -2589,7 +2590,6 @@ cp_extract_for_fields (struct cilk_for_desc *cfd, tree for_stmt) case MODIFY_EXPR: /* We don't get here unless the expression has the form (modify var (op var incr)) */ - gcc_assert (TREE_OPERAND (incr, 0) == var); incr = TREE_OPERAND (incr, 1); /* again, should have checked form of increment earlier */ if (TREE_CODE (incr) == PLUS_EXPR) @@ -2597,9 +2597,13 @@ cp_extract_for_fields (struct cilk_for_desc *cfd, tree for_stmt) tree op0 = TREE_OPERAND (incr, 0); tree op1 = TREE_OPERAND (incr, 1); - if (op0 == var) + /* if op0 is a pointer, then we should make sure the original + variable also works (e.g. if we declared as *i, then i++ is + acceptable) + */ + if (op0 == var || DECL_NAME (op0) == DECL_NAME (var)) incr = op1; - else if (op1 == var) + else if (op1 == var || DECL_NAME (op1) == DECL_NAME (var)) incr = op0; else gcc_unreachable (); @@ -2637,8 +2641,17 @@ cp_extract_for_fields (struct cilk_for_desc *cfd, tree for_stmt) tree op0 = TREE_OPERAND (incr, 0); tree op1 = TREE_OPERAND (incr, 1); - gcc_assert (op0 == var); - incr = op1; + /* if op0 is a pointer, then we should make sure the original + variable also works (e.g. if we declared as *i, then i++ is + acceptable) + */ + if (op0 == var || DECL_NAME (op0) == DECL_NAME (var)) + incr = op1; + else if (op1 == var || DECL_NAME (op1) == DECL_NAME (var)) + incr = op0; + else + gcc_unreachable (); + /* Store the amount to be subtracted. Negating it could overflow. */ negate_incr = true; diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index f33b7f4..a924b73 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3874,7 +3874,7 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) condition, update expression, and body of the for statement, respectively. */ /* bviyer: we need it in C, so I have defined them in tree.h */ -#define FOR_SCOPE(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 4) +#define FOR_SCOPE(NODE) TREE_OPERAND (FOR_STMT_CHECK2 (NODE), 4) #define FOR_STMT_PRAGMA_SIMD_INDEX(NODE) \ (FOR_STMT_CHECK(NODE)->base.pragma_simd_index) diff --git a/gcc/testsuite/ChangeLog.cilk b/gcc/testsuite/ChangeLog.cilk index 50da2a5..5301fff 100644 --- a/gcc/testsuite/ChangeLog.cilk +++ b/gcc/testsuite/ChangeLog.cilk @@ -1,3 +1,7 @@ +2011-09-09 Balaji V. Iyer <balaji.v.i...@intel.com> + + * g++.dg/cilk-plus/template_cilk_for_plus_equal.cpp: New. + 2011-09-08 Balaji V. Iyer <balaji.v.i...@intel.com> * gcc.dg/cilk-plus/label_test.c: New. diff --git a/gcc/testsuite/g++.dg/cilk-plus/template_cilk_for_plus_equal.cpp b/gcc/testsuite/g++.dg/cilk-plus/template_cilk_for_plus_equal.cpp new file mode 100644 index 0000000..8f22f5b --- /dev/null +++ b/gcc/testsuite/g++.dg/cilk-plus/template_cilk_for_plus_equal.cpp @@ -0,0 +1,36 @@ +#include <iostream> +#include <cilk/cilk.h> +#include <cstdlib> + +template <typename T> +void some_func(char *number) +{ + /* this shouldn't output an error */ + cilk_for (T i = 0; i < atoi (number); i += 1) + std::cout << "Test += " << std::endl; + + cilk_for (T j = atoi(number); j > 0 ; j -= 1) + std::cout << "Test -=" << std::endl; + + cilk_for (T k = 0; k < atoi (number); k++) + std::cout << "Test ++" << std::endl; + + cilk_for (T kk = atoi (number); kk > 0; kk--) + std::cout << "Test --" << std::endl; + + std::cout << std::endl; + return; +} + +int main(int argc, char **argv) +{ + if (argc == 1) + return -1; + + some_func<int>(argv[1]); + some_func<char>(argv[1]); + some_func<long>(argv[1]); + some_func<unsigned char>(argv[1]); + return 0; +} + diff --git a/gcc/tree.c b/gcc/tree.c index ac903e2..5cd21d2 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -10606,6 +10606,17 @@ walk_tree_1 (tree *tp, walk_tree_fn func, void *data, WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, len)); } + case CILK_FOR_STMT: + { + WALK_SUBTREE (CILK_FOR_INIT (*tp)); + WALK_SUBTREE (FOR_COND (*tp)); + WALK_SUBTREE (FOR_EXPR (*tp)); + WALK_SUBTREE (FOR_BODY (*tp)); + WALK_SUBTREE (CILK_FOR_GRAIN (*tp)); + WALK_SUBTREE (CILK_FOR_VAR (*tp)); + } + break; + case DECL_EXPR: /* If this is a TYPE_DECL, walk into the fields of the type that it's defining. We only want to walk into these fields of a type in this diff --git a/gcc/tree.h b/gcc/tree.h index 3a889ea..fec4164 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -6076,7 +6076,7 @@ extern bool block_may_fallthru (const_tree); #define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK2 (NODE), 3) /* Some cilk #defines */ -#define CILK_FOR_VAR(NODE) TREE_OPERAND (CILK_FOR_STMT_CHECK (NODE), 4) +#define CILK_FOR_VAR(NODE) TREE_OPERAND (CILK_FOR_STMT_CHECK (NODE), 5) #define CILK_FOR_INIT(NODE) TREE_OPERAND (CILK_FOR_STMT_CHECK (NODE), 0) #define CILK_FOR_GRAIN(NODE) TREE_OPERAND (CILK_FOR_STMT_CHECK (NODE), 6)