public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [gomp] Add langhook, so that Fortran can privatize variables by reference
@ 2005-10-18  7:01 Jakub Jelinek
  2005-10-18  9:10 ` Richard Henderson
  2019-05-26 17:46 ` Thomas Schwinge
  0 siblings, 2 replies; 11+ messages in thread
From: Jakub Jelinek @ 2005-10-18  7:01 UTC (permalink / raw)
  To: gcc-patches, fortran

Hi!

From my testing so far, all Fortran user vars that have POINTER_TYPE
type (in addition to the already handled REFERENCE_TYPE)
are supposed to be privatized with the type they point to rather than
just as a pointer type (Fortran POINTER, ALLOCATABLE and from what I saw,
also Cray pointers in the patch that is floating around, use either an
aggregate type or a simple INTEGER_TYPE).

Fixes reference2.f90 (and some tests in openmpbench_F_v2, though there are
still unrelated problems), approved privately by Richard, committed.

2005-10-18  Jakub Jelinek  <jakub@redhat.com>

	* langhooks.h (struct lang_hooks_for_decls): Add
	omp_privatize_by_reference hook.
	* langhooks-def.h (lhd_omp_privatize_by_reference): New prototype.
	(LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE): Define.
	(LANG_HOOKS_DECLS): Add LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE.
	* langhooks.c (lhd_omp_privatize_by_reference): New function.
	* omp-low.c (is_reference): Call omp_privatize_by_reference
	langhook.
fortran/
	* trans.h (gfc_omp_privatize_by_reference): New prototype.
	* f95-lang.c (LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE): Redefine
	to gfc_omp_privatize_by_reference.
	* trans-openmp.c (gfc_omp_privatize_by_reference): New function.

	* trans-stmt.h (gfc_trans_omp_directive): Add comment.

--- gcc/omp-low.c.jj	2005-10-15 12:00:06.000000000 +0200
+++ gcc/omp-low.c	2005-10-18 08:46:23.000000000 +0200
@@ -126,7 +126,7 @@ is_variable_sized (tree expr)
 static inline bool
 is_reference (tree decl)
 {
-  return TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE;
+  return lang_hooks.decls.omp_privatize_by_reference (decl);
 }
 
 /* Lookup variables in the decl or field splay trees.  The "maybe" form
--- gcc/langhooks.h.jj	2005-09-13 15:12:55.000000000 +0200
+++ gcc/langhooks.h	2005-10-18 08:46:23.000000000 +0200
@@ -192,6 +192,10 @@ struct lang_hooks_for_decls
      value will be the string already stored in an
      IDENTIFIER_NODE.)  */
   const char * (*comdat_group) (tree);
+
+  /* True if OpenMP should privatize what this DECL points to rather
+     than the DECL itself.  */
+  bool (*omp_privatize_by_reference) (tree);
 };
 
 /* Language-specific hooks.  See langhooks-def.h for defaults.  */
--- gcc/fortran/trans.h.jj	2005-10-17 09:04:27.000000000 +0200
+++ gcc/fortran/trans.h	2005-10-18 08:46:23.000000000 +0200
@@ -440,6 +440,9 @@ tree gfc_truthvalue_conversion (tree);
 tree builtin_function (const char *, tree, int, enum built_in_class,
 		       const char *, tree);
 
+/* In trans-openmp.c */
+bool gfc_omp_privatize_by_reference (tree);
+
 /* Runtime library function decls.  */
 extern GTY(()) tree gfor_fndecl_internal_malloc;
 extern GTY(()) tree gfor_fndecl_internal_malloc64;
--- gcc/fortran/trans-openmp.c.jj	2005-10-12 15:29:25.000000000 +0200
+++ gcc/fortran/trans-openmp.c	2005-10-18 08:46:23.000000000 +0200
@@ -37,6 +37,24 @@ Software Foundation, 51 Franklin Street,
 #include "arith.h"
 
 
+/* True if OpenMP should privatize what this DECL points to rather
+   than the DECL itself.  */
+
+bool
+gfc_omp_privatize_by_reference (tree decl)
+{
+  tree type = TREE_TYPE (decl);
+
+  if (TREE_CODE (type) == REFERENCE_TYPE)
+    return true;
+
+  /* POINTER/ALLOCATABLE have aggregate types, all user variables
+     that have POINTER_TYPE type are supposed to be privatized
+     by reference.  */
+  return !DECL_ARTIFICIAL (decl) && TREE_CODE (type) == POINTER_TYPE;
+}
+
+
 static inline tree
 gfc_trans_add_clause (tree node, tree tail)
 {
--- gcc/fortran/trans-stmt.h.jj	2005-09-20 10:25:18.000000000 +0200
+++ gcc/fortran/trans-stmt.h	2005-10-18 08:46:23.000000000 +0200
@@ -50,6 +50,8 @@ tree gfc_trans_where (gfc_code *);
 tree gfc_trans_allocate (gfc_code *);
 tree gfc_trans_deallocate (gfc_code *);
 tree gfc_trans_deallocate_array (tree);
+
+/* trans-openmp.c */
 tree gfc_trans_omp_directive (gfc_code *);
 
 /* trans-io.c */
--- gcc/fortran/f95-lang.c.jj	2005-10-17 09:04:26.000000000 +0200
+++ gcc/fortran/f95-lang.c	2005-10-18 08:46:23.000000000 +0200
@@ -116,6 +116,7 @@ static void gfc_expand_function (tree);
 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
 #undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION
 #undef LANG_HOOKS_CLEAR_BINDING_STACK
+#undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
 
 /* Define lang hooks.  */
 #define LANG_HOOKS_NAME                 "GNU F95"
@@ -134,6 +135,7 @@ static void gfc_expand_function (tree);
 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE gfc_signed_or_unsigned_type
 #define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION gfc_expand_function
 #define LANG_HOOKS_CLEAR_BINDING_STACK     gfc_clear_binding_stack
+#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE	gfc_omp_privatize_by_reference
 
 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
--- gcc/langhooks.c.jj	2005-09-17 20:43:39.000000000 +0200
+++ gcc/langhooks.c	2005-10-18 08:50:13.000000000 +0200
@@ -456,6 +456,15 @@ lhd_comdat_group (tree decl)
   return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
 }
 
+/* True if OpenMP should privatize what this DECL points to rather
+   than the DECL itself.  */
+
+bool
+lhd_omp_privatize_by_reference (tree decl ATTRIBUTE_UNUSED)
+{
+  return false;
+}
+
 /* lang_hooks.decls.final_write_globals: perform final processing on
    global variables.  */
 void
--- gcc/langhooks-def.h.jj	2005-09-13 15:12:55.000000000 +0200
+++ gcc/langhooks-def.h	2005-10-18 08:46:23.000000000 +0200
@@ -70,6 +70,7 @@ extern tree lhd_expr_size (tree);
 extern size_t lhd_tree_size (enum tree_code);
 extern HOST_WIDE_INT lhd_to_target_charset (HOST_WIDE_INT);
 extern tree lhd_expr_to_decl (tree, bool *, bool *, bool *);
+extern bool lhd_omp_privatize_by_reference (tree);
 
 /* Declarations of default tree inlining hooks.  */
 extern tree lhd_tree_inlining_walk_subtrees (tree *, int *, walk_tree_fn,
@@ -239,6 +240,7 @@ extern tree lhd_make_node (enum tree_cod
 #define LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE NULL
 #define LANG_HOOKS_DECL_OK_FOR_SIBCALL	lhd_decl_ok_for_sibcall
 #define LANG_HOOKS_COMDAT_GROUP lhd_comdat_group
+#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE lhd_omp_privatize_by_reference
 
 #define LANG_HOOKS_DECLS { \
   LANG_HOOKS_GLOBAL_BINDINGS_P, \
@@ -249,7 +251,8 @@ extern tree lhd_make_node (enum tree_cod
   LANG_HOOKS_WRITE_GLOBALS, \
   LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE, \
   LANG_HOOKS_DECL_OK_FOR_SIBCALL, \
-  LANG_HOOKS_COMDAT_GROUP \
+  LANG_HOOKS_COMDAT_GROUP, \
+  LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE \
 }
 
 /* The whole thing.  The structure is defined in langhooks.h.  */

	Jakub

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2005-10-18  7:01 [gomp] Add langhook, so that Fortran can privatize variables by reference Jakub Jelinek
@ 2005-10-18  9:10 ` Richard Henderson
  2005-10-18  9:49   ` Jakub Jelinek
  2019-05-26 17:46 ` Thomas Schwinge
  1 sibling, 1 reply; 11+ messages in thread
From: Richard Henderson @ 2005-10-18  9:10 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches, fortran

On Tue, Oct 18, 2005 at 03:01:40AM -0400, Jakub Jelinek wrote:
> +bool
> +lhd_omp_privatize_by_reference (tree decl ATTRIBUTE_UNUSED)
> +{
> +  return false;
> +}

Preferably, hook_bool_tree_false.


r~

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2005-10-18  9:10 ` Richard Henderson
@ 2005-10-18  9:49   ` Jakub Jelinek
  2005-10-18  9:54     ` Richard Henderson
  0 siblings, 1 reply; 11+ messages in thread
From: Jakub Jelinek @ 2005-10-18  9:49 UTC (permalink / raw)
  To: Richard Henderson, gcc-patches

On Tue, Oct 18, 2005 at 02:10:33AM -0700, Richard Henderson wrote:
> On Tue, Oct 18, 2005 at 03:01:40AM -0400, Jakub Jelinek wrote:
> > +bool
> > +lhd_omp_privatize_by_reference (tree decl ATTRIBUTE_UNUSED)
> > +{
> > +  return false;
> > +}
> 
> Preferably, hook_bool_tree_false.

lhd_bool_tree_false or hook_bool_tree_false?
Also, shouldn't e.g.
bool
lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
{
  return true;
}
be changed to lhd_bool_tree_true too?

	Jakub

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2005-10-18  9:49   ` Jakub Jelinek
@ 2005-10-18  9:54     ` Richard Henderson
  2005-10-18 10:28       ` Jakub Jelinek
  0 siblings, 1 reply; 11+ messages in thread
From: Richard Henderson @ 2005-10-18  9:54 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches

On Tue, Oct 18, 2005 at 05:48:52AM -0400, Jakub Jelinek wrote:
> lhd_bool_tree_false or hook_bool_tree_false?

hook_bool_tree_false, which already exists.

> Also, shouldn't e.g.
> bool
> lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
> {
>   return true;
> }
> be changed to lhd_bool_tree_true too?

I hadn't noticed that one.  It should be hook_bool_tree_true,
which also already exists. 


r~

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2005-10-18  9:54     ` Richard Henderson
@ 2005-10-18 10:28       ` Jakub Jelinek
  2005-10-18 10:46         ` Richard Henderson
  0 siblings, 1 reply; 11+ messages in thread
From: Jakub Jelinek @ 2005-10-18 10:28 UTC (permalink / raw)
  To: Richard Henderson, gcc-patches

On Tue, Oct 18, 2005 at 02:54:34AM -0700, Richard Henderson wrote:
> On Tue, Oct 18, 2005 at 05:48:52AM -0400, Jakub Jelinek wrote:
> > lhd_bool_tree_false or hook_bool_tree_false?
> 
> hook_bool_tree_false, which already exists.
> 
> > Also, shouldn't e.g.
> > bool
> > lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
> > {
> >   return true;
> > }
> > be changed to lhd_bool_tree_true too?
> 
> I hadn't noticed that one.  It should be hook_bool_tree_true,
> which also already exists. 

There are actually many more lhd_* hooks which have corresponding
hook_* in hooks.c.

Now, would this be ok for HEAD (of course except the
LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE), or should I commit this
just to gomp and let 4.2 clean up during gomp->HEAD merge after
4.1 branches, or should I just change LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
and create a PR with the patch, so that it is cleaned up later?

2005-10-18  Jakub Jelinek  <jakub@redhat.com>

	* langhooks.c (lhd_do_nothing, lhd_do_nothing_t,
	lhd_can_use_bit_fields_p, lhd_expand_decl,
	lhd_tree_inlining_anon_aggr_type_p, lhd_decl_ok_for_sibcall,
	lhd_tree_inlining_end_inlining, lhd_omp_privatize_by_reference):
	Removed.
	* langhooks-def.h (lhd_do_nothing, lhd_do_nothing_t,
	lhd_can_use_bit_fields_p, lhd_expand_decl,
	lhd_tree_inlining_anon_aggr_type_p, lhd_decl_ok_for_sibcall,
	lhd_tree_inlining_end_inlining, lhd_omp_privatize_by_reference):
	Remove prototypes.
	(LANG_HOOKS_FINISH, LANG_HOOKS_CLEAR_BINDING_STACK,
	LANG_HOOKS_EXPAND_DECL, LANG_HOOKS_FINISH_INCOMPLETE_DECL,
	LANG_HOOKS_DUP_LANG_SPECIFIC_DECL, LANG_HOOKS_CAN_USE_BIT_FIELDS_P,
	LANG_HOOKS_PRINT_STATISTICS, LANG_HOOKS_INIT_TS,
	LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P,
	LANG_HOOKS_TREE_INLINING_END_INLINING, LANG_HOOKS_DECL_OK_FOR_SIBCALL,
	LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE): Use hooks.c hooks rather than
	lhd_* specific ones.

--- gcc/langhooks.c.jj	2005-10-18 08:50:13.000000000 +0200
+++ gcc/langhooks.c	2005-10-18 12:13:24.000000000 +0200
@@ -37,20 +37,6 @@ Boston, MA 02110-1301, USA.  */
 #include "ggc.h"
 #include "diagnostic.h"
 
-/* Do nothing; in many cases the default hook.  */
-
-void
-lhd_do_nothing (void)
-{
-}
-
-/* Do nothing (tree).  */
-
-void
-lhd_do_nothing_t (tree ARG_UNUSED (t))
-{
-}
-
 /* Do nothing (int).  */
 
 void
@@ -185,13 +171,6 @@ lhd_set_decl_assembler_name (tree decl)
     }
 }
 
