[gcc(refs/users/mikael/heads/refactor_descriptor_v05)] Correction régression transfer_simplify_11
Mikael Morin
mikael@gcc.gnu.org
Fri Jun 13 14:57:15 GMT 2025
https://gcc.gnu.org/g:a776420da838b25b8cf2aa1d26984d79c4dbc053
commit a776420da838b25b8cf2aa1d26984d79c4dbc053
Author: Mikael Morin <mikael@gcc.gnu.org>
Date: Sun Apr 20 22:31:01 2025 +0200
Correction régression transfer_simplify_11
Diff:
---
gcc/fortran/trans-array.cc | 26 ++++++++++++++++----------
gcc/tree-ssa-loop-niter.cc | 3 ++-
2 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 91a0379f7336..c577aa9d5ab7 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -3516,8 +3516,8 @@ build_ptr_array_ref (tree data, tree offset)
tree
-build_array_ref_dim (gfc_ss *ss, tree index, tree spacing,
- tree offset = NULL_TREE, bool tmp_array = false)
+build_array_ref_dim (gfc_ss *ss, tree index, tree lbound, tree spacing,
+ bool tmp_array = false)
{
gfc_array_info *info = &ss->info->data.array;
@@ -3529,8 +3529,8 @@ build_array_ref_dim (gfc_ss *ss, tree index, tree spacing,
|| ss_type == GFC_SS_INTRINSIC
|| tmp_array
|| non_negative_strides_array_p (info->descriptor);
- return gfc_build_array_ref (base, index, non_negative_stride, NULL_TREE,
- spacing, offset);
+ return gfc_build_array_ref (base, index, non_negative_stride, lbound,
+ spacing);
}
@@ -3551,8 +3551,8 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar, bool tmp_array =
tree index = conv_array_index (se, ss, ss->dim[n], n, ar);
gfc_array_info *info = &ss->info->data.array;
- se->expr = build_array_ref_dim (ss, index, info->spacing[ss->dim[n]],
- info->offset, tmp_array);
+ se->expr = build_array_ref_dim (ss, index, info->lbound[ss->dim[n]],
+ info->spacing[ss->dim[n]], tmp_array);
}
@@ -3761,7 +3761,7 @@ add_array_offset (stmtblock_t *pblock, gfc_loopinfo *loop, gfc_ss *ss,
gfc_add_block_to_block (pblock, &se.pre);
- tree tmp = build_array_ref_dim (ss, index, info->spacing[array_dim]);
+ tree tmp = build_array_ref_dim (ss, index, info->lbound[array_dim], info->spacing[array_dim]);
tmp = gfc_build_addr_expr (NULL_TREE, tmp);
tmp = fold_convert_loc (input_location, type, tmp);
info->data = gfc_evaluate_now (tmp, pblock);
@@ -4155,7 +4155,7 @@ evaluate_bound (stmtblock_t *block, tree *bounds, gfc_expr ** values,
static void
-conv_array_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
+conv_array_lbound_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
{
gfc_array_info *info;
@@ -4193,6 +4193,12 @@ conv_array_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
info->spacing[dim] = gfc_evaluate_now (value, block);
else
info->spacing[dim] = value;
+
+ value = gfc_conv_array_lbound (desc, dim);
+ if (save_value)
+ info->lbound[dim] = gfc_evaluate_now (value, block);
+ else
+ info->lbound[dim] = value;
}
@@ -4505,13 +4511,13 @@ done:
for (n = 0; n < ss->dimen; n++)
{
gfc_conv_section_startstride (&outer_loop->pre, ss, ss->dim[n]);
- conv_array_spacing (&outer_loop->pre, ss, ss->dim[n]);
+ conv_array_lbound_spacing (&outer_loop->pre, ss, ss->dim[n]);
}
if (loop->parent == nullptr)
for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
if (info->subscript[n]
&& info->subscript[n]->info->type == GFC_SS_SCALAR)
- conv_array_spacing (&outer_loop->pre, ss, n);
+ conv_array_lbound_spacing (&outer_loop->pre, ss, n);
break;
case GFC_SS_INTRINSIC:
diff --git a/gcc/tree-ssa-loop-niter.cc b/gcc/tree-ssa-loop-niter.cc
index 9ce881344142..0fa9388594bc 100644
--- a/gcc/tree-ssa-loop-niter.cc
+++ b/gcc/tree-ssa-loop-niter.cc
@@ -3926,7 +3926,8 @@ do_warn_aggressive_loop_optimizations (class loop *loop,
known constant bound. */
|| wi::cmpu (i_bound, wi::to_widest (loop->nb_iterations)) >= 0
/* And undefined behavior happens unconditionally. */
- || !dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (stmt)))
+ || !dominated_by_p (CDI_DOMINATORS, loop->latch, gimple_bb (stmt))
+ || loop->latch == gimple_bb (stmt))
return;
edge e = single_exit (loop);
More information about the Gcc-cvs
mailing list