aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/cp-gimplify.c
diff options
context:
space:
mode:
authorBalaji V. Iyer <balaji.v.iyer@intel.com>2015-09-02 23:59:21 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2015-09-02 16:59:21 -0700
commit3894284078b0eae1b32952b3347d611762066d6a (patch)
tree8307f0b414b207edca570b97f7da74a6050db019 /gcc/cp/cp-gimplify.c
parentd04ff41777d999fe5f387f46ec8b9cb22422c513 (diff)
downloadgcc-3894284078b0eae1b32952b3347d611762066d6a.zip
gcc-3894284078b0eae1b32952b3347d611762066d6a.tar.gz
gcc-3894284078b0eae1b32952b3347d611762066d6a.tar.bz2
Fix spawned function with lambda function
Make sure that the spawned function's arguments will not be pushed into lambda function. gcc/c-family/ 2015-09-02 Balaji V. Iyer <balaji.v.iyer@intel.com> PR middle-end/60586 * c-common.h (cilk_gimplify_call_params_in_spawned_fn): New prototype. * c-gimplify.c (c_gimplify_expr): Added a call to the function cilk_gimplify_call_params_in_spawned_fn. * cilk.c (cilk_gimplify_call_params_in_spawned_fn): New function. (gimplify_cilk_spawn): Removed EXPR_STMT and CLEANUP_POINT_EXPR unwrapping. gcc/cp/ 2015-09-02 Balaji V. Iyer <balaji.v.iyer@intel.com> PR middle-end/60586 * cp-gimplify.c (cilk_cp_gimplify_call_params_in_spawned_fn): New function. (cp_gimplify_expr): Added a call to the function cilk_cp_gimplify_call_params_in_spawned_fn. gcc/testsuite/ 2015-09-02 Balaji V. Iyer <balaji.v.iyer@intel.com> PR middle-end/60586 * c-c++-common/cilk-plus/CK/pr60586.c: New file. * g++.dg/cilk-plus/CK/pr60586.cc: Likewise. From-SVN: r227423
Diffstat (limited to 'gcc/cp/cp-gimplify.c')
-rw-r--r--gcc/cp/cp-gimplify.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index c36d339..5ab0604 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -95,6 +95,25 @@ finish_bc_block (tree *block, enum bc_t bc, tree label)
DECL_CHAIN (label) = NULL_TREE;
}
+/* This function is a wrapper for cilk_gimplify_call_params_in_spawned_fn.
+ *EXPR_P can be a CALL_EXPR, INIT_EXPR, MODIFY_EXPR, AGGR_INIT_EXPR or
+ TARGET_EXPR. *PRE_P and *POST_P are gimple sequences from the caller
+ of gimplify_cilk_spawn. */
+
+static void
+cilk_cp_gimplify_call_params_in_spawned_fn (tree *expr_p, gimple_seq *pre_p,
+ gimple_seq *post_p)
+{
+ int ii = 0;
+
+ cilk_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
+ if (TREE_CODE (*expr_p) == AGGR_INIT_EXPR)
+ for (ii = 0; ii < aggr_init_expr_nargs (*expr_p); ii++)
+ gimplify_expr (&AGGR_INIT_EXPR_ARG (*expr_p, ii), pre_p, post_p,
+ is_gimple_reg, fb_rvalue);
+}
+
+
/* Get the LABEL_EXPR to represent a break or continue statement
in the current block scope. BC indicates which. */
@@ -603,7 +622,10 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
if (fn_contains_cilk_spawn_p (cfun)
&& cilk_detect_spawn_and_unwrap (expr_p)
&& !seen_error ())
- return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
+ {
+ cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
+ return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
+ }
cp_gimplify_init_expr (expr_p);
if (TREE_CODE (*expr_p) != INIT_EXPR)
return GS_OK;
@@ -614,8 +636,10 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
if (fn_contains_cilk_spawn_p (cfun)
&& cilk_detect_spawn_and_unwrap (expr_p)
&& !seen_error ())
- return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
-
+ {
+ cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
+ return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
+ }
/* If the back end isn't clever enough to know that the lhs and rhs
types are the same, add an explicit conversion. */
tree op0 = TREE_OPERAND (*expr_p, 0);
@@ -715,14 +739,18 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
/* If errors are seen, then just process it as a CALL_EXPR. */
if (!seen_error ())
- return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
-
+ {
+ cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
+ return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
+ }
case CALL_EXPR:
if (fn_contains_cilk_spawn_p (cfun)
&& cilk_detect_spawn_and_unwrap (expr_p)
&& !seen_error ())
- return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
-
+ {
+ cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
+ return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
+ }
/* DR 1030 says that we need to evaluate the elements of an
initializer-list in forward order even when it's used as arguments to
a constructor. So if the target wants to evaluate them in reverse