-/* By default we always allow bit-field based optimizations.  */
-bool
-lhd_can_use_bit_fields_p (void)
-{
-  return true;
-}
-
 /* Type promotion for variable arguments.  */
 tree
 lhd_type_promotes_to (tree ARG_UNUSED (type))
@@ -243,18 +222,6 @@ lhd_expand_expr (tree ARG_UNUSED (t), rt
   gcc_unreachable ();
 }
 
-/* The default language-specific function for expanding a decl.  After
-   the language-independent cases are handled, this function will be
-   called.  If this function is not defined, it is assumed that
-   declarations other than those for variables and labels do not require
-   any RTL generation.  */
-
-int
-lhd_expand_decl (tree ARG_UNUSED (t))
-{
-  return 0;
-}
-
 /* This is the default decl_printable_name function.  */
 
 const char *
@@ -348,16 +315,6 @@ lhd_tree_inlining_auto_var_in_fn_p (tree
 	      || TREE_CODE (var) == RESULT_DECL));
 }
 
-/* lang_hooks.tree_inlining.anon_aggr_type_p determines whether T is a
-   type node representing an anonymous aggregate (union, struct, etc),
-   i.e., one whose members are in the same scope as the union itself.  */
-
-int
-lhd_tree_inlining_anon_aggr_type_p (tree t ATTRIBUTE_UNUSED)
-{
-  return 0;
-}
-
 /* lang_hooks.tree_inlining.start_inlining and end_inlining perform any
    language-specific bookkeeping necessary for processing
    FN. start_inlining returns nonzero if inlining should proceed, zero if
@@ -372,11 +329,6 @@ lhd_tree_inlining_start_inlining (tree f
   return 1;
 }
 
-void
-lhd_tree_inlining_end_inlining (tree fn ATTRIBUTE_UNUSED)
-{
-}
-
 /* lang_hooks.tree_inlining.convert_parm_for_inlining performs any
    language-specific conversion before assigning VALUE to PARM.  */
 
@@ -439,15 +391,6 @@ lhd_tree_size (enum tree_code c ATTRIBUT
   gcc_unreachable ();
 }
 
-/* Return true if decl, which is a function decl, may be called by a
-   sibcall.  */
-
-bool
-lhd_decl_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED)
-{
-  return true;
-}
-
 /* Return the COMDAT group into which DECL should be placed.  */
 
 const char *
@@ -456,15 +399,6 @@ lhd_comdat_group (tree decl)
   return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
 }
 
-/* True if OpenMP should privatize what this DECL points to rather
-   than the DECL itself.  */
-
-bool
-lhd_omp_privatize_by_reference (tree decl ATTRIBUTE_UNUSED)
-{
-  return false;
-}
-
 /* lang_hooks.decls.final_write_globals: perform final processing on
    global variables.  */
 void
--- gcc/cp/cp-objcp-common.h.jj	2005-09-13 15:16:03.000000000 +0200
+++ gcc/cp/cp-objcp-common.h	2005-10-18 12:10:08.000000000 +0200
@@ -82,7 +82,7 @@ extern tree objcp_tsubst_copy_and_build 
 #undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl
 #undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS lhd_do_nothing
+#define LANG_HOOKS_WRITE_GLOBALS hook_void_void
 #undef LANG_HOOKS_COMDAT_GROUP
 #define LANG_HOOKS_COMDAT_GROUP cxx_comdat_group
 
--- gcc/langhooks-def.h.jj	2005-10-18 08:46:23.000000000 +0200
+++ gcc/langhooks-def.h	2005-10-18 12:13:45.000000000 +0200
@@ -39,8 +39,6 @@ extern HOST_WIDE_INT hook_get_alias_set_
 
 /* See langhooks.h for the definition and documentation of each hook.  */
 
-extern void lhd_do_nothing (void);
-extern void lhd_do_nothing_t (tree);
 extern void lhd_do_nothing_i (int);
 extern void lhd_do_nothing_f (struct function *);
 extern bool lhd_post_options (const char **);
