diff mbox

[UPC,16/22] gimple/gimplify changes

Message ID 20151201060241.GA31290@intrepid.com
State New
Headers show

Commit Message

Gary Funck Dec. 1, 2015, 6:02 a.m. UTC
Background
----------

An overview email, describing the UPC-related changes is here:
  https://gcc.gnu.org/ml/gcc-patches/2015-12/msg00005.html

The GUPC branch is described here:
  http://gcc.gnu.org/projects/gupc.html

The UPC-related source code differences are summarized here:
  http://gccupc.org/gupc-changes

All languages (c, c++, fortran, go, lto, objc, obj-c++) have been
bootstrapped; no test suite regressions were introduced,
relative to the GCC trunk.

If you are on the cc-list, your name was chosen either
because you are listed as a maintainer for the area that
applies to the patches described in this email, or you
were a frequent contributor of patches made to files listed
in this email.

In the change log entries included in each patch, the directory
containing the affected files is listed, followed by the files.
When the patches are applied, the change log entries will be
distributed to the appropriate ChangeLog file.

Overview
--------

In gimple-expr.c, logic is added to useless_type_conversion_p() to
handle conversions involving UPC pointers-to-shared.
lang_hooks.types_compatible_p() is called to check conversions
between UPC pointers-to-shared.  This will in turn call c_types_compatible_p()
which will call upc_types_compatible_p() if -fupc is asserted.

The hook is needed here because the gimple-related routines are
defined at the top-level of the GCC tree and can be linked with
other front-ends.

In gimplify.c, flag_instrument_functions_exclude_p() is exported
as an external function rather than being defined as a static function.
It is called from upc_genericize_function() defined in c/c-upc-low.c,
when -fupc-instrument-functions is asserted.

2015-11-30  Gary Funck  <gary@intrepid.com>

	gcc/
	* gimple-expr.c: #include "langhooks.h".
	(useless_type_conversion_p): Retain conversions from UPC
	pointer-to-shared and a regular C pointer.
	Retain conversions between incompatible UPC pointers-to-shared.
	Call lang_hooks.types_compatible_p() to check type
	compatibility between UPC pointers-to-shared.
	* gimplify.c (flag_instrument_functions_exclude_p): Make it into
	an external function.
	* gimplify.h (flag_instrument_functions_exclude_p): New prototype.

Comments

Richard Biener Dec. 1, 2015, 11:48 a.m. UTC | #1
On Mon, 30 Nov 2015, Gary Funck wrote:

> 
> Background
> ----------
> 
> An overview email, describing the UPC-related changes is here:
>   https://gcc.gnu.org/ml/gcc-patches/2015-12/msg00005.html
> 
> The GUPC branch is described here:
>   http://gcc.gnu.org/projects/gupc.html
> 
> The UPC-related source code differences are summarized here:
>   http://gccupc.org/gupc-changes
> 
> All languages (c, c++, fortran, go, lto, objc, obj-c++) have been
> bootstrapped; no test suite regressions were introduced,
> relative to the GCC trunk.
> 
> If you are on the cc-list, your name was chosen either
> because you are listed as a maintainer for the area that
> applies to the patches described in this email, or you
> were a frequent contributor of patches made to files listed
> in this email.
> 
> In the change log entries included in each patch, the directory
> containing the affected files is listed, followed by the files.
> When the patches are applied, the change log entries will be
> distributed to the appropriate ChangeLog file.
> 
> Overview
> --------
> 
> In gimple-expr.c, logic is added to useless_type_conversion_p() to
> handle conversions involving UPC pointers-to-shared.
> lang_hooks.types_compatible_p() is called to check conversions
> between UPC pointers-to-shared.  This will in turn call c_types_compatible_p()
> which will call upc_types_compatible_p() if -fupc is asserted.
> 
> The hook is needed here because the gimple-related routines are
> defined at the top-level of the GCC tree and can be linked with
> other front-ends.

Like I said elsewhere this is purely middle-end code and thus
may not call langhooks.

> In gimplify.c, flag_instrument_functions_exclude_p() is exported
> as an external function rather than being defined as a static function.
> It is called from upc_genericize_function() defined in c/c-upc-low.c,
> when -fupc-instrument-functions is asserted.
> 
> 2015-11-30  Gary Funck  <gary@intrepid.com>
> 
> 	gcc/
> 	* gimple-expr.c: #include "langhooks.h".
> 	(useless_type_conversion_p): Retain conversions from UPC
> 	pointer-to-shared and a regular C pointer.
> 	Retain conversions between incompatible UPC pointers-to-shared.
> 	Call lang_hooks.types_compatible_p() to check type
> 	compatibility between UPC pointers-to-shared.
> 	* gimplify.c (flag_instrument_functions_exclude_p): Make it into
> 	an external function.
> 	* gimplify.h (flag_instrument_functions_exclude_p): New prototype.
> 
> Index: gcc/gimple-expr.c
> ===================================================================
> --- gcc/gimple-expr.c	(.../trunk)	(revision 231059)
> +++ gcc/gimple-expr.c	(.../branches/gupc)	(revision 231080)
> @@ -29,6 +29,7 @@ along with GCC; see the file COPYING3.
>  #include "gimple-ssa.h"
>  #include "fold-const.h"
>  #include "tree-eh.h"
> +#include "langhooks.h"
>  #include "gimplify.h"
>  #include "stor-layout.h"
>  #include "demangle.h"
> @@ -67,6 +68,19 @@ useless_type_conversion_p (tree outer_ty
>    if (POINTER_TYPE_P (inner_type)
>        && POINTER_TYPE_P (outer_type))
>      {
> +      int i_shared = SHARED_TYPE_P (TREE_TYPE (inner_type));
> +      int o_shared = SHARED_TYPE_P (TREE_TYPE (outer_type));
> +
> +      /* Retain conversions from a UPC shared pointer to
> +         a regular C pointer.  */
> +      if (!o_shared && i_shared)
> +        return false;
> +
> +      /* Retain conversions between incompatible UPC shared pointers.  */
> +      if (o_shared && i_shared
> +	  && !lang_hooks.types_compatible_p (inner_type, outer_type))
> +        return false;
> +
>        /* Do not lose casts between pointers to different address spaces.  */
>        if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type))
>  	  != TYPE_ADDR_SPACE (TREE_TYPE (inner_type)))

