projects
/
gcc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
re PR fortran/40551 (Optimizations possible using gfc_full_array_ref_p)
[gcc.git]
/
gcc
/
fortran
/
trans-expr.c
diff --git
a/gcc/fortran/trans-expr.c
b/gcc/fortran/trans-expr.c
index f79ad4b3cc7d8dfadee92ffff509f241fb28e3bd..6a38f10f6568214c1aa56e43bd3e38f83c6e3a69 100644
(file)
--- a/
gcc/fortran/trans-expr.c
+++ b/
gcc/fortran/trans-expr.c
@@
-4300,6
+4300,7
@@
gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
gfc_ss *ss;
gfc_ref * ref;
bool seen_array_ref;
gfc_ss *ss;
gfc_ref * ref;
bool seen_array_ref;
+ bool c = false;
gfc_component *comp = NULL;
/* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
gfc_component *comp = NULL;
/* The caller has already checked rank>0 and expr_type == EXPR_FUNCTION. */
@@
-4311,6
+4312,10
@@
gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2)
&& expr2->value.function.esym->attr.elemental)
return NULL;
&& expr2->value.function.esym->attr.elemental)
return NULL;
+ /* Fail if rhs is not FULL or a contiguous section. */
+ if (expr1->ref && !(gfc_full_array_ref_p (expr1->ref, &c) || c))
+ return NULL;
+
/* Fail if EXPR1 can't be expressed as a descriptor. */
if (gfc_ref_needs_temporary_p (expr1->ref))
return NULL;
/* Fail if EXPR1 can't be expressed as a descriptor. */
if (gfc_ref_needs_temporary_p (expr1->ref))
return NULL;
@@
-4785,7
+4790,7
@@
copyable_array_p (gfc_expr * expr)
if (expr->rank < 1 || !expr->ref || expr->ref->next)
return false;
if (expr->rank < 1 || !expr->ref || expr->ref->next)
return false;
- if (!gfc_full_array_ref_p (expr->ref))
+ if (!gfc_full_array_ref_p (expr->ref
, NULL
))
return false;
/* Next check that it's of a simple enough type. */
return false;
/* Next check that it's of a simple enough type. */