@@ -55,22 +53,18 @@ extern void lhd_print_tree_nothing (FILE
 extern const char *lhd_decl_printable_name (tree, int);
 extern int lhd_types_compatible_p (tree, tree);
 extern rtx lhd_expand_expr (tree, rtx, enum machine_mode, int, rtx *);
-extern int lhd_expand_decl (tree);
 extern void lhd_print_error_function (struct diagnostic_context *,
 				      const char *);
 extern void lhd_set_decl_assembler_name (tree);
-extern bool lhd_can_use_bit_fields_p (void);
 extern bool lhd_warn_unused_global_decl (tree);
 extern void lhd_incomplete_type_error (tree, tree);
 extern tree lhd_type_promotes_to (tree);
 extern void lhd_register_builtin_type (tree, const char *);
-extern bool lhd_decl_ok_for_sibcall (tree);
 extern const char *lhd_comdat_group (tree);
 extern tree lhd_expr_size (tree);
 extern size_t lhd_tree_size (enum tree_code);
 extern HOST_WIDE_INT lhd_to_target_charset (HOST_WIDE_INT);
 extern tree lhd_expr_to_decl (tree, bool *, bool *, bool *);
-extern bool lhd_omp_privatize_by_reference (tree);
 
 /* Declarations of default tree inlining hooks.  */
 extern tree lhd_tree_inlining_walk_subtrees (tree *, int *, walk_tree_fn,
@@ -79,9 +73,7 @@ extern int lhd_tree_inlining_cannot_inli
 extern int lhd_tree_inlining_disregard_inline_limits (tree);
 extern tree lhd_tree_inlining_add_pending_fn_decls (void *, tree);
 extern int lhd_tree_inlining_auto_var_in_fn_p (tree, tree);
-extern int lhd_tree_inlining_anon_aggr_type_p (tree);
 extern int lhd_tree_inlining_start_inlining (tree);
-extern void lhd_tree_inlining_end_inlining (tree);
 extern tree lhd_tree_inlining_convert_parm_for_inlining (tree, tree, tree, int);
 extern void lhd_initialize_diagnostics (struct diagnostic_context *);
 extern tree lhd_callgraph_analyze_expr (tree *, int *, tree);
@@ -93,9 +85,9 @@ extern int lhd_gimplify_expr (tree *, tr
 #define LANG_HOOKS_NAME			"GNU unknown"
 #define LANG_HOOKS_IDENTIFIER_SIZE	sizeof (struct lang_identifier)
 #define LANG_HOOKS_INIT			hook_bool_void_false
-#define LANG_HOOKS_FINISH		lhd_do_nothing
+#define LANG_HOOKS_FINISH		hook_void_void
 #define LANG_HOOKS_PARSE_FILE		lhd_do_nothing_i
-#define LANG_HOOKS_CLEAR_BINDING_STACK	lhd_do_nothing
+#define LANG_HOOKS_CLEAR_BINDING_STACK	hook_void_void
 #define LANG_HOOKS_INIT_OPTIONS		hook_uint_uint_constcharptrptr_0
 #define LANG_HOOKS_INITIALIZE_DIAGNOSTICS lhd_initialize_diagnostics
 #define LANG_HOOKS_HANDLE_OPTION	hook_int_size_t_constcharptr_int_0
@@ -104,16 +96,16 @@ extern int lhd_gimplify_expr (tree *, tr
 #define LANG_HOOKS_GET_ALIAS_SET	lhd_get_alias_set
 #define LANG_HOOKS_EXPAND_CONSTANT	lhd_return_tree
 #define LANG_HOOKS_EXPAND_EXPR		lhd_expand_expr
-#define LANG_HOOKS_EXPAND_DECL		lhd_expand_decl
+#define LANG_HOOKS_EXPAND_DECL		hook_int_tree_0
 #define LANG_HOOKS_SAFE_FROM_P		lhd_safe_from_p
-#define LANG_HOOKS_FINISH_INCOMPLETE_DECL lhd_do_nothing_t
+#define LANG_HOOKS_FINISH_INCOMPLETE_DECL hook_void_tree
 #define LANG_HOOKS_STATICP		lhd_staticp
-#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL lhd_do_nothing_t
+#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL hook_void_tree
 #define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME lhd_set_decl_assembler_name
-#define LANG_HOOKS_CAN_USE_BIT_FIELDS_P lhd_can_use_bit_fields_p
+#define LANG_HOOKS_CAN_USE_BIT_FIELDS_P hook_bool_void_true
 #define LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS false
 #define LANG_HOOKS_NO_BODY_BLOCKS	false
-#define LANG_HOOKS_PRINT_STATISTICS	lhd_do_nothing
+#define LANG_HOOKS_PRINT_STATISTICS	hook_void_void
 #define LANG_HOOKS_PRINT_XNODE		lhd_print_tree_nothing
 #define LANG_HOOKS_PRINT_DECL		lhd_print_tree_nothing
 #define LANG_HOOKS_PRINT_TYPE		lhd_print_tree_nothing
@@ -127,7 +119,7 @@ extern int lhd_gimplify_expr (tree *, tr
 #define LANG_HOOKS_BUILTIN_FUNCTION	builtin_function
 #define LANG_HOOKS_EXPR_TO_DECL		lhd_expr_to_decl
 #define LANG_HOOKS_TO_TARGET_CHARSET	lhd_to_target_charset
-#define LANG_HOOKS_INIT_TS		lhd_do_nothing
+#define LANG_HOOKS_INIT_TS		hook_void_void
 
 #define LANG_HOOKS_FUNCTION_INIT	lhd_do_nothing_f
 #define LANG_HOOKS_FUNCTION_FINAL	lhd_do_nothing_f
@@ -151,13 +143,13 @@ extern int lhd_gimplify_expr (tree *, tr
 #define LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P \
   lhd_tree_inlining_auto_var_in_fn_p
 #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P \
-  lhd_tree_inlining_anon_aggr_type_p
+  hook_int_tree_0
 #define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P \
   hook_bool_tree_tree_false
 #define LANG_HOOKS_TREE_INLINING_START_INLINING \
   lhd_tree_inlining_start_inlining
 #define LANG_HOOKS_TREE_INLINING_END_INLINING \
-  lhd_tree_inlining_end_inlining
+  hook_void_tree
 #define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \
   lhd_tree_inlining_convert_parm_for_inlining
 
@@ -238,9 +230,9 @@ extern tree lhd_make_node (enum tree_cod
 #define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL lhd_warn_unused_global_decl
 #define LANG_HOOKS_WRITE_GLOBALS write_global_declarations
 #define LANG_HOOKS_PREPARE_ASSEMBLE_VARIABLE NULL
-#define LANG_HOOKS_DECL_OK_FOR_SIBCALL	lhd_decl_ok_for_sibcall
+#define LANG_HOOKS_DECL_OK_FOR_SIBCALL	hook_bool_tree_true
 #define LANG_HOOKS_COMDAT_GROUP lhd_comdat_group
-#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE lhd_omp_privatize_by_reference
+#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE hook_bool_tree_false
 
 #define LANG_HOOKS_DECLS { \
   LANG_HOOKS_GLOBAL_BINDINGS_P, \


	Jakub

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2005-10-18 10:28       ` Jakub Jelinek
@ 2005-10-18 10:46         ` Richard Henderson
  0 siblings, 0 replies; 11+ messages in thread
From: Richard Henderson @ 2005-10-18 10:46 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches

On Tue, Oct 18, 2005 at 06:28:49AM -0400, Jakub Jelinek wrote:
> ... or should I just change LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
> and create a PR with the patch, so that it is cleaned up later?

This option, please.


r~

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2005-10-18  7:01 [gomp] Add langhook, so that Fortran can privatize variables by reference Jakub Jelinek
  2005-10-18  9:10 ` Richard Henderson
@ 2019-05-26 17:46 ` Thomas Schwinge
  2019-05-27 16:51   ` Jakub Jelinek
  1 sibling, 1 reply; 11+ messages in thread
From: Thomas Schwinge @ 2019-05-26 17:46 UTC (permalink / raw)
  To: Jakub Jelinek, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 1009 bytes --]

Hi!

On Tue, 18 Oct 2005 03:01:40 -0400, Jakub Jelinek <jakub@redhat.com> wrote:
> --- gcc/omp-low.c.jj	2005-10-15 12:00:06.000000000 +0200
> +++ gcc/omp-low.c	2005-10-18 08:46:23.000000000 +0200
> @@ -126,7 +126,7 @@ is_variable_sized (tree expr)
>  static inline bool
>  is_reference (tree decl)
>  {
> -  return TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE;
> +  return lang_hooks.decls.omp_privatize_by_reference (decl);
>  }

With the same implementation, this function nowadays is known as
'omp_is_reference' ('gcc/omp-general.c'), and is used in 'omp-*' files
only.  The gimplifier directly calls
'lang_hooks.decls.omp_privatize_by_reference'.

Will it be OK to commit the obvious patch to get rid of the
'omp_is_reference' function?  Whenever I see it used in 'omp-*' files, I
wonder and have to look up what special things it might be doing -- but
it actually isn't.

	gcc/
        * omp-general.c (omp_is_reference): Don't define.  Adjust all users.


Grüße
 Thomas

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 658 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2019-05-26 17:46 ` Thomas Schwinge
@ 2019-05-27 16:51   ` Jakub Jelinek
  2019-05-29 17:12     ` Thomas Schwinge
  0 siblings, 1 reply; 11+ messages in thread
From: Jakub Jelinek @ 2019-05-27 16:51 UTC (permalink / raw)
  To: Thomas Schwinge; +Cc: gcc-patches

On Sun, May 26, 2019 at 07:43:04PM +0200, Thomas Schwinge wrote:
> On Tue, 18 Oct 2005 03:01:40 -0400, Jakub Jelinek <jakub@redhat.com> wrote:
> > --- gcc/omp-low.c.jj	2005-10-15 12:00:06.000000000 +0200
> > +++ gcc/omp-low.c	2005-10-18 08:46:23.000000000 +0200
> > @@ -126,7 +126,7 @@ is_variable_sized (tree expr)
> >  static inline bool
> >  is_reference (tree decl)
> >  {
> > -  return TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE;
> > +  return lang_hooks.decls.omp_privatize_by_reference (decl);
> >  }
> 
> With the same implementation, this function nowadays is known as
> 'omp_is_reference' ('gcc/omp-general.c'), and is used in 'omp-*' files
> only.  The gimplifier directly calls
> 'lang_hooks.decls.omp_privatize_by_reference'.
> 
> Will it be OK to commit the obvious patch to get rid of the
> 'omp_is_reference' function?  Whenever I see it used in 'omp-*' files, I

No, omp_is_reference (something) is certainly more readable from
lang_hooks.decls.omp_privatize_by_reference (something), which is quite
long and would cause major issues in formatting etc.

What advantage do you see in removing that?

> wonder and have to look up what special things it might be doing -- but
> it actually isn't.
> 
> 	gcc/
>         * omp-general.c (omp_is_reference): Don't define.  Adjust all users.

	Jakub

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2019-05-27 16:51   ` Jakub Jelinek
@ 2019-05-29 17:12     ` Thomas Schwinge
  2021-08-31 14:28       ` Thomas Schwinge
  0 siblings, 1 reply; 11+ messages in thread
From: Thomas Schwinge @ 2019-05-29 17:12 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2303 bytes --]

Hi Jakub!

On Mon, 27 May 2019 18:49:20 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
> On Sun, May 26, 2019 at 07:43:04PM +0200, Thomas Schwinge wrote:
> > On Tue, 18 Oct 2005 03:01:40 -0400, Jakub Jelinek <jakub@redhat.com> wrote:
> > > --- gcc/omp-low.c.jj	2005-10-15 12:00:06.000000000 +0200
> > > +++ gcc/omp-low.c	2005-10-18 08:46:23.000000000 +0200
> > > @@ -126,7 +126,7 @@ is_variable_sized (tree expr)
> > >  static inline bool
> > >  is_reference (tree decl)
> > >  {
> > > -  return TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE;
> > > +  return lang_hooks.decls.omp_privatize_by_reference (decl);
> > >  }
> > 
> > With the same implementation, this function nowadays is known as
> > 'omp_is_reference' ('gcc/omp-general.c'), and is used in 'omp-*' files
> > only.  The gimplifier directly calls
> > 'lang_hooks.decls.omp_privatize_by_reference'.
> > 
> > Will it be OK to commit the obvious patch to get rid of the
> > 'omp_is_reference' function?  Whenever I see it used in 'omp-*' files, I
> 
> No, omp_is_reference (something) is certainly more readable from
> lang_hooks.decls.omp_privatize_by_reference (something)

Yes, better readable because it's shorter, but you have to look up its
meaning, whereas with 'lang_hooks.decls.omp_privatize_by_reference' you
directly see what it's about.

> which is quite
> long and would cause major issues in formatting etc.

Well, we have rules about how to deal with the formatting issues.

> What advantage do you see in removing that?

For me, it's confusing, when looking at, say, 'OMP_CLAUSE_FIRSTPRIVATE'
code, that in 'gcc/gimplify.c' we call
'lang_hooks.decls.omp_privatize_by_reference', whereas in 'gcc/omp-*.c'
files we call 'omp_is_reference' -- but both actually mean the same
thing.

> > wonder and have to look up what special things it might be doing -- but
> > it actually isn't.
> > 
> > 	gcc/
> >         * omp-general.c (omp_is_reference): Don't define.  Adjust all users.

Or, of course, the other way round:

	gcc/
        * gimplify.c: Use omp_is_reference.

Or, even more preferably:

	gcc/
	* omp-general.c (omp_is_reference): Rename to...
        (omp_privatize_by_reference): ... this.  Adjust all users.
        * gimplify.c: Use it.


Grüße
 Thomas

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 658 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2019-05-29 17:12     ` Thomas Schwinge
@ 2021-08-31 14:28       ` Thomas Schwinge
  2021-08-31 14:45         ` Jakub Jelinek
  0 siblings, 1 reply; 11+ messages in thread
From: Thomas Schwinge @ 2021-08-31 14:28 UTC (permalink / raw)
  To: Jakub Jelinek, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 3113 bytes --]

Hi Jakub!

We never finished this dicussion here -- but I ran into this again, last
week:

On 2019-05-29T18:59:46+0200, I wrote:
> On Mon, 27 May 2019 18:49:20 +0200, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Sun, May 26, 2019 at 07:43:04PM +0200, Thomas Schwinge wrote:
>> > On Tue, 18 Oct 2005 03:01:40 -0400, Jakub Jelinek <jakub@redhat.com> wrote:
>> > > --- gcc/omp-low.c.jj     2005-10-15 12:00:06.000000000 +0200
>> > > +++ gcc/omp-low.c        2005-10-18 08:46:23.000000000 +0200
>> > > @@ -126,7 +126,7 @@ is_variable_sized (tree expr)
>> > >  static inline bool
>> > >  is_reference (tree decl)
>> > >  {
>> > > -  return TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE;
>> > > +  return lang_hooks.decls.omp_privatize_by_reference (decl);
>> > >  }
>> >
>> > With the same implementation, this function nowadays is known as
>> > 'omp_is_reference' ('gcc/omp-general.c'), and is used in 'omp-*' files
>> > only.  The gimplifier directly calls
>> > 'lang_hooks.decls.omp_privatize_by_reference'.
>> >
>> > Will it be OK to commit the obvious patch to get rid of the
>> > 'omp_is_reference' function?  Whenever I see it used in 'omp-*' files, I
>>
>> No, omp_is_reference (something) is certainly more readable from
>> lang_hooks.decls.omp_privatize_by_reference (something)
>
> Yes, better readable because it's shorter, but you have to look up its
> meaning, whereas with 'lang_hooks.decls.omp_privatize_by_reference' you
> directly see what it's about.
>
>> which is quite
>> long and would cause major issues in formatting etc.

(Actually, my proposed change: 'omp_is_reference' ->
'lang_hooks.decls.omp_privatize_by_reference' would not "cause major
issues in formatting etc.": very most of the affected source code lines
are not going to overflow.)

>> What advantage do you see in removing that?
>
> For me, it's confusing, when looking at, say, 'OMP_CLAUSE_FIRSTPRIVATE'
> code, that in 'gcc/gimplify.c' we call
> 'lang_hooks.decls.omp_privatize_by_reference', whereas in 'gcc/omp-*.c'
> files we call 'omp_is_reference' -- but both actually mean the same
> thing.
>
>> > wonder and have to look up what special things it might be doing -- but
>> > it actually isn't.
>> >
>> >    gcc/
>> >         * omp-general.c (omp_is_reference): Don't define.  Adjust all users.
>
> Or, of course, the other way round:
>
>       gcc/
>         * gimplify.c: Use omp_is_reference.
>
> Or, even more preferably:
>
>       gcc/
>       * omp-general.c (omp_is_reference): Rename to...
>         (omp_privatize_by_reference): ... this.  Adjust all users.
>         * gimplify.c: Use it.

The latter one is what I had implemented and now tested: is the attached
"[OMP] Standardize on 'omp_privatize_by_reference'" OK to push to master
branch?


Grüße
 Thomas


-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-OMP-Standardize-on-omp_privatize_by_reference.patch --]
[-- Type: text/x-diff, Size: 33170 bytes --]

From fb29fe81b4c8e880b32d68351385d8a42c97934b Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <thomas@codesourcery.com>
Date: Wed, 29 May 2019 18:59:46 +0200
Subject: [PATCH] [OMP] Standardize on 'omp_privatize_by_reference'

... instead of 'omp_is_reference' vs.
'lang_hooks.decls.omp_privatize_by_reference'.

	gcc/
	* omp-general.h (omp_is_reference): Rename to...
	(omp_privatize_by_reference): ... this.  Adjust all users...
	* omp-general.c: ... here, ...
	* gimplify.c: ... here, ...
	* omp-expand.c: ... here, ...
	* omp-low.c: ... here.
---
 gcc/gimplify.c    |  17 ++---
 gcc/omp-expand.c  |   9 +--
 gcc/omp-general.c |   5 +-
 gcc/omp-general.h |   2 +-
 gcc/omp-low.c     | 154 ++++++++++++++++++++++++----------------------
 5 files changed, 98 insertions(+), 89 deletions(-)

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 070d0e4df45..cab4089192a 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1831,7 +1831,8 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
 	      gimplify_and_add (init, seq_p);
 	      ggc_free (init);
 	      /* Clear TREE_READONLY if we really have an initialization.  */
-	      if (!DECL_INITIAL (decl) && !omp_is_reference (decl))
+	      if (!DECL_INITIAL (decl)
+		  && !omp_privatize_by_reference (decl))
 		TREE_READONLY (decl) = 0;
 	    }
 	  else
@@ -7064,7 +7065,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
 	omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
     }
   else if ((flags & (GOVD_MAP | GOVD_LOCAL)) == 0
-	   && lang_hooks.decls.omp_privatize_by_reference (decl))
+	   && omp_privatize_by_reference (decl))
     {
       omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
 
@@ -7322,7 +7323,7 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
   bool declared = is_oacc_declared (decl);
   tree type = TREE_TYPE (decl);
 
-  if (lang_hooks.decls.omp_privatize_by_reference (decl))
+  if (omp_privatize_by_reference (decl))
     type = TREE_TYPE (type);
 
   /* For Fortran COMMON blocks, only used variables in those blocks are
@@ -7586,7 +7587,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
 	      tree type = TREE_TYPE (decl);
 
 	      if (gimplify_omp_ctxp->target_firstprivatize_array_bases
-		  && lang_hooks.decls.omp_privatize_by_reference (decl))
+		  && omp_privatize_by_reference (decl))
 		type = TREE_TYPE (type);
 	      if (!lang_hooks.types.omp_mappable_type (type))
 		{
@@ -7660,7 +7661,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
 	  n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
 	  n2->value |= GOVD_SEEN;
 	}
-      else if (lang_hooks.decls.omp_privatize_by_reference (decl)
+      else if (omp_privatize_by_reference (decl)
 	       && TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)))
 	       && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))))
 		   != INTEGER_CST))
@@ -7785,7 +7786,7 @@ omp_check_private (struct gimplify_omp_ctx *ctx, tree decl, bool copyprivate)
 	  if (copyprivate)
 	    return true;
 
-	  if (lang_hooks.decls.omp_privatize_by_reference (decl))
+	  if (omp_privatize_by_reference (decl))
 	    return false;
 
 	  /* Treat C++ privatized non-static data members outside
@@ -10373,7 +10374,7 @@ omp_shared_to_firstprivate_optimizable_decl_p (tree decl)
   HOST_WIDE_INT len = int_size_in_bytes (type);
   if (len == -1 || len > 4 * POINTER_SIZE / BITS_PER_UNIT)
     return false;
-  if (lang_hooks.decls.omp_privatize_by_reference (decl))
+  if (omp_privatize_by_reference (decl))
     return false;
   return true;
 }
@@ -10698,7 +10699,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
 	  OMP_CLAUSE_CHAIN (clause) = nc;
 	}
       else if (gimplify_omp_ctxp->target_firstprivatize_array_bases
-	       && lang_hooks.decls.omp_privatize_by_reference (decl))
+	       && omp_privatize_by_reference (decl))
 	{
 	  OMP_CLAUSE_DECL (clause) = build_simple_mem_ref (decl);
 	  OMP_CLAUSE_SIZE (clause)
diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
index 66c64f5a37b..7ce0663ba70 100644
--- a/gcc/omp-expand.c
+++ b/gcc/omp-expand.c
@@ -4232,9 +4232,8 @@ expand_omp_for_generic (struct omp_region *region,
 	  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
 	{
 	  tree d = OMP_CLAUSE_DECL (c);
-	  bool is_ref = omp_is_reference (d);
 	  tree t = d, a, dest;
-	  if (is_ref)
+	  if (omp_privatize_by_reference (t))
 	    t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c), t);
 	  tree type = TREE_TYPE (t);
 	  if (POINTER_TYPE_P (type))
@@ -5236,9 +5235,8 @@ expand_omp_for_static_nochunk (struct omp_region *region,
 	  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
 	{
 	  tree d = OMP_CLAUSE_DECL (c);
-	  bool is_ref = omp_is_reference (d);
 	  tree t = d, a, dest;
-	  if (is_ref)
+	  if (omp_privatize_by_reference (t))
 	    t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c), t);
 	  if (itercnt == NULL_TREE)
 	    {
@@ -5952,9 +5950,8 @@ expand_omp_for_static_chunk (struct omp_region *region,
 	  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
 	{
 	  tree d = OMP_CLAUSE_DECL (c);
-	  bool is_ref = omp_is_reference (d);
 	  tree t = d, a, dest;
-	  if (is_ref)
+	  if (omp_privatize_by_reference (t))
 	    t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c), t);
 	  tree type = TREE_TYPE (t);
 	  if (POINTER_TYPE_P (type))
diff --git a/gcc/omp-general.c b/gcc/omp-general.c
index b46a537e281..cc6aecb1d66 100644
--- a/gcc/omp-general.c
+++ b/gcc/omp-general.c
@@ -79,10 +79,11 @@ omp_check_optional_argument (tree decl, bool for_present_check)
   return lang_hooks.decls.omp_check_optional_argument (decl, for_present_check);
 }
 
-/* Return true if DECL is a reference type.  */
+/* True if OpenMP should privatize what this DECL points to rather
+   than the DECL itself.  */
 
 bool
-omp_is_reference (tree decl)
+omp_privatize_by_reference (tree decl)
 {
   return lang_hooks.decls.omp_privatize_by_reference (decl);
 }
diff --git a/gcc/omp-general.h b/gcc/omp-general.h
index 5c3e0f0e205..6a1468d2798 100644
--- a/gcc/omp-general.h
+++ b/gcc/omp-general.h
@@ -93,7 +93,7 @@ struct omp_for_data
 extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
 extern bool omp_is_allocatable_or_ptr (tree decl);
 extern tree omp_check_optional_argument (tree decl, bool for_present_check);
-extern bool omp_is_reference (tree decl);
+extern bool omp_privatize_by_reference (tree decl);
 extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
 				      tree *n2, tree v, tree step);
 extern tree omp_get_for_step_from_incr (location_t loc, tree incr);
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index a0b41afa3eb..bbade6f1eb8 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -736,7 +736,7 @@ build_outer_var_ref (tree var, omp_context *ctx,
     }
   else if (outer)
     x = lookup_decl (var, outer);
-  else if (omp_is_reference (var))
+  else if (omp_privatize_by_reference (var))
     /* This can happen with orphaned constructs.  If var is reference, it is
        possible it is shared and as such valid.  */
     x = var;
@@ -759,7 +759,7 @@ build_outer_var_ref (tree var, omp_context *ctx,
 	}
     }
 
-  if (omp_is_reference (var))
+  if (omp_privatize_by_reference (var))
     x = build_simple_mem_ref (x);
 
   return x;
@@ -824,7 +824,8 @@ install_var_field (tree var, bool by_ref, int mask, omp_context *ctx)
     }
   else if (by_ref)
     type = build_pointer_type (type);
