This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gomp4] C++ OpenMP user defined reductions (take 2)


On 09/12/2013 04:55 AM, Jakub Jelinek wrote:
-      if (t1 != t2)
+      if (t1 != t2 && !DECL_OMP_DECLARE_REDUCTION_P (newdecl))
  	return 0;

What's the theory here? Why should decls_match return true for reductions with mismatching templates?

+	  && ! (DECL_OMP_DECLARE_REDUCTION_P (newdecl)
+		&& DECL_CONTEXT (newdecl) == NULL_TREE
+		&& DECL_CONTEXT (olddecl) == current_function_decl))

And this looks like you need to set DECL_CONTEXT sooner on reductions.

+	    if (TREE_CODE (argtype) == REFERENCE_TYPE)
+	      error_at (DECL_SOURCE_LOCATION (t),
+			"function, array or reference type in "
+			"%<#pragma omp declare reduction%>");

Let's just say "reference type", since we know that's what it is.

+			 && DECL_CONTEXT (pattern_decl)
+			 && TREE_CODE (DECL_CONTEXT (pattern_decl))
+			    == FUNCTION_DECL)

This is DECL_FUNCTION_SCOPE_P.

+  return TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE
+	 || is_invisiref_parm (decl);

Needs parens to protect indentation.

+/* Instantiate the special body of the artificial DECL_OMP_DECLARE_REDUCTION
+   function.  */

We could use documentation of what this special body looks like, either here, in cp_check_omp_declare_reduction, or elsewhere.

+      for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
+	{
+	  id = omp_reduction_lookup (loc, orig_id, BINFO_TYPE (base_binfo));
+	  if (id != NULL_TREE)
+	    return id;

This should check for ambiguity rather than returning the first match.

+   Also append INIT_EXPR for DECL_INITIAL of omp_priv after its
+   DECL_EXPR.  */

Why not let the DECL_EXPR handle initialization?

Let's break out the finish_omp_clauses reduction code into a separate function, as it's rather large.

+		    if (DECL_TEMPLATE_INFO (id))
+		      id = instantiate_decl (id, /*defer_ok*/0, true);

Let's use mark_used instead.

+		    if (TREE_CODE (body) == STATEMENT_LIST)
+		      {

Maybe this should be an assert?

Jason


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]