@@ -1,3 +1,13 @@
+2012-03-16 Balaji V. Iyer <balaji.v.iyer@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.iyer@intel.com>
* c-typeck.c (convert_arguments): Added array notation check for
@@ -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);
@@ -1,3 +1,11 @@
+2012-03-16 Balaji V. Iyer <balaji.v.iyer@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.iyer@intel.com>
* parser.c (cp_parser_compound_stmt): Added a check to see if the
@@ -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);
@@ -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;
}
@@ -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);
}
}
@@ -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;