-  else if ((mask & (32 | 3)) == 1 && omp_is_reference (var))
+  else if ((mask & (32 | 3)) == 1
+	   && omp_privatize_by_reference (var))
     type = TREE_TYPE (type);
 
   field = build_decl (DECL_SOURCE_LOCATION (var),
@@ -1217,7 +1218,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
 	  if ((! TREE_READONLY (decl) && !OMP_CLAUSE_SHARED_READONLY (c))
 	      || TREE_ADDRESSABLE (decl)
 	      || by_ref
-	      || omp_is_reference (decl))
+	      || omp_privatize_by_reference (decl))
 	    {
 	      by_ref = use_pointer_for_field (decl, ctx);
 	      install_var_field (decl, by_ref, 3, ctx);
@@ -1368,7 +1369,10 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
 	      && is_gimple_omp_offloaded (ctx->stmt))
 	    {
 	      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
-		install_var_field (decl, !omp_is_reference (decl), 3, ctx);
+		{
+		  by_ref = !omp_privatize_by_reference (decl);
+		  install_var_field (decl, by_ref, 3, ctx);
+		}
 	      else if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
 		install_var_field (decl, true, 3, ctx);
 	      else
@@ -1396,7 +1400,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
 	      by_ref = use_pointer_for_field (decl, NULL);
 
 	      if (is_task_ctx (ctx)
-		  && (global || by_ref || omp_is_reference (decl)))
+		  && (global || by_ref || omp_privatize_by_reference (decl)))
 		{
 		  if (ctx->allocate_map
 		      && ctx->allocate_map->get (decl))
@@ -1420,7 +1424,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
 	  if (lang_hooks.decls.omp_array_data (decl, true))
 	    install_var_field (decl, false, 19, ctx);
 	  else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
-		    && !omp_is_reference (decl)
+		    && !omp_privatize_by_reference (decl)
 		    && !omp_is_allocatable_or_ptr (decl))
 		   || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
 	    install_var_field (decl, true, 11, ctx);
@@ -4694,7 +4698,7 @@ lower_private_allocate (tree var, tree new_var, tree &allocator,
       allocator = *allocatorp;
   if (allocator == NULL_TREE)
     return false;
-  if (!is_ref && omp_is_reference (var))
+  if (!is_ref && omp_privatize_by_reference (var))
     {
       allocator = NULL_TREE;
       return false;
@@ -4792,7 +4796,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 	case OMP_CLAUSE_LASTPRIVATE:
 	  if (is_variable_sized (OMP_CLAUSE_DECL (c)))
 	    sctx.max_vf = 1;
-	  else if (omp_is_reference (OMP_CLAUSE_DECL (c)))
+	  else if (omp_privatize_by_reference (OMP_CLAUSE_DECL (c)))
 	    {
 	      tree rtype = TREE_TYPE (TREE_TYPE (OMP_CLAUSE_DECL (c)));
 	      if (!TREE_CONSTANT (TYPE_SIZE_UNIT (rtype)))
@@ -4804,7 +4808,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 	  if (TREE_CODE (OMP_CLAUSE_DECL (c)) == MEM_REF
 	      || is_variable_sized (OMP_CLAUSE_DECL (c)))
 	    sctx.max_vf = 1;
-	  else if (omp_is_reference (OMP_CLAUSE_DECL (c)))
+	  else if (omp_privatize_by_reference (OMP_CLAUSE_DECL (c)))
 	    {
 	      tree rtype = TREE_TYPE (TREE_TYPE (OMP_CLAUSE_DECL (c)));
 	      if (!TREE_CONSTANT (TYPE_SIZE_UNIT (rtype)))
@@ -4966,7 +4970,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 			 original address, it is always the address of the
 			 global variable itself.  */
 		      if (!DECL_P (var)
-			  || omp_is_reference (var)
+			  || omp_privatize_by_reference (var)
 			  || !is_global_var
 				(maybe_lookup_decl_in_outer_ctx (var, ctx)))
 			{
@@ -5407,10 +5411,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		      tree ref = build_outer_var_ref (var, ctx);
 		      /* For ref build_outer_var_ref already performs this.  */
 		      if (TREE_CODE (d) == INDIRECT_REF)
-			gcc_assert (omp_is_reference (var));
+			gcc_assert (omp_privatize_by_reference (var));
 		      else if (TREE_CODE (d) == ADDR_EXPR)
 			ref = build_fold_addr_expr (ref);
-		      else if (omp_is_reference (var))
+		      else if (omp_privatize_by_reference (var))
 			ref = build_fold_addr_expr (ref);
 		      ref = fold_convert_loc (clause_loc, ptype, ref);
 		      if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)
@@ -5557,7 +5561,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		  bool by_ref = use_pointer_for_field (var, ctx);
 		  x = build_receiver_ref (var, by_ref, ctx);
 		}
-	      if (!omp_is_reference (var))
+	      if (!omp_privatize_by_reference (var))
 		x = build_fold_addr_expr (x);
 	      x = fold_convert (ptr_type_node, x);
 	      unsigned cnt = task_reduction_cnt - 1;
@@ -5573,7 +5577,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 	  else if (pass == 3)
 	    {
 	      tree type = TREE_TYPE (new_var);
-	      if (!omp_is_reference (var))
+	      if (!omp_privatize_by_reference (var))
 		type = build_pointer_type (type);
 	      if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_REDUCTION)
 		{
@@ -5601,7 +5605,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		}
 	      x = fold_convert (type, x);
 	      tree t;
-	      if (omp_is_reference (var))
+	      if (omp_privatize_by_reference (var))
 		{
 		  gimplify_assign (new_var, x, ilist);
 		  t = new_var;
@@ -5662,7 +5666,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		  gimplify_assign (ptr, x, ilist);
 		}
 	    }
-	  else if (omp_is_reference (var)
+	  else if (omp_privatize_by_reference (var)
 		   && (c_kind != OMP_CLAUSE_FIRSTPRIVATE
 		       || !OMP_CLAUSE_FIRSTPRIVATE_NO_REFERENCE (c)))
 	    {
@@ -5827,11 +5831,11 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 			       || (gimple_omp_for_index (ctx->stmt, 0)
 				   != new_var)))
 		       || OMP_CLAUSE_CODE (c) == OMP_CLAUSE__CONDTEMP_
-		       || omp_is_reference (var))
+		       || omp_privatize_by_reference (var))
 		      && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
 						       ivar, lvar))
 		    {
-		      if (omp_is_reference (var))
+		      if (omp_privatize_by_reference (var))
 			{
 			  gcc_assert (TREE_CODE (new_var) == MEM_REF);
 			  tree new_vard = TREE_OPERAND (new_var, 0);
@@ -5917,7 +5921,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 			}
 		      break;
 		    }
