Hello Everyone,
   This patch is for the Cilkplus branch, mainly affecting the C++ compiler. 
This patch will fix a bug when spawn is used inside template functions.

Thanks,

Balaji V. Iyer.
diff --git a/gcc/ChangeLog.cilk b/gcc/ChangeLog.cilk
index 3667c75..f1935d2 100644
--- a/gcc/ChangeLog.cilk
+++ b/gcc/ChangeLog.cilk
@@ -1,3 +1,13 @@
+2012-03-16  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
+       * cilk-spawn.c (cilk_valid_spawn): Unwrapped the call_expr from expr
+       and cleanup point statements.
+       (gimplify_cilk_spawn): Likewise.
+       * function.c (allocate_struct_function): Initialized calls_spawns
+       correctly.
+       * tree.h: Removed cilk_hyper_flag and replaced with cilk_has_spawn.
+       Also added DECL_HAS_SPAWN_P and removed DECL_HYPER_LOOKUP_P.
+
 2012-03-12  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
        * c-typeck.c (convert_arguments): Added array notation check for
diff --git a/gcc/cilk-spawn.c b/gcc/cilk-spawn.c
index 3ba1051..3a29250 100644
--- a/gcc/cilk-spawn.c
+++ b/gcc/cilk-spawn.c
@@ -295,6 +295,10 @@ cilk_valid_spawn (tree exp0)
   if (exp == NULL_TREE)
     return false; /* happens with C++ TARGET_EXPR */
 
+  while (TREE_CODE (exp) == CLEANUP_POINT_EXPR
+        || TREE_CODE (exp) == EXPR_STMT)
+    exp = TREE_OPERAND (exp, 0);
+  
   /* Now we have a call, or this isn't a valid spawn. */
   /* XXX This will reject any outer non-spawn AGGR_INIT_EXPR
      that is valid because of a spawn inside.  Are there any
@@ -394,7 +398,11 @@ gimplify_cilk_spawn (tree *spawn_p, gimple_seq *before 
ATTRIBUTE_UNUSED,
       *spawn_p = build_empty_stmt (UNKNOWN_LOCATION);
       return;
     }
-
+  /* Remove cleanup point expr and expr stmt from *spawn_p */
+  while (TREE_CODE (expr) == CLEANUP_POINT_EXPR
+        || TREE_CODE (expr) == EXPR_STMT)
+    expr = TREE_OPERAND (expr, 0);
+  
   new_args = NULL;
   function = build_cilk_wrapper (expr, &new_args);
 
diff --git a/gcc/cp/ChangeLog.cilk b/gcc/cp/ChangeLog.cilk
index 28bd0e1..0970089 100644
--- a/gcc/cp/ChangeLog.cilk
+++ b/gcc/cp/ChangeLog.cilk
@@ -1,3 +1,11 @@
+2012-03-16  Balaji V. Iyer  <balaji.v.i...@intel.com>
+
+       * decl.c (finish_function_body): called DECL_HAS_SPAWN_P and set it to
+       calls_spawns.
+       * pt.c (tsubst_copy): Carried the spawn call information from one
+       call expression to another.
+       (tsubst_copy_and_build): Likewise.
+       
 2012-02-14  Balaji V. Iyer  <balaji.v.i...@intel.com>
 
        * parser.c (cp_parser_compound_stmt): Added a check to see if the
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5b67c6d..71dfc8e 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -13402,6 +13402,7 @@ finish_function_body (tree compstmt)
 
   if (cfun->calls_spawn)
     cfun->cilk_frame_decl = cp_make_cilk_frame ();
+  DECL_HAS_SPAWN_P (cfun->decl) = cfun->calls_spawn;
 
   /* Close the block.  */
   finish_compound_stmt (compstmt);
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 9fb8573..5ca8aa7 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12383,6 +12383,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t 
complain, tree in_decl)
        for (i = 0; i < n; i++)
          TREE_OPERAND (t, i) = tsubst_copy (TREE_OPERAND (t, i), args,
                                             complain, in_decl);
+       SPAWN_CALL_P (result) = SPAWN_CALL_P (t);
        return result;
       }
 
@@ -13901,7 +13902,7 @@ tsubst_copy_and_build (tree t,
                                              in_decl,
                                              !qualified_p,
                                              integral_constant_expression_p);
-
+           SPAWN_CALL_P (function) = SPAWN_CALL_P (t);
            if (BASELINK_P (function))
              qualified_p = true;
          }
diff --git a/gcc/function.c b/gcc/function.c
index ed07a83..a8acd39 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4420,6 +4420,7 @@ allocate_struct_function (tree fndecl, bool abstract_p)
       cfun->can_throw_non_call_exceptions = flag_non_call_exceptions;
 
       cfun->elem_fn_already_cloned = false;
+      cfun->calls_spawn = DECL_HAS_SPAWN_P (fndecl);
     }
 }
 
diff --git a/gcc/tree.h b/gcc/tree.h
index 1d4b18c..b204e30 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -3564,8 +3564,8 @@ struct GTY(())
 
 /* In a FUNCTION_DECL for a Cilk function, indicates that the
    function is a hyperobject lookup. */
-#define DECL_HYPER_LOOKUP_P(NODE)                              \
-  (FUNCTION_DECL_CHECK (NODE)->function_decl.cilk_hyper_flag)
+#define DECL_HAS_SPAWN_P(NODE) \
+  (FUNCTION_DECL_CHECK (NODE)->function_decl.cilk_has_spawn)
 
 /* In a FUNCTION_DECL with a nonzero DECL_CONTEXT, indicates that
    the static chain is an explicit argument.  */
@@ -3573,8 +3573,6 @@ struct GTY(())
   (FUNCTION_DECL_CHECK (NODE)->function_decl.explicit_static_chain_flag)
 
 
-
-
 /* In a FUNCTION_DECL indicates that a static chain is needed.  */
 #define DECL_STATIC_CHAIN(NODE) \
   (FUNCTION_DECL_CHECK (NODE)->function_decl.regdecl_flag)
@@ -3707,7 +3705,7 @@ struct GTY(()) tree_function_decl {
   unsigned looping_const_or_pure_flag : 1;
   unsigned has_debug_args_flag : 1;
   unsigned cilk_knot_type : 2;
-  unsigned cilk_hyper_flag : 1;
+  unsigned cilk_has_spawn : 1;
   signed int kills_registers : DECL_KILLS_REGISTERS_BITS;
   unsigned tm_clone_flag : 1;
 

Reply via email to