[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] Correction ICE aliasing_complex_pointer
Mikael Morin
mikael@gcc.gnu.org
Fri Jun 13 14:55:07 GMT 2025
https://gcc.gnu.org/g:525766e70d66b841a6ac8b45f9f2e934ce946ab9
commit 525766e70d66b841a6ac8b45f9f2e934ce946ab9
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sat Apr 12 15:44:20 2025 +0200
Correction ICE aliasing_complex_pointer
Diff:
---
gcc/fortran/trans-array.cc | 25 +++++++++++++------------
gcc/fortran/trans-descriptor.cc | 12 +-----------
gcc/fortran/trans-types.cc | 21 +++++++++++++++++++++
gcc/fortran/trans-types.h | 2 ++
4 files changed, 37 insertions(+), 23 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index ca92e6912b3e..71d39bfd1ed3 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -1045,6 +1045,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss,
info->start[dim] = gfc_index_zero_node;
info->end[dim] = gfc_index_zero_node;
info->stride[dim] = gfc_index_one_node;
+ info->lbound[dim] = gfc_index_zero_node;
}
}
@@ -1189,7 +1190,7 @@ gfc_trans_create_temp_array (stmtblock_t * pre, stmtblock_t * post, gfc_ss * ss,
{
for (n = 0; n < total_dim; n++)
{
- spacing[n] = size;
+ info->spacing[n] = spacing[n] = size;
tree extent = to[n];
if (!shift_bounds && !integer_zerop (from[n]))
@@ -3480,7 +3481,7 @@ non_negative_strides_array_p (tree expr)
static tree
-build_array_ref (tree descriptor, tree array, tree index,
+build_array_ref (tree array, tree index,
bool non_negative_stride, tree lbound, tree spacing,
const vec<tree> * array_type_domains)
{
@@ -3489,24 +3490,21 @@ build_array_ref (tree descriptor, tree array, tree index,
elt_type = TREE_TYPE (TREE_TYPE (array));
else
{
- tree desc_type = TREE_TYPE (descriptor);
- tree core_type = TREE_TYPE (GFC_TYPE_ARRAY_DATAPTR_TYPE (desc_type));
+ tree core_type = TREE_TYPE (array);
unsigned j;
tree *dom_p;
FOR_EACH_VEC_ELT (*array_type_domains, j, dom_p)
{
- gcc_assert (GFC_ARRAY_TYPE_P (core_type)
+ gcc_assert (TREE_CODE (core_type) == ARRAY_TYPE
&& TYPE_DOMAIN (core_type) == *dom_p);
core_type = TREE_TYPE (core_type);
}
- core_type = TREE_TYPE (core_type);
-
- tree elt_type = core_type;
+ elt_type = TREE_TYPE (core_type);
FOR_EACH_VEC_ELT_REVERSE (*array_type_domains, j, dom_p)
- elt_type = build_array_type (elt_type, *dom_p);
+ elt_type = gfc_build_incomplete_array_type (elt_type, *dom_p);
}
return gfc_build_array_ref (elt_type, array, index, non_negative_stride,
@@ -3827,7 +3825,7 @@ add_array_index (stmtblock_t *pblock, gfc_loopinfo *loop, gfc_ss *ss,
|| ss_type == GFC_SS_CONSTRUCTOR
|| ss_type == GFC_SS_INTRINSIC
|| non_negative_strides_array_p (info->descriptor);
- return build_array_ref (info->descriptor, array, index, non_negative_stride,
+ return build_array_ref (array, index, non_negative_stride,
info->lbound[array_dim], info->spacing[array_dim],
array_type_domains);
}
@@ -4609,7 +4607,10 @@ done:
for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
if (info->subscript[n]
&& info->subscript[n]->info->type == GFC_SS_SCALAR)
- conv_evaluate_lbound (&outer_loop->pre, ss, n);
+ {
+ conv_array_spacing (&outer_loop->pre, ss, n);
+ conv_evaluate_lbound (&outer_loop->pre, ss, n);
+ }
break;
case GFC_SS_INTRINSIC:
@@ -6887,7 +6888,7 @@ gfc_get_dataptr_offset (stmtblock_t *block, tree parm, tree desc,
for (int i = GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc)) - 1; i >= 0; i--)
{
- array = build_array_ref (desc, array, gfc_index_zero_node,
+ array = build_array_ref (array, gfc_index_zero_node,
non_negative_strides, gfc_index_zero_node,
gfc_conv_array_spacing (desc, i), nullptr);
}
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 88062e3b8b3a..190311675198 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -982,17 +982,7 @@ gfc_build_desc_array_type (tree desc_type, tree etype, int dimen, tree * lbound,
tree index_type = build_range_type (gfc_array_index_type, lower, upper);
- tree elt_type = type;
- type = make_node (ARRAY_TYPE);
- TREE_TYPE (type) = elt_type;
- TYPE_DOMAIN (type) = index_type;
- TYPE_ADDR_SPACE (type) = TYPE_ADDR_SPACE (elt_type);
-
- /* Set TYPE_STRUCTURAL_EQUALITY_P. */
- if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)
- || (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type))
- || in_lto_p)
- SET_TYPE_STRUCTURAL_EQUALITY (type);
+ type = gfc_build_incomplete_array_type (type, index_type);
}
return type;
diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc
index 9c1d4b763b7a..447ec89446e5 100644
--- a/gcc/fortran/trans-types.cc
+++ b/gcc/fortran/trans-types.cc
@@ -4275,4 +4275,25 @@ gfc_get_cfi_type (int dimen, bool restricted)
return CFI_cdesc_t;
}
+
+/* Variant of build_array_type that doesn't call layout_type. */
+
+tree
+gfc_build_incomplete_array_type (tree elt_type, tree index_type)
+{
+ tree type = make_node (ARRAY_TYPE);
+ TREE_TYPE (type) = elt_type;
+ TYPE_DOMAIN (type) = index_type;
+ TYPE_ADDR_SPACE (type) = TYPE_ADDR_SPACE (elt_type);
+
+ /* Set TYPE_STRUCTURAL_EQUALITY_P. */
+ if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)
+ || (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type))
+ || in_lto_p)
+ SET_TYPE_STRUCTURAL_EQUALITY (type);
+
+ return type;
+}
+
+
#include "gt-fortran-trans-types.h"
diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h
index 1f1281524507..5f4da9202d78 100644
--- a/gcc/fortran/trans-types.h
+++ b/gcc/fortran/trans-types.h
@@ -123,4 +123,6 @@ tree gfc_get_dtype (tree, int *rank = NULL);
tree gfc_get_caf_vector_type (int dim);
tree gfc_get_caf_reference_type ();
+tree gfc_build_incomplete_array_type (tree, tree);
+
#endif
More information about the Gcc-cvs
mailing list