-		  if (omp_is_reference (var))
+		  if (omp_privatize_by_reference (var))
 		    {
 		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
 		      tree new_vard = TREE_OPERAND (new_var, 0);
@@ -5987,7 +5991,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 	    case OMP_CLAUSE_FIRSTPRIVATE:
 	      if (is_task_ctx (ctx))
 		{
-		  if ((omp_is_reference (var)
+		  if ((omp_privatize_by_reference (var)
 		       && !OMP_CLAUSE_FIRSTPRIVATE_NO_REFERENCE (c))
 		      || is_variable_sized (var))
 		    goto do_dtor;
@@ -6014,7 +6018,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		    }
 		}
 	      if (OMP_CLAUSE_FIRSTPRIVATE_NO_REFERENCE (c)
-		  && omp_is_reference (var))
+		  && omp_privatize_by_reference (var))
 		{
 		  x = build_outer_var_ref (var, ctx);
 		  gcc_assert (TREE_CODE (x) == MEM_REF
@@ -6059,7 +6063,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 
 		      if (OMP_CLAUSE_LINEAR_ARRAY (c))
 			{
-			  if (omp_is_reference (var))
+			  if (omp_privatize_by_reference (var))
 			    {
 			      gcc_assert (TREE_CODE (new_var) == MEM_REF);
 			      tree new_vard = TREE_OPERAND (new_var, 0);
@@ -6096,11 +6100,11 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 
 		  if ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR
 		       || TREE_ADDRESSABLE (new_var)
-		       || omp_is_reference (var))
+		       || omp_privatize_by_reference (var))
 		      && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
 						       ivar, lvar))
 		    {
-		      if (omp_is_reference (var))
+		      if (omp_privatize_by_reference (var))
 			{
 			  gcc_assert (TREE_CODE (new_var) == MEM_REF);
 			  tree new_vard = TREE_OPERAND (new_var, 0);
@@ -6137,7 +6141,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 			gimplify_and_add (x, &llist[1]);
 		      break;
 		    }
-		  if (omp_is_reference (var))
+		  if (omp_privatize_by_reference (var))
 		    {
 		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
 		      tree new_vard = TREE_OPERAND (new_var, 0);
@@ -6220,14 +6224,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 					      NULL_TREE);
 		      x = build_outer_var_ref (var, ctx);
 
-		      if (omp_is_reference (var)
+		      if (omp_privatize_by_reference (var)
 			  && !useless_type_conversion_p (ptype, TREE_TYPE (x)))
 			x = build_fold_addr_expr_loc (clause_loc, x);
 		    }
 		  SET_DECL_VALUE_EXPR (placeholder, x);
 		  DECL_HAS_VALUE_EXPR_P (placeholder) = 1;
 		  tree new_vard = new_var;
-		  if (omp_is_reference (var))
+		  if (omp_privatize_by_reference (var))
 		    {
 		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
 		      new_vard = TREE_OPERAND (new_var, 0);
@@ -6387,7 +6391,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		     for it because it is undesirable if SIMD arrays are used.
 		     But if they aren't used, we need to emit the deferred
 		     initialization now.  */
-		  else if (omp_is_reference (var) && is_simd)
+		  else if (omp_privatize_by_reference (var) && is_simd)
 		    handle_simd_reference (clause_loc, new_vard, ilist);
 
 		  tree lab2 = NULL_TREE;
@@ -6582,7 +6586,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		  bool is_truth_op
 		    = (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR);
 		  tree new_vard = new_var;
-		  if (is_simd && omp_is_reference (var))
+		  if (is_simd && omp_privatize_by_reference (var))
 		    {
 		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
 		      new_vard = TREE_OPERAND (new_var, 0);
@@ -6653,7 +6657,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
 		      lower_private_allocate (var, new_var, allocator,
 					      allocate_ptr, ilist, ctx,
 					      false, NULL_TREE);
-		      if (omp_is_reference (var) && is_simd)
+		      if (omp_privatize_by_reference (var) && is_simd)
 			handle_simd_reference (clause_loc, new_vard, ilist);
 		      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
 			  && OMP_CLAUSE_REDUCTION_INSCAN (c))
@@ -7254,7 +7258,7 @@ lower_lastprivate_clauses (tree clauses, tree predicate, gimple_seq *body_p,
 	    }
 	  if (!x)
 	    x = build_outer_var_ref (var, ctx, OMP_CLAUSE_LASTPRIVATE);
-	  if (omp_is_reference (var))
+	  if (omp_privatize_by_reference (var))
 	    new_var = build_simple_mem_ref_loc (clause_loc, new_var);
 	  x = lang_hooks.decls.omp_clause_assign_op (c, x, new_var);
 	  gimplify_and_add (x, this_stmt_list);
@@ -7400,7 +7404,7 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
 		&& maybe_lookup_field (orig, outer) && !is_private)
 	      {
 		ref_to_res = build_receiver_ref (orig, false, outer);
-		if (omp_is_reference (orig))
+		if (omp_privatize_by_reference (orig))
 		  ref_to_res = build_simple_mem_ref (ref_to_res);
 
 		tree type = TREE_TYPE (var);
@@ -7430,7 +7434,7 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
 	if (!ref_to_res)
 	  ref_to_res = integer_zero_node;
 
-	if (omp_is_reference (orig))
+	if (omp_privatize_by_reference (orig))
 	  {
 	    tree type = TREE_TYPE (var);
 	    const char *id = IDENTIFIER_POINTER (DECL_NAME (var));
@@ -7610,7 +7614,8 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
 	    }
 	}
       new_var = lookup_decl (var, ctx);
-      if (var == OMP_CLAUSE_DECL (c) && omp_is_reference (var))
+      if (var == OMP_CLAUSE_DECL (c)
+	  && omp_privatize_by_reference (var))
 	new_var = build_simple_mem_ref_loc (clause_loc, new_var);
       ref = build_outer_var_ref (var, ctx, ccode);
       code = OMP_CLAUSE_REDUCTION_CODE (c);
@@ -7679,7 +7684,8 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
 	  if (TREE_CODE (d) == INDIRECT_REF)
 	    {
 	      new_var = build_simple_mem_ref_loc (clause_loc, new_var);
-	      gcc_assert (omp_is_reference (var) && var == orig_var);
+	      gcc_assert (omp_privatize_by_reference (var)
+			  && var == orig_var);
 	    }
 	  else if (TREE_CODE (d) == ADDR_EXPR)
 	    {
@@ -7692,7 +7698,7 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
 	  else
 	    {
 	      gcc_assert (orig_var == var);
-	      if (omp_is_reference (var))
+	      if (omp_privatize_by_reference (var))
 		ref = build_fold_addr_expr (ref);
 	    }
 	  if (DECL_P (v))
@@ -7778,7 +7784,7 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
 	{
 	  tree placeholder = OMP_CLAUSE_REDUCTION_PLACEHOLDER (c);
 
-	  if (omp_is_reference (var)
+	  if (omp_privatize_by_reference (var)
 	      && !useless_type_conversion_p (TREE_TYPE (placeholder),
 					     TREE_TYPE (ref)))
 	    ref = build_fold_addr_expr_loc (clause_loc, ref);
@@ -7864,7 +7870,7 @@ lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist,
 				  ref);
 	  ref = build_fold_indirect_ref_loc (clause_loc, ref);
 	}
-      if (omp_is_reference (var))
+      if (omp_privatize_by_reference (var))
 	{
 	  ref = fold_convert_loc (clause_loc, TREE_TYPE (new_var), ref);
 	  ref = build_simple_mem_ref_loc (clause_loc, ref);
@@ -8017,7 +8023,7 @@ lower_send_clauses (tree clauses, gimple_seq *ilist, gimple_seq *olist,
 	  break;
 
 	case OMP_CLAUSE_LASTPRIVATE:
-	  if (by_ref || omp_is_reference (val))
+	  if (by_ref || omp_privatize_by_reference (val))
 	    {
 	      if (OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c))
 		continue;
@@ -8039,7 +8045,7 @@ lower_send_clauses (tree clauses, gimple_seq *ilist, gimple_seq *olist,
 	      if (is_task_ctx (ctx))
 		by_ref = use_pointer_for_field (val, ctx);
 	      else
-		do_out = !(by_ref || omp_is_reference (val));
+		do_out = !(by_ref || omp_privatize_by_reference (val));
 	    }
 	  else
 	    by_ref = TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE;
@@ -8913,7 +8919,7 @@ omp_task_reduction_iterate (int pass, enum tree_code code,
 	}
       else
 	{
-	  if (omp_is_reference (*decl))
+	  if (omp_privatize_by_reference (*decl))
 	    *type = TREE_TYPE (*type);
 	  if (pass != (!TREE_CONSTANT (TYPE_SIZE_UNIT (*type))))
 	    continue;
@@ -9201,7 +9207,7 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
 	  else
 	    {
 	      t = ref = maybe_lookup_decl_in_outer_ctx (var, ctx);
-	      if (!omp_is_reference (decl))
+	      if (!omp_privatize_by_reference (decl))
 		t = build_fold_addr_expr (t);
 	    }
 	  t = fold_convert (pointer_sized_int_node, t);
@@ -9284,7 +9290,8 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
 			      build_simple_mem_ref (ptr), field, NULL_TREE);
 
 	  enum tree_code rcode = OMP_CLAUSE_REDUCTION_CODE (c);
-	  if (TREE_CODE (decl) != MEM_REF && omp_is_reference (decl))
+	  if (TREE_CODE (decl) != MEM_REF
+	      && omp_privatize_by_reference (decl))
 	    ref = build_simple_mem_ref (ref);
 	  /* reduction(-:var) sums up the partial results, so it acts
 	     identically to reduction(+:var).  */
@@ -9400,7 +9407,7 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
 		  gimple_seq_add_stmt (end, g);
 		  gimple_seq_add_stmt (end, gimple_build_label (lab5));
 		}
-	      if (omp_is_reference (decl)
+	      if (omp_privatize_by_reference (decl)
 		  && !useless_type_conversion_p (TREE_TYPE (placeholder),
 						 TREE_TYPE (ref)))
 		ref = build_fold_addr_expr_loc (OMP_CLAUSE_LOCATION (c), ref);
@@ -9414,7 +9421,7 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
 	      gcc_assert (d);
 	      if (DECL_HAS_VALUE_EXPR_P (d))
 		oldv = DECL_VALUE_EXPR (d);
-	      if (omp_is_reference (var))
+	      if (omp_privatize_by_reference (var))
 		{
 		  tree v = fold_convert (TREE_TYPE (d),
 					 build_fold_addr_expr (new_var));
@@ -9986,7 +9993,7 @@ lower_omp_scan (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    tree var4 = NULL_TREE;
 	    tree lane0 = NULL_TREE;
 	    tree new_vard = new_var;
-	    if (omp_is_reference (var))
+	    if (omp_privatize_by_reference (var))
 	      {
 		new_var = build_simple_mem_ref_loc (clause_loc, new_var);
 		val = new_var;
@@ -10853,7 +10860,7 @@ lower_omp_for_scan (gimple_seq *body_p, gimple_seq *dlist, gomp_for *stmt,
 	tree new_var = lookup_decl (var, ctx);
 	tree var3 = NULL_TREE;
 	tree new_vard = new_var;
-	if (omp_is_reference (var))
+	if (omp_privatize_by_reference (var))
 	  new_var = build_simple_mem_ref_loc (clause_loc, new_var);
 	if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
 	  {
@@ -12026,7 +12033,8 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx)
 	      sf = *tcctx.cb.decl_map->get (sf);
 	    src = build_simple_mem_ref_loc (loc, sarg);
 	    src = omp_build_component_ref (src, sf);
-	    if (use_pointer_for_field (decl, NULL) || omp_is_reference (decl))
+	    if (use_pointer_for_field (decl, NULL)
+		|| omp_privatize_by_reference (decl))
 	      src = build_simple_mem_ref_loc (loc, src);
 	  }
 	else
@@ -12646,7 +12654,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
 	      {
 		gcc_assert (is_gimple_omp_oacc (ctx->stmt));
-		if (omp_is_reference (new_var)
+		if (omp_privatize_by_reference (new_var)
 		    && (TREE_CODE (TREE_TYPE (new_var)) != POINTER_TYPE
 		        || DECL_BY_REFERENCE (var)))
 		  {
@@ -12684,7 +12692,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	  }
 	map_cnt++;
 	var = OMP_CLAUSE_DECL (c);
-	if (!omp_is_reference (var)
+	if (!omp_privatize_by_reference (var)
 	    && !is_gimple_reg_type (TREE_TYPE (var)))
 	  {
 	    tree new_var = lookup_decl (var, ctx);
@@ -12751,7 +12759,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    DECL_HAS_VALUE_EXPR_P (new_var) = 1;
 	  }
 	else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
-		  && !omp_is_reference (var)
+		  && !omp_privatize_by_reference (var)
 		  && !omp_is_allocatable_or_ptr (var)
 		  && !lang_hooks.decls.omp_array_data (var, true))
 		 || TREE_CODE (TREE_TYPE (var)) == ARRAY_TYPE)
@@ -12974,7 +12982,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 		else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
 		  {
 		    gcc_assert (is_gimple_omp_oacc (ctx->stmt));
-		    if (!omp_is_reference (var))
+		    if (!omp_privatize_by_reference (var))
 		      {
 			if (is_gimple_reg (var)
 			    && OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c))
@@ -13137,7 +13145,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    if (is_gimple_omp_oacc (ctx->stmt))
 	      goto oacc_firstprivate_map;
 	    ovar = OMP_CLAUSE_DECL (c);
-	    if (omp_is_reference (ovar))
+	    if (omp_privatize_by_reference (ovar))
 	      talign = TYPE_ALIGN_UNIT (TREE_TYPE (TREE_TYPE (ovar)));
 	    else
 	      talign = DECL_ALIGN_UNIT (ovar);
@@ -13145,7 +13153,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    x = build_sender_ref (ovar, ctx);
 	    tkind = GOMP_MAP_FIRSTPRIVATE;
 	    type = TREE_TYPE (ovar);
-	    if (omp_is_reference (ovar))
+	    if (omp_privatize_by_reference (ovar))
 	      type = TREE_TYPE (type);
 	    if ((INTEGRAL_TYPE_P (type)
 		 && TYPE_PRECISION (type) <= POINTER_SIZE)
@@ -13153,7 +13161,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	      {
 		tkind = GOMP_MAP_FIRSTPRIVATE_INT;
 		tree t = var;
-		if (omp_is_reference (var))
+		if (omp_privatize_by_reference (var))
 		  t = build_simple_mem_ref (var);
 		else if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c))
 		  suppress_warning (var);
@@ -13162,7 +13170,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 		t = fold_convert (TREE_TYPE (x), t);
 		gimplify_assign (x, t, &ilist);
 	      }
-	    else if (omp_is_reference (var))
+	    else if (omp_privatize_by_reference (var))
 	      gimplify_assign (x, var, &ilist);
 	    else if (is_gimple_reg (var))
 	      {
@@ -13181,7 +13189,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	      }
 	    if (tkind == GOMP_MAP_FIRSTPRIVATE_INT)
 	      s = size_int (0);
-	    else if (omp_is_reference (ovar))
+	    else if (omp_privatize_by_reference (ovar))
 	      s = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ovar)));
 	    else
 	      s = TYPE_SIZE_UNIT (TREE_TYPE (ovar));
@@ -13236,13 +13244,13 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    if (lang_hooks.decls.omp_array_data (ovar, true))
 	      var = lang_hooks.decls.omp_array_data (ovar, false);
 	    else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
-		      && !omp_is_reference (ovar)
+		      && !omp_privatize_by_reference (ovar)
 		      && !omp_is_allocatable_or_ptr (ovar))
 		     || TREE_CODE (type) == ARRAY_TYPE)
 	      var = build_fold_addr_expr (var);
 	    else
 	      {
-		if (omp_is_reference (ovar)
+		if (omp_privatize_by_reference (ovar)
 		    || omp_check_optional_argument (ovar, false)
 		    || omp_is_allocatable_or_ptr (ovar))
 		  {
@@ -13251,7 +13259,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 			&& TREE_CODE (type) != ARRAY_TYPE
 			&& ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_USE_DEVICE_ADDR
 			    && !omp_is_allocatable_or_ptr (ovar))
-			   || (omp_is_reference (ovar)
+			   || (omp_privatize_by_reference (ovar)
 			       && omp_is_allocatable_or_ptr (ovar))))
 		      var = build_simple_mem_ref (var);
 		    var = fold_convert (TREE_TYPE (x), var);
@@ -13366,13 +13374,13 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    if (is_gimple_omp_oacc (ctx->stmt))
 	      break;
 	    var = OMP_CLAUSE_DECL (c);
-	    if (omp_is_reference (var)
+	    if (omp_privatize_by_reference (var)
 		|| is_gimple_reg_type (TREE_TYPE (var)))
 	      {
 		tree new_var = lookup_decl (var, ctx);
 		tree type;
 		type = TREE_TYPE (var);
-		if (omp_is_reference (var))
+		if (omp_privatize_by_reference (var))
 		  type = TREE_TYPE (type);
 		if ((INTEGRAL_TYPE_P (type)
 		     && TYPE_PRECISION (type) <= POINTER_SIZE)
@@ -13384,7 +13392,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 		    x = fold_convert (type, x);
 		    gimplify_expr (&x, &new_body, NULL, is_gimple_val,
 				   fb_rvalue);
-		    if (omp_is_reference (var))
+		    if (omp_privatize_by_reference (var))
 		      {
 			tree v = create_tmp_var_raw (type, get_name (var));
 			gimple_add_tmp_var (v);
@@ -13398,7 +13406,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 		  }
 		else
 		  {
-		    x = build_receiver_ref (var, !omp_is_reference (var), ctx);
+		    bool by_ref = !omp_privatize_by_reference (var);
+		    x = build_receiver_ref (var, by_ref, ctx);
 		    gimplify_expr (&x, &new_body, NULL, is_gimple_val,
 				   fb_rvalue);
 		    gimple_seq_add_stmt (&new_body,
@@ -13422,7 +13431,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	    if (is_gimple_omp_oacc (ctx->stmt))
 	      break;
 	    var = OMP_CLAUSE_DECL (c);
-	    if (omp_is_reference (var))
+	    if (omp_privatize_by_reference (var))
 	      {
 		location_t clause_loc = OMP_CLAUSE_LOCATION (c);
 		tree new_var = lookup_decl (var, ctx);
@@ -13465,7 +13474,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 
 	    if (is_array_data)
 	      {
-		bool is_ref = omp_is_reference (var);
+		bool is_ref = omp_privatize_by_reference (var);
 		do_optional_check = true;
 		/* First, we copy the descriptor data from the host; then
 		   we update its data to point to the target address.  */
@@ -13509,7 +13518,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 				     gimple_build_assign (new_var, x));
 	      }
 	    else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
-		      && !omp_is_reference (var)
+		      && !omp_privatize_by_reference (var)
 		      && !omp_is_allocatable_or_ptr (var))
 		     || TREE_CODE (TREE_TYPE (var)) == ARRAY_TYPE)
 	      {
@@ -13526,13 +13535,13 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 	      {
 		tree type = TREE_TYPE (var);
 		new_var = lookup_decl (var, ctx);
-		if (omp_is_reference (var))
+		if (omp_privatize_by_reference (var))
 		  {
 		    type = TREE_TYPE (type);
 		    if (POINTER_TYPE_P (type)
 			&& TREE_CODE (type) != ARRAY_TYPE
 			&& (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_USE_DEVICE_ADDR
-			    || (omp_is_reference (var)
+			    || (omp_privatize_by_reference (var)
 				&& omp_is_allocatable_or_ptr (var))))
 		      {
 			tree v = create_tmp_var_raw (type, get_name (var));
@@ -13650,7 +13659,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 						     offset));
 		  }
 		else
-		  is_ref = omp_is_reference (var);
+		  is_ref = omp_privatize_by_reference (var);
 		if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
 		  is_ref = false;
 		bool ref_to_array = false;
@@ -13730,7 +13739,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
 		gimple_seq_add_stmt (&new_body,
 				     gimple_build_assign (new_pvar, x));
 	      }
-	    else if (omp_is_reference (var) && !is_gimple_omp_oacc (ctx->stmt))
+	    else if (omp_privatize_by_reference (var)
+		     && !is_gimple_omp_oacc (ctx->stmt))
 	      {
 		location_t clause_loc = OMP_CLAUSE_LOCATION (c);
 		tree new_var = lookup_decl (var, ctx);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [gomp] Add langhook, so that Fortran can privatize variables by reference
  2021-08-31 14:28       ` Thomas Schwinge
@ 2021-08-31 14:45         ` Jakub Jelinek
  0 siblings, 0 replies; 11+ messages in thread
From: Jakub Jelinek @ 2021-08-31 14:45 UTC (permalink / raw)
  To: Thomas Schwinge; +Cc: gcc-patches

On Tue, Aug 31, 2021 at 04:28:19PM +0200, Thomas Schwinge wrote:
> >From fb29fe81b4c8e880b32d68351385d8a42c97934b Mon Sep 17 00:00:00 2001
> From: Thomas Schwinge <thomas@codesourcery.com>
> Date: Wed, 29 May 2019 18:59:46 +0200
> Subject: [PATCH] [OMP] Standardize on 'omp_privatize_by_reference'
> 
> ... instead of 'omp_is_reference' vs.
> 'lang_hooks.decls.omp_privatize_by_reference'.
> 
> 	gcc/
> 	* omp-general.h (omp_is_reference): Rename to...
> 	(omp_privatize_by_reference): ... this.  Adjust all users...
> 	* omp-general.c: ... here, ...
> 	* gimplify.c: ... here, ...
> 	* omp-expand.c: ... here, ...
> 	* omp-low.c: ... here.

Ok for trunk.

> diff --git a/gcc/gimplify.c b/gcc/gimplify.c
> index 070d0e4df45..cab4089192a 100644
> --- a/gcc/gimplify.c
> +++ b/gcc/gimplify.c
> @@ -1831,7 +1831,8 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
>  	      gimplify_and_add (init, seq_p);
>  	      ggc_free (init);
>  	      /* Clear TREE_READONLY if we really have an initialization.  */
> -	      if (!DECL_INITIAL (decl) && !omp_is_reference (decl))
> +	      if (!DECL_INITIAL (decl)
> +		  && !omp_privatize_by_reference (decl))
>  		TREE_READONLY (decl) = 0;
>  	    }
>  	  else
> @@ -7064,7 +7065,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
>  	omp_notice_variable (ctx, TYPE_SIZE_UNIT (TREE_TYPE (decl)), true);
>      }
>    else if ((flags & (GOVD_MAP | GOVD_LOCAL)) == 0
> -	   && lang_hooks.decls.omp_privatize_by_reference (decl))
> +	   && omp_privatize_by_reference (decl))
>      {
>        omp_firstprivatize_type_sizes (ctx, TREE_TYPE (decl));
>  
> @@ -7322,7 +7323,7 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
>    bool declared = is_oacc_declared (decl);
>    tree type = TREE_TYPE (decl);
>  
> -  if (lang_hooks.decls.omp_privatize_by_reference (decl))
> +  if (omp_privatize_by_reference (decl))
>      type = TREE_TYPE (type);
>  
>    /* For Fortran COMMON blocks, only used variables in those blocks are
> @@ -7586,7 +7587,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
>  	      tree type = TREE_TYPE (decl);
>  
>  	      if (gimplify_omp_ctxp->target_firstprivatize_array_bases
> -		  && lang_hooks.decls.omp_privatize_by_reference (decl))
> +		  && omp_privatize_by_reference (decl))
>  		type = TREE_TYPE (type);
>  	      if (!lang_hooks.types.omp_mappable_type (type))
>  		{
> @@ -7660,7 +7661,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx, tree decl, bool in_code)
>  	  n2 = splay_tree_lookup (ctx->variables, (splay_tree_key) t);
>  	  n2->value |= GOVD_SEEN;
>  	}
> -      else if (lang_hooks.decls.omp_privatize_by_reference (decl)
> +      else if (omp_privatize_by_reference (decl)
>  	       && TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)))
>  	       && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))))
>  		   != INTEGER_CST))
> @@ -7785,7 +7786,7 @@ omp_check_private (struct gimplify_omp_ctx *ctx, tree decl, bool copyprivate)
>  	  if (copyprivate)
>  	    return true;
>  
> -	  if (lang_hooks.decls.omp_privatize_by_reference (decl))
> +	  if (omp_privatize_by_reference (decl))
>  	    return false;
>  
>  	  /* Treat C++ privatized non-static data members outside
> @@ -10373,7 +10374,7 @@ omp_shared_to_firstprivate_optimizable_decl_p (tree decl)
>    HOST_WIDE_INT len = int_size_in_bytes (type);
>    if (len == -1 || len > 4 * POINTER_SIZE / BITS_PER_UNIT)
>      return false;
> -  if (lang_hooks.decls.omp_privatize_by_reference (decl))
> +  if (omp_privatize_by_reference (decl))
>      return false;
>    return true;
>  }
> @@ -10698,7 +10699,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
>  	  OMP_CLAUSE_CHAIN (clause) = nc;
>  	}
>        else if (gimplify_omp_ctxp->target_firstprivatize_array_bases
> -	       && lang_hooks.decls.omp_privatize_by_reference (decl))
> +	       && omp_privatize_by_reference (decl))
>  	{
>  	  OMP_CLAUSE_DECL (clause) = build_simple_mem_ref (decl);
>  	  OMP_CLAUSE_SIZE (clause)
> diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
> index 66c64f5a37b..7ce0663ba70 100644
> --- a/gcc/omp-expand.c
> +++ b/gcc/omp-expand.c
> @@ -4232,9 +4232,8 @@ expand_omp_for_generic (struct omp_region *region,
>  	  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
>  	{
>  	  tree d = OMP_CLAUSE_DECL (c);
> -	  bool is_ref = omp_is_reference (d);
>  	  tree t = d, a, dest;
> -	  if (is_ref)
> +	  if (omp_privatize_by_reference (t))
>  	    t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c), t);
>  	  tree type = TREE_TYPE (t);
>  	  if (POINTER_TYPE_P (type))
> @@ -5236,9 +5235,8 @@ expand_omp_for_static_nochunk (struct omp_region *region,
>  	  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
>  	{
>  	  tree d = OMP_CLAUSE_DECL (c);
> -	  bool is_ref = omp_is_reference (d);
>  	  tree t = d, a, dest;
> -	  if (is_ref)
> +	  if (omp_privatize_by_reference (t))
>  	    t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c), t);
>  	  if (itercnt == NULL_TREE)
>  	    {
> @@ -5952,9 +5950,8 @@ expand_omp_for_static_chunk (struct omp_region *region,
>  	  && !OMP_CLAUSE_LINEAR_NO_COPYIN (c))
>  	{
>  	  tree d = OMP_CLAUSE_DECL (c);
> -	  bool is_ref = omp_is_reference (d);
>  	  tree t = d, a, dest;
> -	  if (is_ref)
> +	  if (omp_privatize_by_reference (t))
>  	    t = build_simple_mem_ref_loc (OMP_CLAUSE_LOCATION (c), t);
>  	  tree type = TREE_TYPE (t);
>  	  if (POINTER_TYPE_P (type))
> diff --git a/gcc/omp-general.c b/gcc/omp-general.c
> index b46a537e281..cc6aecb1d66 100644
> --- a/gcc/omp-general.c
> +++ b/gcc/omp-general.c
> @@ -79,10 +79,11 @@ omp_check_optional_argument (tree decl, bool for_present_check)
>    return lang_hooks.decls.omp_check_optional_argument (decl, for_present_check);
>  }
>  
> -/* Return true if DECL is a reference type.  */
> +/* True if OpenMP should privatize what this DECL points to rather
> +   than the DECL itself.  */
>  
>  bool
> -omp_is_reference (tree decl)
> +omp_privatize_by_reference (tree decl)
>  {
>    return lang_hooks.decls.omp_privatize_by_reference (decl);
>  }
> diff --git a/gcc/omp-general.h b/gcc/omp-general.h
> index 5c3e0f0e205..6a1468d2798 100644
> --- a/gcc/omp-general.h
> +++ b/gcc/omp-general.h
> @@ -93,7 +93,7 @@ struct omp_for_data
>  extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
>  extern bool omp_is_allocatable_or_ptr (tree decl);
>  extern tree omp_check_optional_argument (tree decl, bool for_present_check);
> -extern bool omp_is_reference (tree decl);
> +extern bool omp_privatize_by_reference (tree decl);
>  extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
>  				      tree *n2, tree v, tree step);
>  extern tree omp_get_for_step_from_incr (location_t loc, tree incr);
> diff --git a/gcc/omp-low.c b/gcc/omp-low.c
> index a0b41afa3eb..bbade6f1eb8 100644
> --- a/gcc/omp-low.c
> +++ b/gcc/omp-low.c
> @@ -736,7 +736,7 @@ build_outer_var_ref (tree var, omp_context *ctx,
>      }
>    else if (outer)
>      x = lookup_decl (var, outer);
> -  else if (omp_is_reference (var))
> +  else if (omp_privatize_by_reference (var))
>      /* This can happen with orphaned constructs.  If var is reference, it is
>         possible it is shared and as such valid.  */
>      x = var;
> @@ -759,7 +759,7 @@ build_outer_var_ref (tree var, omp_context *ctx,
>  	}
>      }
>  
> -  if (omp_is_reference (var))
> +  if (omp_privatize_by_reference (var))
>      x = build_simple_mem_ref (x);
>  
>    return x;
> @@ -824,7 +824,8 @@ install_var_field (tree var, bool by_ref, int mask, omp_context *ctx)
>      }
>    else if (by_ref)
>      type = build_pointer_type (type);
> -  else if ((mask & (32 | 3)) == 1 && omp_is_reference (var))
> +  else if ((mask & (32 | 3)) == 1
> +	   && omp_privatize_by_reference (var))
>      type = TREE_TYPE (type);
>  
>    field = build_decl (DECL_SOURCE_LOCATION (var),
> @@ -1217,7 +1218,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
>  	  if ((! TREE_READONLY (decl) && !OMP_CLAUSE_SHARED_READONLY (c))
>  	      || TREE_ADDRESSABLE (decl)
>  	      || by_ref
> -	      || omp_is_reference (decl))
> +	      || omp_privatize_by_reference (decl))
>  	    {
>  	      by_ref = use_pointer_for_field (decl, ctx);
>  	      install_var_field (decl, by_ref, 3, ctx);
> @@ -1368,7 +1369,10 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
>  	      && is_gimple_omp_offloaded (ctx->stmt))
>  	    {
>  	      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
> -		install_var_field (decl, !omp_is_reference (decl), 3, ctx);
> +		{
> +		  by_ref = !omp_privatize_by_reference (decl);
> +		  install_var_field (decl, by_ref, 3, ctx);
> +		}
>  	      else if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
>  		install_var_field (decl, true, 3, ctx);
>  	      else
> @@ -1396,7 +1400,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
>  	      by_ref = use_pointer_for_field (decl, NULL);
>  
>  	      if (is_task_ctx (ctx)
> -		  && (global || by_ref || omp_is_reference (decl)))
> +		  && (global || by_ref || omp_privatize_by_reference (decl)))
>  		{
>  		  if (ctx->allocate_map
>  		      && ctx->allocate_map->get (decl))
> @@ -1420,7 +1424,7 @@ scan_sharing_clauses (tree clauses, omp_context *ctx)
>  	  if (lang_hooks.decls.omp_array_data (decl, true))
>  	    install_var_field (decl, false, 19, ctx);
>  	  else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
> -		    && !omp_is_reference (decl)
> +		    && !omp_privatize_by_reference (decl)
>  		    && !omp_is_allocatable_or_ptr (decl))
>  		   || TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
>  	    install_var_field (decl, true, 11, ctx);
> @@ -4694,7 +4698,7 @@ lower_private_allocate (tree var, tree new_var, tree &allocator,
>        allocator = *allocatorp;
>    if (allocator == NULL_TREE)
>      return false;
> -  if (!is_ref && omp_is_reference (var))
> +  if (!is_ref && omp_privatize_by_reference (var))
>      {
>        allocator = NULL_TREE;
>        return false;
> @@ -4792,7 +4796,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  	case OMP_CLAUSE_LASTPRIVATE:
>  	  if (is_variable_sized (OMP_CLAUSE_DECL (c)))
>  	    sctx.max_vf = 1;
> -	  else if (omp_is_reference (OMP_CLAUSE_DECL (c)))
> +	  else if (omp_privatize_by_reference (OMP_CLAUSE_DECL (c)))
>  	    {
>  	      tree rtype = TREE_TYPE (TREE_TYPE (OMP_CLAUSE_DECL (c)));
>  	      if (!TREE_CONSTANT (TYPE_SIZE_UNIT (rtype)))
> @@ -4804,7 +4808,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  	  if (TREE_CODE (OMP_CLAUSE_DECL (c)) == MEM_REF
>  	      || is_variable_sized (OMP_CLAUSE_DECL (c)))
>  	    sctx.max_vf = 1;
> -	  else if (omp_is_reference (OMP_CLAUSE_DECL (c)))
> +	  else if (omp_privatize_by_reference (OMP_CLAUSE_DECL (c)))
>  	    {
>  	      tree rtype = TREE_TYPE (TREE_TYPE (OMP_CLAUSE_DECL (c)));
>  	      if (!TREE_CONSTANT (TYPE_SIZE_UNIT (rtype)))
> @@ -4966,7 +4970,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  			 original address, it is always the address of the
>  			 global variable itself.  */
>  		      if (!DECL_P (var)
> -			  || omp_is_reference (var)
> +			  || omp_privatize_by_reference (var)
>  			  || !is_global_var
>  				(maybe_lookup_decl_in_outer_ctx (var, ctx)))
>  			{
> @@ -5407,10 +5411,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		      tree ref = build_outer_var_ref (var, ctx);
>  		      /* For ref build_outer_var_ref already performs this.  */
>  		      if (TREE_CODE (d) == INDIRECT_REF)
> -			gcc_assert (omp_is_reference (var));
> +			gcc_assert (omp_privatize_by_reference (var));
>  		      else if (TREE_CODE (d) == ADDR_EXPR)
>  			ref = build_fold_addr_expr (ref);
> -		      else if (omp_is_reference (var))
> +		      else if (omp_privatize_by_reference (var))
>  			ref = build_fold_addr_expr (ref);
>  		      ref = fold_convert_loc (clause_loc, ptype, ref);
>  		      if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c)
> @@ -5557,7 +5561,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		  bool by_ref = use_pointer_for_field (var, ctx);
>  		  x = build_receiver_ref (var, by_ref, ctx);
>  		}
> -	      if (!omp_is_reference (var))
> +	      if (!omp_privatize_by_reference (var))
>  		x = build_fold_addr_expr (x);
>  	      x = fold_convert (ptr_type_node, x);
>  	      unsigned cnt = task_reduction_cnt - 1;
> @@ -5573,7 +5577,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  	  else if (pass == 3)
>  	    {
>  	      tree type = TREE_TYPE (new_var);
> -	      if (!omp_is_reference (var))
> +	      if (!omp_privatize_by_reference (var))
>  		type = build_pointer_type (type);
>  	      if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_REDUCTION)
>  		{
> @@ -5601,7 +5605,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		}
>  	      x = fold_convert (type, x);
>  	      tree t;
> -	      if (omp_is_reference (var))
> +	      if (omp_privatize_by_reference (var))
>  		{
>  		  gimplify_assign (new_var, x, ilist);
>  		  t = new_var;
> @@ -5662,7 +5666,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		  gimplify_assign (ptr, x, ilist);
>  		}
>  	    }
> -	  else if (omp_is_reference (var)
> +	  else if (omp_privatize_by_reference (var)
>  		   && (c_kind != OMP_CLAUSE_FIRSTPRIVATE
>  		       || !OMP_CLAUSE_FIRSTPRIVATE_NO_REFERENCE (c)))
>  	    {
> @@ -5827,11 +5831,11 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  			       || (gimple_omp_for_index (ctx->stmt, 0)
>  				   != new_var)))
>  		       || OMP_CLAUSE_CODE (c) == OMP_CLAUSE__CONDTEMP_
> -		       || omp_is_reference (var))
> +		       || omp_privatize_by_reference (var))
>  		      && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
>  						       ivar, lvar))
>  		    {
> -		      if (omp_is_reference (var))
> +		      if (omp_privatize_by_reference (var))
>  			{
>  			  gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  			  tree new_vard = TREE_OPERAND (new_var, 0);
> @@ -5917,7 +5921,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  			}
>  		      break;
>  		    }
> -		  if (omp_is_reference (var))
> +		  if (omp_privatize_by_reference (var))
>  		    {
>  		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  		      tree new_vard = TREE_OPERAND (new_var, 0);
> @@ -5987,7 +5991,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  	    case OMP_CLAUSE_FIRSTPRIVATE:
>  	      if (is_task_ctx (ctx))
>  		{
> -		  if ((omp_is_reference (var)
> +		  if ((omp_privatize_by_reference (var)
>  		       && !OMP_CLAUSE_FIRSTPRIVATE_NO_REFERENCE (c))
>  		      || is_variable_sized (var))
>  		    goto do_dtor;
> @@ -6014,7 +6018,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		    }
>  		}
>  	      if (OMP_CLAUSE_FIRSTPRIVATE_NO_REFERENCE (c)
> -		  && omp_is_reference (var))
> +		  && omp_privatize_by_reference (var))
>  		{
>  		  x = build_outer_var_ref (var, ctx);
>  		  gcc_assert (TREE_CODE (x) == MEM_REF
> @@ -6059,7 +6063,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  
>  		      if (OMP_CLAUSE_LINEAR_ARRAY (c))
>  			{
> -			  if (omp_is_reference (var))
> +			  if (omp_privatize_by_reference (var))
>  			    {
>  			      gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  			      tree new_vard = TREE_OPERAND (new_var, 0);
> @@ -6096,11 +6100,11 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  
>  		  if ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR
>  		       || TREE_ADDRESSABLE (new_var)
> -		       || omp_is_reference (var))
> +		       || omp_privatize_by_reference (var))
>  		      && lower_rec_simd_input_clauses (new_var, ctx, &sctx,
>  						       ivar, lvar))
>  		    {
> -		      if (omp_is_reference (var))
> +		      if (omp_privatize_by_reference (var))
>  			{
>  			  gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  			  tree new_vard = TREE_OPERAND (new_var, 0);
> @@ -6137,7 +6141,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  			gimplify_and_add (x, &llist[1]);
>  		      break;
>  		    }
> -		  if (omp_is_reference (var))
> +		  if (omp_privatize_by_reference (var))
>  		    {
>  		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  		      tree new_vard = TREE_OPERAND (new_var, 0);
> @@ -6220,14 +6224,14 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  					      NULL_TREE);
>  		      x = build_outer_var_ref (var, ctx);
>  
> -		      if (omp_is_reference (var)
> +		      if (omp_privatize_by_reference (var)
>  			  && !useless_type_conversion_p (ptype, TREE_TYPE (x)))
>  			x = build_fold_addr_expr_loc (clause_loc, x);
>  		    }
>  		  SET_DECL_VALUE_EXPR (placeholder, x);
>  		  DECL_HAS_VALUE_EXPR_P (placeholder) = 1;
>  		  tree new_vard = new_var;
> -		  if (omp_is_reference (var))
> +		  if (omp_privatize_by_reference (var))
>  		    {
>  		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  		      new_vard = TREE_OPERAND (new_var, 0);
> @@ -6387,7 +6391,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		     for it because it is undesirable if SIMD arrays are used.
>  		     But if they aren't used, we need to emit the deferred
>  		     initialization now.  */
> -		  else if (omp_is_reference (var) && is_simd)
> +		  else if (omp_privatize_by_reference (var) && is_simd)
>  		    handle_simd_reference (clause_loc, new_vard, ilist);
>  
>  		  tree lab2 = NULL_TREE;
> @@ -6582,7 +6586,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		  bool is_truth_op
>  		    = (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR);
>  		  tree new_vard = new_var;
> -		  if (is_simd && omp_is_reference (var))
> +		  if (is_simd && omp_privatize_by_reference (var))
>  		    {
>  		      gcc_assert (TREE_CODE (new_var) == MEM_REF);
>  		      new_vard = TREE_OPERAND (new_var, 0);
> @@ -6653,7 +6657,7 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
>  		      lower_private_allocate (var, new_var, allocator,
>  					      allocate_ptr, ilist, ctx,
>  					      false, NULL_TREE);
> -		      if (omp_is_reference (var) && is_simd)
> +		      if (omp_privatize_by_reference (var) && is_simd)
>  			handle_simd_reference (clause_loc, new_vard, ilist);
>  		      if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
>  			  && OMP_CLAUSE_REDUCTION_INSCAN (c))
> @@ -7254,7 +7258,7 @@ lower_lastprivate_clauses (tree clauses, tree predicate, gimple_seq *body_p,
>  	    }
>  	  if (!x)
>  	    x = build_outer_var_ref (var, ctx, OMP_CLAUSE_LASTPRIVATE);
> -	  if (omp_is_reference (var))
> +	  if (omp_privatize_by_reference (var))
>  	    new_var = build_simple_mem_ref_loc (clause_loc, new_var);
>  	  x = lang_hooks.decls.omp_clause_assign_op (c, x, new_var);
>  	  gimplify_and_add (x, this_stmt_list);
> @@ -7400,7 +7404,7 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
>  		&& maybe_lookup_field (orig, outer) && !is_private)
>  	      {
>  		ref_to_res = build_receiver_ref (orig, false, outer);
> -		if (omp_is_reference (orig))
> +		if (omp_privatize_by_reference (orig))
>  		  ref_to_res = build_simple_mem_ref (ref_to_res);
>  
>  		tree type = TREE_TYPE (var);
> @@ -7430,7 +7434,7 @@ lower_oacc_reductions (location_t loc, tree clauses, tree level, bool inner,
>  	if (!ref_to_res)
>  	  ref_to_res = integer_zero_node;
>  
> -	if (omp_is_reference (orig))
> +	if (omp_privatize_by_reference (orig))
>  	  {
>  	    tree type = TREE_TYPE (var);
>  	    const char *id = IDENTIFIER_POINTER (DECL_NAME (var));
> @@ -7610,7 +7614,8 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
>  	    }
>  	}
>        new_var = lookup_decl (var, ctx);
> -      if (var == OMP_CLAUSE_DECL (c) && omp_is_reference (var))
> +      if (var == OMP_CLAUSE_DECL (c)
> +	  && omp_privatize_by_reference (var))
>  	new_var = build_simple_mem_ref_loc (clause_loc, new_var);
>        ref = build_outer_var_ref (var, ctx, ccode);
>        code = OMP_CLAUSE_REDUCTION_CODE (c);
> @@ -7679,7 +7684,8 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
>  	  if (TREE_CODE (d) == INDIRECT_REF)
>  	    {
>  	      new_var = build_simple_mem_ref_loc (clause_loc, new_var);
> -	      gcc_assert (omp_is_reference (var) && var == orig_var);
> +	      gcc_assert (omp_privatize_by_reference (var)
> +			  && var == orig_var);
>  	    }
>  	  else if (TREE_CODE (d) == ADDR_EXPR)
>  	    {
> @@ -7692,7 +7698,7 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
>  	  else
>  	    {
>  	      gcc_assert (orig_var == var);
> -	      if (omp_is_reference (var))
> +	      if (omp_privatize_by_reference (var))
>  		ref = build_fold_addr_expr (ref);
>  	    }
>  	  if (DECL_P (v))
> @@ -7778,7 +7784,7 @@ lower_reduction_clauses (tree clauses, gimple_seq *stmt_seqp,
>  	{
>  	  tree placeholder = OMP_CLAUSE_REDUCTION_PLACEHOLDER (c);
>  
> -	  if (omp_is_reference (var)
> +	  if (omp_privatize_by_reference (var)
>  	      && !useless_type_conversion_p (TREE_TYPE (placeholder),
>  					     TREE_TYPE (ref)))
>  	    ref = build_fold_addr_expr_loc (clause_loc, ref);
> @@ -7864,7 +7870,7 @@ lower_copyprivate_clauses (tree clauses, gimple_seq *slist, gimple_seq *rlist,
>  				  ref);
>  	  ref = build_fold_indirect_ref_loc (clause_loc, ref);
>  	}
> -      if (omp_is_reference (var))
> +      if (omp_privatize_by_reference (var))
>  	{
>  	  ref = fold_convert_loc (clause_loc, TREE_TYPE (new_var), ref);
>  	  ref = build_simple_mem_ref_loc (clause_loc, ref);
> @@ -8017,7 +8023,7 @@ lower_send_clauses (tree clauses, gimple_seq *ilist, gimple_seq *olist,
>  	  break;
>  
>  	case OMP_CLAUSE_LASTPRIVATE:
> -	  if (by_ref || omp_is_reference (val))
> +	  if (by_ref || omp_privatize_by_reference (val))
>  	    {
>  	      if (OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (c))
>  		continue;
> @@ -8039,7 +8045,7 @@ lower_send_clauses (tree clauses, gimple_seq *ilist, gimple_seq *olist,
>  	      if (is_task_ctx (ctx))
>  		by_ref = use_pointer_for_field (val, ctx);
>  	      else
> -		do_out = !(by_ref || omp_is_reference (val));
> +		do_out = !(by_ref || omp_privatize_by_reference (val));
>  	    }
>  	  else
>  	    by_ref = TREE_CODE (TREE_TYPE (val)) == ARRAY_TYPE;
> @@ -8913,7 +8919,7 @@ omp_task_reduction_iterate (int pass, enum tree_code code,
>  	}
>        else
>  	{
> -	  if (omp_is_reference (*decl))
> +	  if (omp_privatize_by_reference (*decl))
>  	    *type = TREE_TYPE (*type);
>  	  if (pass != (!TREE_CONSTANT (TYPE_SIZE_UNIT (*type))))
>  	    continue;
> @@ -9201,7 +9207,7 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
>  	  else
>  	    {
>  	      t = ref = maybe_lookup_decl_in_outer_ctx (var, ctx);
> -	      if (!omp_is_reference (decl))
> +	      if (!omp_privatize_by_reference (decl))
>  		t = build_fold_addr_expr (t);
>  	    }
>  	  t = fold_convert (pointer_sized_int_node, t);
> @@ -9284,7 +9290,8 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
>  			      build_simple_mem_ref (ptr), field, NULL_TREE);
>  
>  	  enum tree_code rcode = OMP_CLAUSE_REDUCTION_CODE (c);
> -	  if (TREE_CODE (decl) != MEM_REF && omp_is_reference (decl))
> +	  if (TREE_CODE (decl) != MEM_REF
> +	      && omp_privatize_by_reference (decl))
>  	    ref = build_simple_mem_ref (ref);
>  	  /* reduction(-:var) sums up the partial results, so it acts
>  	     identically to reduction(+:var).  */
> @@ -9400,7 +9407,7 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
>  		  gimple_seq_add_stmt (end, g);
>  		  gimple_seq_add_stmt (end, gimple_build_label (lab5));
>  		}
> -	      if (omp_is_reference (decl)
> +	      if (omp_privatize_by_reference (decl)
>  		  && !useless_type_conversion_p (TREE_TYPE (placeholder),
>  						 TREE_TYPE (ref)))
>  		ref = build_fold_addr_expr_loc (OMP_CLAUSE_LOCATION (c), ref);
> @@ -9414,7 +9421,7 @@ lower_omp_task_reductions (omp_context *ctx, enum tree_code code, tree clauses,
>  	      gcc_assert (d);
>  	      if (DECL_HAS_VALUE_EXPR_P (d))
>  		oldv = DECL_VALUE_EXPR (d);
> -	      if (omp_is_reference (var))
> +	      if (omp_privatize_by_reference (var))
>  		{
>  		  tree v = fold_convert (TREE_TYPE (d),
>  					 build_fold_addr_expr (new_var));
> @@ -9986,7 +9993,7 @@ lower_omp_scan (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    tree var4 = NULL_TREE;
>  	    tree lane0 = NULL_TREE;
>  	    tree new_vard = new_var;
> -	    if (omp_is_reference (var))
> +	    if (omp_privatize_by_reference (var))
>  	      {
>  		new_var = build_simple_mem_ref_loc (clause_loc, new_var);
>  		val = new_var;
> @@ -10853,7 +10860,7 @@ lower_omp_for_scan (gimple_seq *body_p, gimple_seq *dlist, gomp_for *stmt,
>  	tree new_var = lookup_decl (var, ctx);
>  	tree var3 = NULL_TREE;
>  	tree new_vard = new_var;
> -	if (omp_is_reference (var))
> +	if (omp_privatize_by_reference (var))
>  	  new_var = build_simple_mem_ref_loc (clause_loc, new_var);
>  	if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
>  	  {
> @@ -12026,7 +12033,8 @@ create_task_copyfn (gomp_task *task_stmt, omp_context *ctx)
>  	      sf = *tcctx.cb.decl_map->get (sf);
>  	    src = build_simple_mem_ref_loc (loc, sarg);
>  	    src = omp_build_component_ref (src, sf);
> -	    if (use_pointer_for_field (decl, NULL) || omp_is_reference (decl))
> +	    if (use_pointer_for_field (decl, NULL)
> +		|| omp_privatize_by_reference (decl))
>  	      src = build_simple_mem_ref_loc (loc, src);
>  	  }
>  	else
> @@ -12646,7 +12654,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
>  	      {
>  		gcc_assert (is_gimple_omp_oacc (ctx->stmt));
> -		if (omp_is_reference (new_var)
> +		if (omp_privatize_by_reference (new_var)
>  		    && (TREE_CODE (TREE_TYPE (new_var)) != POINTER_TYPE
>  		        || DECL_BY_REFERENCE (var)))
>  		  {
> @@ -12684,7 +12692,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	  }
>  	map_cnt++;
>  	var = OMP_CLAUSE_DECL (c);
> -	if (!omp_is_reference (var)
> +	if (!omp_privatize_by_reference (var)
>  	    && !is_gimple_reg_type (TREE_TYPE (var)))
>  	  {
>  	    tree new_var = lookup_decl (var, ctx);
> @@ -12751,7 +12759,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    DECL_HAS_VALUE_EXPR_P (new_var) = 1;
>  	  }
>  	else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
> -		  && !omp_is_reference (var)
> +		  && !omp_privatize_by_reference (var)
>  		  && !omp_is_allocatable_or_ptr (var)
>  		  && !lang_hooks.decls.omp_array_data (var, true))
>  		 || TREE_CODE (TREE_TYPE (var)) == ARRAY_TYPE)
> @@ -12974,7 +12982,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  		else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
>  		  {
>  		    gcc_assert (is_gimple_omp_oacc (ctx->stmt));
> -		    if (!omp_is_reference (var))
> +		    if (!omp_privatize_by_reference (var))
>  		      {
>  			if (is_gimple_reg (var)
>  			    && OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c))
> @@ -13137,7 +13145,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    if (is_gimple_omp_oacc (ctx->stmt))
>  	      goto oacc_firstprivate_map;
>  	    ovar = OMP_CLAUSE_DECL (c);
> -	    if (omp_is_reference (ovar))
> +	    if (omp_privatize_by_reference (ovar))
>  	      talign = TYPE_ALIGN_UNIT (TREE_TYPE (TREE_TYPE (ovar)));
>  	    else
>  	      talign = DECL_ALIGN_UNIT (ovar);
> @@ -13145,7 +13153,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    x = build_sender_ref (ovar, ctx);
>  	    tkind = GOMP_MAP_FIRSTPRIVATE;
>  	    type = TREE_TYPE (ovar);
> -	    if (omp_is_reference (ovar))
> +	    if (omp_privatize_by_reference (ovar))
>  	      type = TREE_TYPE (type);
>  	    if ((INTEGRAL_TYPE_P (type)
>  		 && TYPE_PRECISION (type) <= POINTER_SIZE)
> @@ -13153,7 +13161,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	      {
>  		tkind = GOMP_MAP_FIRSTPRIVATE_INT;
>  		tree t = var;
> -		if (omp_is_reference (var))
> +		if (omp_privatize_by_reference (var))
>  		  t = build_simple_mem_ref (var);
>  		else if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c))
>  		  suppress_warning (var);
> @@ -13162,7 +13170,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  		t = fold_convert (TREE_TYPE (x), t);
>  		gimplify_assign (x, t, &ilist);
>  	      }
> -	    else if (omp_is_reference (var))
> +	    else if (omp_privatize_by_reference (var))
>  	      gimplify_assign (x, var, &ilist);
>  	    else if (is_gimple_reg (var))
>  	      {
> @@ -13181,7 +13189,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	      }
>  	    if (tkind == GOMP_MAP_FIRSTPRIVATE_INT)
>  	      s = size_int (0);
> -	    else if (omp_is_reference (ovar))
> +	    else if (omp_privatize_by_reference (ovar))
>  	      s = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ovar)));
>  	    else
>  	      s = TYPE_SIZE_UNIT (TREE_TYPE (ovar));
> @@ -13236,13 +13244,13 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    if (lang_hooks.decls.omp_array_data (ovar, true))
>  	      var = lang_hooks.decls.omp_array_data (ovar, false);
>  	    else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
> -		      && !omp_is_reference (ovar)
> +		      && !omp_privatize_by_reference (ovar)
>  		      && !omp_is_allocatable_or_ptr (ovar))
>  		     || TREE_CODE (type) == ARRAY_TYPE)
>  	      var = build_fold_addr_expr (var);
>  	    else
>  	      {
> -		if (omp_is_reference (ovar)
> +		if (omp_privatize_by_reference (ovar)
>  		    || omp_check_optional_argument (ovar, false)
>  		    || omp_is_allocatable_or_ptr (ovar))
>  		  {
> @@ -13251,7 +13259,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  			&& TREE_CODE (type) != ARRAY_TYPE
>  			&& ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_USE_DEVICE_ADDR
>  			    && !omp_is_allocatable_or_ptr (ovar))
> -			   || (omp_is_reference (ovar)
> +			   || (omp_privatize_by_reference (ovar)
>  			       && omp_is_allocatable_or_ptr (ovar))))
>  		      var = build_simple_mem_ref (var);
>  		    var = fold_convert (TREE_TYPE (x), var);
> @@ -13366,13 +13374,13 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    if (is_gimple_omp_oacc (ctx->stmt))
>  	      break;
>  	    var = OMP_CLAUSE_DECL (c);
> -	    if (omp_is_reference (var)
> +	    if (omp_privatize_by_reference (var)
>  		|| is_gimple_reg_type (TREE_TYPE (var)))
>  	      {
>  		tree new_var = lookup_decl (var, ctx);
>  		tree type;
>  		type = TREE_TYPE (var);
> -		if (omp_is_reference (var))
> +		if (omp_privatize_by_reference (var))
>  		  type = TREE_TYPE (type);
>  		if ((INTEGRAL_TYPE_P (type)
>  		     && TYPE_PRECISION (type) <= POINTER_SIZE)
> @@ -13384,7 +13392,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  		    x = fold_convert (type, x);
>  		    gimplify_expr (&x, &new_body, NULL, is_gimple_val,
>  				   fb_rvalue);
> -		    if (omp_is_reference (var))
> +		    if (omp_privatize_by_reference (var))
>  		      {
>  			tree v = create_tmp_var_raw (type, get_name (var));
>  			gimple_add_tmp_var (v);
> @@ -13398,7 +13406,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  		  }
>  		else
>  		  {
> -		    x = build_receiver_ref (var, !omp_is_reference (var), ctx);
> +		    bool by_ref = !omp_privatize_by_reference (var);
> +		    x = build_receiver_ref (var, by_ref, ctx);
>  		    gimplify_expr (&x, &new_body, NULL, is_gimple_val,
>  				   fb_rvalue);
>  		    gimple_seq_add_stmt (&new_body,
> @@ -13422,7 +13431,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	    if (is_gimple_omp_oacc (ctx->stmt))
>  	      break;
>  	    var = OMP_CLAUSE_DECL (c);
> -	    if (omp_is_reference (var))
> +	    if (omp_privatize_by_reference (var))
>  	      {
>  		location_t clause_loc = OMP_CLAUSE_LOCATION (c);
>  		tree new_var = lookup_decl (var, ctx);
> @@ -13465,7 +13474,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  
>  	    if (is_array_data)
>  	      {
> -		bool is_ref = omp_is_reference (var);
> +		bool is_ref = omp_privatize_by_reference (var);
>  		do_optional_check = true;
>  		/* First, we copy the descriptor data from the host; then
>  		   we update its data to point to the target address.  */
> @@ -13509,7 +13518,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  				     gimple_build_assign (new_var, x));
>  	      }
>  	    else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_ADDR
> -		      && !omp_is_reference (var)
> +		      && !omp_privatize_by_reference (var)
>  		      && !omp_is_allocatable_or_ptr (var))
>  		     || TREE_CODE (TREE_TYPE (var)) == ARRAY_TYPE)
>  	      {
> @@ -13526,13 +13535,13 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  	      {
>  		tree type = TREE_TYPE (var);
>  		new_var = lookup_decl (var, ctx);
> -		if (omp_is_reference (var))
> +		if (omp_privatize_by_reference (var))
>  		  {
>  		    type = TREE_TYPE (type);
>  		    if (POINTER_TYPE_P (type)
>  			&& TREE_CODE (type) != ARRAY_TYPE
>  			&& (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_USE_DEVICE_ADDR
> -			    || (omp_is_reference (var)
> +			    || (omp_privatize_by_reference (var)
>  				&& omp_is_allocatable_or_ptr (var))))
>  		      {
>  			tree v = create_tmp_var_raw (type, get_name (var));
> @@ -13650,7 +13659,7 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  						     offset));
>  		  }
>  		else
> -		  is_ref = omp_is_reference (var);
> +		  is_ref = omp_privatize_by_reference (var);
>  		if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_REFERENCE)
>  		  is_ref = false;
>  		bool ref_to_array = false;
> @@ -13730,7 +13739,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp_context *ctx)
>  		gimple_seq_add_stmt (&new_body,
>  				     gimple_build_assign (new_pvar, x));
>  	      }
> -	    else if (omp_is_reference (var) && !is_gimple_omp_oacc (ctx->stmt))
> +	    else if (omp_privatize_by_reference (var)
> +		     && !is_gimple_omp_oacc (ctx->stmt))
>  	      {
>  		location_t clause_loc = OMP_CLAUSE_LOCATION (c);
>  		tree new_var = lookup_decl (var, ctx);
> -- 
> 2.25.1
> 


	Jakub


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2021-08-31 14:46 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-10-18  7:01 [gomp] Add langhook, so that Fortran can privatize variables by reference Jakub Jelinek
2005-10-18  9:10 ` Richard Henderson
2005-10-18  9:49   ` Jakub Jelinek
2005-10-18  9:54     ` Richard Henderson
2005-10-18 10:28       ` Jakub Jelinek
2005-10-18 10:46         ` Richard Henderson
2019-05-26 17:46 ` Thomas Schwinge
2019-05-27 16:51   ` Jakub Jelinek
2019-05-29 17:12     ` Thomas Schwinge
2021-08-31 14:28       ` Thomas Schwinge
2021-08-31 14:45         ` Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).