As the addr-space check is right below the place you change - why
are incompatible UPC shared pointers not using different address-spaces
then?

That is, why are you introducing a different kind of "address space"
representation?

Richard.

> Index: gcc/gimplify.c
> ===================================================================
> --- gcc/gimplify.c	(.../trunk)	(revision 231059)
> +++ gcc/gimplify.c	(.../branches/gupc)	(revision 231080)
> @@ -11269,7 +11269,7 @@ typedef char *char_p; /* For DEF_VEC_P.
>  
>  /* Return whether we should exclude FNDECL from instrumentation.  */
>  
> -static bool
> +bool
>  flag_instrument_functions_exclude_p (tree fndecl)
>  {
>    vec<char_p> *v;
> Index: gcc/gimplify.h
> ===================================================================
> --- gcc/gimplify.h	(.../trunk)	(revision 231059)
> +++ gcc/gimplify.h	(.../branches/gupc)	(revision 231080)
> @@ -77,6 +77,7 @@ extern enum gimplify_status gimplify_exp
>  extern void gimplify_type_sizes (tree, gimple_seq *);
>  extern void gimplify_one_sizepos (tree *, gimple_seq *);
>  extern gbind *gimplify_body (tree, bool);
> +extern bool flag_instrument_functions_exclude_p (tree);
>  extern enum gimplify_status gimplify_arg (tree *, gimple_seq *, location_t);
>  extern void gimplify_function_tree (tree);
>  extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
> 
>
diff mbox

Patch

Index: gcc/gimple-expr.c
===================================================================
--- gcc/gimple-expr.c	(.../trunk)	(revision 231059)
+++ gcc/gimple-expr.c	(.../branches/gupc)	(revision 231080)
@@ -29,6 +29,7 @@  along with GCC; see the file COPYING3.
 #include "gimple-ssa.h"
 #include "fold-const.h"
 #include "tree-eh.h"
+#include "langhooks.h"
 #include "gimplify.h"
 #include "stor-layout.h"
 #include "demangle.h"
@@ -67,6 +68,19 @@  useless_type_conversion_p (tree outer_ty
   if (POINTER_TYPE_P (inner_type)
       && POINTER_TYPE_P (outer_type))
     {
+      int i_shared = SHARED_TYPE_P (TREE_TYPE (inner_type));
+      int o_shared = SHARED_TYPE_P (TREE_TYPE (outer_type));
+
+      /* Retain conversions from a UPC shared pointer to
+         a regular C pointer.  */
+      if (!o_shared && i_shared)
+        return false;
+
+      /* Retain conversions between incompatible UPC shared pointers.  */
+      if (o_shared && i_shared
+	  && !lang_hooks.types_compatible_p (inner_type, outer_type))
+        return false;
+
       /* Do not lose casts between pointers to different address spaces.  */
       if (TYPE_ADDR_SPACE (TREE_TYPE (outer_type))
 	  != TYPE_ADDR_SPACE (TREE_TYPE (inner_type)))
Index: gcc/gimplify.c
===================================================================
--- gcc/gimplify.c	(.../trunk)	(revision 231059)
+++ gcc/gimplify.c	(.../branches/gupc)	(revision 231080)
@@ -11269,7 +11269,7 @@  typedef char *char_p; /* For DEF_VEC_P.
 
 /* Return whether we should exclude FNDECL from instrumentation.  */
 
-static bool
+bool
 flag_instrument_functions_exclude_p (tree fndecl)
 {
   vec<char_p> *v;
Index: gcc/gimplify.h
===================================================================
--- gcc/gimplify.h	(.../trunk)	(revision 231059)
+++ gcc/gimplify.h	(.../branches/gupc)	(revision 231080)
@@ -77,6 +77,7 @@  extern enum gimplify_status gimplify_exp
 extern void gimplify_type_sizes (tree, gimple_seq *);
 extern void gimplify_one_sizepos (tree *, gimple_seq *);
 extern gbind *gimplify_body (tree, bool);
+extern bool flag_instrument_functions_exclude_p (tree);
 extern enum gimplify_status gimplify_arg (tree *, gimple_seq *, location_t);
 extern void gimplify_function_tree (tree);
 extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,