------- Comment #6 from pault at gcc dot gnu dot org 2008-04-19 08:45 -------
This fixes it, albeit with one regression (scalarize_parameter_array_1.f90):
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c (revision 134362)
--- gcc/fortran/trans-array.c (working copy)
*************** gfc_trans_array_constructor (gfc_loopinf
*** 1679,1684 ****
--- 1679,1685 ----
tree offsetvar;
tree desc;
tree type;
+ tree loopfrom;
bool dynamic;
if (flag_bounds_check && ss->expr->ts.type == BT_CHARACTER)
*************** gfc_trans_array_constructor (gfc_loopinf
*** 1757,1765 ****
--- 1758,1783 ----
}
}
+ if (!integer_zerop (loop->from[0]))
+ {
+ loopfrom = loop->from[0];
+ loop->from[0] = gfc_index_zero_node;
+ loop->to[0] = fold_build2 (MINUS_EXPR, gfc_array_index_type,
+ loop->to[0], loopfrom);
+ }
+ else
+ loopfrom = NULL_TREE;
+
gfc_trans_create_temp_array (&loop->pre, &loop->post, loop, &ss->data.info,
type, dynamic, true, false);
+ if (loopfrom != NULL_TREE)
+ {
+ loop->from[0] = loopfrom;
+ loop->to[0] = fold_build2 (PLUS_EXPR, gfc_array_index_type,
+ loop->to[0], loopfrom);
+ }
+
desc = ss->data.info.descriptor;
offset = gfc_index_zero_node;
offsetvar = gfc_create_var_np (gfc_array_index_type, "offset");
*************** gfc_trans_array_constructor (gfc_loopinf
*** 1768,1773 ****
--- 1786,1794 ----
gfc_trans_array_constructor_value (&loop->pre, type, desc, c,
&offset, &offsetvar, dynamic);
+ ss->data.info.offset = fold_build1 (NEGATE_EXPR, gfc_array_index_type,
+ loop->from[0]);
+
/* If the array grows dynamically, the upper bound of the loop variable
is determined by the array's final upper bound. */
if (dynamic)
Somewhere along the line, the scalarizer has undergone a change in the way in
which the loop ranges are chosen. In 4.2 and earlier, the loop->from[0] is
zero and this gives a temporary with the right offset and lbound.
I'll figure out why the regression occurs and see if there is a cleaner way of
effecting the same modification.
Paul
--
pault at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
AssignedTo|unassigned at gcc dot gnu |pault at gcc dot gnu dot org
|dot org |
Status|NEW |ASSIGNED
Last reconfirmed|2008-04-16 18:36:40 |2008-04-19 08:45:44
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35946