Hello Everyone, This patch is for the Cilkplus branch affecting both C and C++ compilers. This patch will fix the ICE when the user uses the -flto flag.
Thanks, Balaji V. Iyer.
Index: gcc/tree.h =================================================================== --- gcc/tree.h (revision 188669) +++ gcc/tree.h (working copy) @@ -342,6 +342,7 @@ NOT_BUILT_IN = 0, BUILT_IN_FRONTEND, BUILT_IN_MD, + BUILT_IN_CILK, BUILT_IN_NORMAL }; @@ -3680,7 +3681,7 @@ ??? The bitfield needs to be able to hold all target function codes as well. */ ENUM_BITFIELD(built_in_function) function_code : 11; - ENUM_BITFIELD(built_in_class) built_in_class : 2; + ENUM_BITFIELD(built_in_class) built_in_class : 3; unsigned static_ctor_flag : 1; unsigned static_dtor_flag : 1; Index: gcc/builtins.def =================================================================== --- gcc/builtins.def (revision 188669) +++ gcc/builtins.def (working copy) @@ -149,6 +149,11 @@ DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE, \ true, true, true, ATTRS, false, flag_tm) +#undef DEF_CILK_BUILTIN_STUB +#define DEF_CILK_BUILTIN_STUB(ENUM, NAME) \ + DEF_BUILTIN (ENUM, NAME, BUILT_IN_CILK, BT_LAST, BT_LAST, false, false, \ + false, ATTR_LAST, false, false) + /* Define an attribute list for math functions that are normally "impure" because some of them may write into global memory for `errno'. If !flag_errno_math they are instead "const". */ @@ -802,38 +807,39 @@ DEF_BUILTIN_STUB (BUILT_IN_EH_COPY_VALUES, "__builtin_eh_copy_values") /* Cilk */ -DEF_BUILTIN_STUB(BUILT_IN_CILK_WORKER_ID, "__cilkrts_current_worker_id") -DEF_BUILTIN_STUB(BUILT_IN_CILK_WORKER_PTR, "__cilkrts_current_worker") -DEF_BUILTIN_STUB(BUILT_IN_CILK_DETACH, "__cilkrts_detach") -DEF_BUILTIN_STUB(BUILT_IN_CILK_SYNCHED, "__cilkrts_synched") -DEF_BUILTIN_STUB(BUILT_IN_CILK_STOLEN, "__cilkrts_was_stolen") -DEF_BUILTIN_STUB(BUILT_IN_CILK_ENTER_FRAME, "__cilkrts_enter_frame") -DEF_BUILTIN_STUB(BUILT_IN_CILK_POP_FRAME, "__cilkrts_pop_frame") -DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_BEGIN, "__cilk_enter_begin") -DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_H_BEGIN, "__cilk_enter_helper_begin") -DEF_BUILTIN_STUB (BUILT_IN_CILK_ENTER_END, "__cilk_enter_end") -DEF_BUILTIN_STUB (BUILT_IN_CILK_SPAWN_PREPARE, "__cilk_spawn_prepare") -DEF_BUILTIN_STUB (BUILT_IN_SPAWN_OR_CONT, "__cilk_spawn_or_continue") -DEF_BUILTIN_STUB (BUILT_IN_CILK_DETACH_BEGIN, "__cilk_detach_begin") -DEF_BUILTIN_STUB (BUILT_IN_CILK_DETACH_END, "__cilk_detach_end") -DEF_BUILTIN_STUB (BUILT_IN_CILK_SYNC_BEGIN, "__cilk_sync_begin") -DEF_BUILTIN_STUB (BUILT_IN_CILK_SYNC_END, "__cilk_sync_end") -DEF_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_BEGIN, "__cilk_leave_begin") -DEF_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_END, "__cilk_leave_end") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_METACALL, "cilkscreen_metacall") -DEF_BUILTIN_STUB (BUILT_IN_CILK_RESUME, "cilk_resume") -DEF_BUILTIN_STUB (BUILT_IN_LEAVE_STOLEN, "cilk_leave_stolen") -DEF_BUILTIN_STUB (BUILT_IN_SYNC_ABANDON, "cilk_sync_abandon") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_EN_INSTR, +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_WORKER_ID, "__cilkrts_current_worker_id") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_WORKER_PTR, "__cilkrts_current_worker") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_DETACH, "__cilkrts_detach") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_SYNCHED, "__cilkrts_synched") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_STOLEN, "__cilkrts_was_stolen") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_ENTER_FRAME, "__cilkrts_enter_frame") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_LEAVE_FRAME, "__cilkrts_leave_frame") +DEF_CILK_BUILTIN_STUB(BUILT_IN_CILK_POP_FRAME, "__cilkrts_pop_frame") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_ENTER_BEGIN, "__cilk_enter_begin") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_ENTER_H_BEGIN, "__cilk_enter_helper_begin") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_ENTER_END, "__cilk_enter_end") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_SPAWN_PREPARE, "__cilk_spawn_prepare") +DEF_CILK_BUILTIN_STUB (BUILT_IN_SPAWN_OR_CONT, "__cilk_spawn_or_continue") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_DETACH_BEGIN, "__cilk_detach_begin") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_DETACH_END, "__cilk_detach_end") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_SYNC_BEGIN, "__cilk_sync_begin") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_SYNC_END, "__cilk_sync_end") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_BEGIN, "__cilk_leave_begin") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_LEAVE_END, "__cilk_leave_end") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_METACALL, "cilkscreen_metacall") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILK_RESUME, "cilk_resume") +DEF_CILK_BUILTIN_STUB (BUILT_IN_LEAVE_STOLEN, "cilk_leave_stolen") +DEF_CILK_BUILTIN_STUB (BUILT_IN_SYNC_ABANDON, "cilk_sync_abandon") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_EN_INSTR, "cilkscreen_enable_instrumentation") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DS_INSTR, +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DS_INSTR, "cilkscreen_disable_instrumentation") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DS_CHK, "cilkscreen_disable_checking") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_EN_CHK, "cilkscreen_enable_checking") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_AQUIRE_LOCK, "cilkscreen_aquire_lock") -DEF_BUILTIN_STUB (BUILT_IN_CILKSCREEN_REL_LOCK, "cilkscreen_release_lock") -DEF_BUILTIN_STUB (BUILT_IN_NOTIFY_ZC_INTRINSIC, "__notify_zc_intrinsic") -DEF_BUILTIN_STUB (BUILT_IN_NOTIFY_INTRINSIC, "__notify_intrinsic") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_DS_CHK, "cilkscreen_disable_checking") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_EN_CHK, "cilkscreen_enable_checking") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_AQUIRE_LOCK, "cilkscreen_aquire_lock") +DEF_CILK_BUILTIN_STUB (BUILT_IN_CILKSCREEN_REL_LOCK, "cilkscreen_release_lock") +DEF_CILK_BUILTIN_STUB (BUILT_IN_NOTIFY_ZC_INTRINSIC, "__notify_zc_intrinsic") +DEF_CILK_BUILTIN_STUB (BUILT_IN_NOTIFY_INTRINSIC, "__notify_intrinsic") /* Synchronization Primitives. */ #include "sync-builtins.def" Index: gcc/cilk.c =================================================================== --- gcc/cilk.c (revision 188669) +++ gcc/cilk.c (working copy) @@ -80,7 +80,11 @@ DECL_BUILT_IN_CLASS (fndecl) = BUILT_IN_NORMAL; DECL_FUNCTION_CODE (fndecl) = code; if (publish) - fndecl = lang_hooks.decls.pushdecl (fndecl); + { + tree t = lang_hooks.decls.pushdecl (fndecl); + if (t) + fndecl = t; + } set_builtin_decl (code, fndecl, true); return fndecl; } @@ -293,27 +297,9 @@ mark_cold (cilk_leave_fndecl); cilk_leave_fndecl = lang_hooks.decls.pushdecl (cilk_leave_fndecl); - cilk_enter_fndecl = build_fn_decl ("__cilkrts_enter_frame", fptr_fun); - mark_cold (cilk_enter_fndecl); - cilk_enter_fndecl = lang_hooks.decls.pushdecl (cilk_enter_fndecl); - - - - cilk_pop_fndecl = install_builtin ("__cilkrts_pop_frame", fptr_fun, - BUILT_IN_CILK_POP_FRAME, false); - - cilk_leave_fndecl = build_fn_decl ("__cilkrts_leave_frame", fptr_fun); - mark_cold (cilk_leave_fndecl); - cilk_leave_fndecl = lang_hooks.decls.pushdecl (cilk_leave_fndecl); - - - cilk_sync_fndecl = build_fn_decl ("__cilkrts_sync", fptr_fun); - mark_cold (cilk_leave_fndecl); - /* Unlike ordinary library functions cilk_sync can throw. */ - /* extern void __cilkrts_sync(void) */ cilk_sync_fndecl = build_fn_decl ("__cilkrts_sync", fptr_fun); - mark_cold (cilk_leave_fndecl); + mark_cold (cilk_sync_fndecl); /* Unlike ordinary library functions cilk_sync can throw. Exceptions from spawns earlier in the same spawn scope may be deferred until a sync. */ @@ -448,7 +434,8 @@ return expand_expr (field, NULL_RTX, VOIDmode, EXPAND_NORMAL); } -static tree get_frame_arg (tree call) +static tree +get_frame_arg (tree call) { tree arg, argtype; @@ -461,7 +448,9 @@ return NULL_TREE; argtype = TREE_TYPE (argtype); - if (!lang_hooks.types_compatible_p (argtype, cilk_frame_type_decl)) + + if (lang_hooks.types_compatible_p && + !lang_hooks.types_compatible_p (argtype, cilk_frame_type_decl)) return NULL_TREE; return arg; @@ -1059,8 +1048,7 @@ } rtx -expand_builtin_cilk_metadata (const char *annotation ATTRIBUTE_UNUSED, - tree exp ATTRIBUTE_UNUSED) +expand_builtin_cilk_metadata (const char *annotation, tree exp) { rtx metadata_label = NULL_RTX, call_insn = NULL_RTX; rtx expr_list_rtx = NULL_RTX, ii_rtx = NULL_RTX, reg_rtx = NULL_RTX; @@ -1114,8 +1102,11 @@ } metadata_info.ptr_next = NULL; insert_into_zca_list (metadata_info); - if (cfun) - cfun->calls_notify_intrinsic = 1; + if (cfun) + { + cfun->calls_notify_intrinsic = 1; + cfun->is_cilk_function = 1; + } return const0_rtx; } Index: gcc/cilk.h =================================================================== --- gcc/cilk.h (revision 188669) +++ gcc/cilk.h (working copy) @@ -316,4 +316,5 @@ extern enum elem_fn_parm_type find_elem_fn_parm_type (gimple, tree, tree *); extern tree find_elem_fn_name (tree, tree, tree); elem_fn_info *extract_elem_fn_values (tree); +extern void array_notation_init_builtins (void); #endif /* GCC_CILK_H */ Index: gcc/lto/lto-lang.c =================================================================== --- gcc/lto/lto-lang.c (revision 188669) +++ gcc/lto/lto-lang.c (working copy) @@ -35,6 +35,7 @@ #include "diagnostic-core.h" #include "toplev.h" #include "lto-streamer.h" +#include "cilk.h" static tree lto_type_for_size (unsigned, int); @@ -666,6 +667,14 @@ lto_init_attributes (); + /* this function will initialize all the builtin functions required by + * the cilkplus port */ + if (flag_enable_cilk) + { + cilk_init_builtins (); + array_notation_init_builtins (); + } + #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P,\ NONANSI_P, ATTRS, IMPLICIT, COND) \ if (NAME && COND) \ Index: gcc/lto/ChangeLog.cilk =================================================================== --- gcc/lto/ChangeLog.cilk (revision 0) +++ gcc/lto/ChangeLog.cilk (revision 0) @@ -0,0 +1,5 @@ +2012-06-15 Balaji V. Iyer <balaji.v.i...@intel.com> + + * lto-lang.c (lto_define_builtins): If cilk flag is set we initialize + all array notation and cilk builtin functions. + Index: gcc/ChangeLog.cilk =================================================================== --- gcc/ChangeLog.cilk (revision 188669) +++ gcc/ChangeLog.cilk (working copy) @@ -1,3 +1,16 @@ +2012-06-15 Balaji V. Iyer <balaji.v.i...@intel.com> + + * cilk.c (install_builtin): Added a check if pushdecl is successful. + Only update the fndecl if it is. + (cilk_init_builtins): Removed duplicate code and changed fixed a small + bug. + (get_frame_arg): Added a check if compatable_p is available. + (expand_builtin_cilk_metadata): Removed attribute_unused for the parms, + and set is_cilk_function whenever notify_intrinsic is set. + * tree.h (GTY): Added a new enum field called BUILT_IN_CILK. + * builtins.def: Set the builtin type as BUILT_IN_CILK for all cilk + related functions. + 2012-06-11 Balaji V. Iyer <balaji.v.i...@intel.com> * cilk.c (cilk_init_builtins): Made the stack frame structure runtime