diff mbox

[Cilkplus] Fix bug for the -lto flag

Message ID BF230D13CA30DD48930C31D4099330000F274B7F@FMSMSX102.amr.corp.intel.com
State New
Headers show

Commit Message

Iyer, Balaji V June 15, 2012, 3:48 p.m. UTC
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.
diff mbox

Patch

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.iyer@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.iyer@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.iyer@intel.com>
 
 	* cilk.c (cilk_init_builtins): Made the stack frame structure runtime