The lowering for firstprivate uses the pointer size rather than the size
of the referenced object when passed an optional argument. This patch
detects optional arguments as a special case and treats them as reference
types.
gcc/
* omp-general.c (omp_is_optional_argument): New.
* omp-general.h (omp_is_optional_argument): New.
* omp-low.c (lower_omp_target): Use size of referenced object when
optional argument used as argument to firstprivate.
(cherry picked from openacc-gcc-9-branch commit
57093894d563543f5fe5e2b76f974340375c5421)
+2019-01-30 Kwok Cheung Yeung <kcy@codesourcery.com>
+
+ * omp-general.c (omp_is_optional_argument): New.
+ * omp-general.h (omp_is_optional_argument): New.
+ * omp-low.c (lower_omp_target): Use size of referenced object when
+ optional argument used as argument to firstprivate.
+
2018-12-11 Julian Brown <julian@codesourcery.com>
Chung-Lin Tang <cltang@codesourcery.com>
return NULL_TREE;
}
+/* Return true if DECL is a Fortran optional argument. */
+
+bool
+omp_is_optional_argument (tree decl)
+{
+ return TREE_CODE (decl) == PARM_DECL && DECL_BY_REFERENCE (decl)
+ && TREE_CODE (TREE_TYPE (decl)) == POINTER_TYPE;
+}
+
/* Return true if DECL is a reference type. */
bool
#define OACC_FN_ATTRIB "oacc function"
extern tree omp_find_clause (tree clauses, enum omp_clause_code kind);
+extern bool omp_is_optional_argument (tree decl);
extern bool omp_is_reference (tree decl);
extern void omp_adjust_for_condition (location_t loc, enum tree_code *cond_code,
tree *n2, tree v, tree step);
else
{
s = TREE_TYPE (ovar);
- if (TREE_CODE (s) == REFERENCE_TYPE)
+ if (TREE_CODE (s) == REFERENCE_TYPE
+ || omp_is_optional_argument (ovar))
s = TREE_TYPE (s);
s = TYPE_SIZE_UNIT (s);
}