[PATCH] fortran: Move definition of variable closer to its uses
Hello, I have found this small cleanup lying in a local branch. Regression-tested on x86_64-linux, OK for master? -- 8< -- No change of behaviour, this makes a variable easier to track. gcc/fortran/ChangeLog: * trans-array.cc (gfc_trans_preloop_setup): Use a separate variable for iteration. Use directly the value of variable I if it is known. Move the definition of the variable to the branch where the remaining uses are. --- gcc/fortran/trans-array.cc | 31 +-- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 510f429ef8e..c34c97257a9 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -4294,7 +4294,6 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, gfc_ss *ss, *pss; gfc_loopinfo *ploop; gfc_array_ref *ar; - int i; /* This code will be executed before entering the scalarization loop for this dimension. */ @@ -4340,19 +4339,10 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, pss = ss; } - if (dim == loop->dimen - 1) - i = 0; - else - i = dim + 1; - - /* For the time being, there is no loop reordering. */ - gcc_assert (i == ploop->order[i]); - i = ploop->order[i]; - if (dim == loop->dimen - 1 && loop->parent == NULL) { stride = gfc_conv_array_stride (info->descriptor, - innermost_ss (ss)->dim[i]); + innermost_ss (ss)->dim[0]); /* Calculate the stride of the innermost loop. Hopefully this will allow the backend optimizers to do their stuff more effectively. @@ -4364,7 +4354,7 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, base offset of the array. */ if (info->ref) { - for (i = 0; i < ar->dimen; i++) + for (int i = 0; i < ar->dimen; i++) { if (ar->dimen_type[i] != DIMEN_ELEMENT) continue; @@ -4374,8 +4364,21 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, } } else - /* Add the offset for the previous loop dimension. */ - add_array_offset (pblock, ploop, ss, ar, pss->dim[i], i); + { + int i; + + if (dim == loop->dimen - 1) + i = 0; + else + i = dim + 1; + + /* For the time being, there is no loop reordering. */ + gcc_assert (i == ploop->order[i]); + i = ploop->order[i]; + + /* Add the offset for the previous loop dimension. */ + add_array_offset (pblock, ploop, ss, ar, pss->dim[i], i); + } /* Remember this offset for the second loop. */ if (dim == loop->temp_dim - 1 && loop->parent == NULL) -- 2.43.0
[PATCH] fortran: Remove useless nested end of scalarization chain handling
Hello, this is another small cleanup I had lying around. Regression-tested on x86_64-linux. Ok for master? -- 8< -- Remove the special handling of end of nested scalarization chains, which advanced the chain to an element of a parent chain when the current one was reaching its end. That handling was superfluous as nested chains correspond to nested scalarizations of subexpressions and the scalarizations don't extend beyond their associated subexpression and don't use any scalarisation element from the parent expression. No change of behaviour, as the GFC_SE struct is supposed to be in its final state anyway when the last element from the chain has been consumed. gcc/fortran/ChangeLog: * trans-expr.cc (gfc_advance_se_ss_chain): Don't use an element from the parent scalarization chain when the current chain reaches its end. --- gcc/fortran/trans-expr.cc | 11 +-- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 477c2720187..f0862db5f17 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -2052,7 +2052,6 @@ void gfc_advance_se_ss_chain (gfc_se * se) { gfc_se *p; - gfc_ss *ss; gcc_assert (se != NULL && se->ss != NULL && se->ss != gfc_ss_terminator); @@ -2064,15 +2063,7 @@ gfc_advance_se_ss_chain (gfc_se * se) gcc_assert (p->parent == NULL || p->parent->ss == p->ss || p->parent->ss->nested_ss == p->ss); - /* If we were in a nested loop, the next scalarized expression can be -on the parent ss' next pointer. Thus we should not take the next -pointer blindly, but rather go up one nest level as long as next -is the end of chain. */ - ss = p->ss; - while (ss->next == gfc_ss_terminator && ss->parent != NULL) - ss = ss->parent; - - p->ss = ss->next; + p->ss = p->ss->next; p = p->parent; } -- 2.43.0
Re: [PATCH] fortran: Move definition of variable closer to its uses
Hi Mikael, Am 07.07.24 um 10:32 schrieb Mikael Morin: Hello, I have found this small cleanup lying in a local branch. Regression-tested on x86_64-linux, OK for master? besides the minor nit below, this is a nice cleanup! -- 8< -- No change of behaviour, this makes a variable easier to track. gcc/fortran/ChangeLog: * trans-array.cc (gfc_trans_preloop_setup): Use a separate variable for iteration. Use directly the value of variable I if it is known. Move the definition of the variable to the branch where the remaining uses are. --- gcc/fortran/trans-array.cc | 31 +-- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 510f429ef8e..c34c97257a9 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -4294,7 +4294,6 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, gfc_ss *ss, *pss; gfc_loopinfo *ploop; gfc_array_ref *ar; - int i; /* This code will be executed before entering the scalarization loop for this dimension. */ @@ -4340,19 +4339,10 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, pss = ss; } - if (dim == loop->dimen - 1) - i = 0; - else - i = dim + 1; - - /* For the time being, there is no loop reordering. */ - gcc_assert (i == ploop->order[i]); - i = ploop->order[i]; - if (dim == loop->dimen - 1 && loop->parent == NULL) { Strictly speaking, there should now be this assert here: gcc_assert (0 == ploop->order[0]); stride = gfc_conv_array_stride (info->descriptor, - innermost_ss (ss)->dim[i]); + innermost_ss (ss)->dim[0]); /* Calculate the stride of the innermost loop. Hopefully this will allow the backend optimizers to do their stuff more effectively. @@ -4364,7 +4354,7 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, base offset of the array. */ if (info->ref) { - for (i = 0; i < ar->dimen; i++) + for (int i = 0; i < ar->dimen; i++) { if (ar->dimen_type[i] != DIMEN_ELEMENT) continue; @@ -4374,8 +4364,21 @@ gfc_trans_preloop_setup (gfc_loopinfo * loop, int dim, int flag, } } else - /* Add the offset for the previous loop dimension. */ - add_array_offset (pblock, ploop, ss, ar, pss->dim[i], i); + { + int i; + + if (dim == loop->dimen - 1) + i = 0; + else + i = dim + 1; + + /* For the time being, there is no loop reordering. */ + gcc_assert (i == ploop->order[i]); + i = ploop->order[i]; + + /* Add the offset for the previous loop dimension. */ + add_array_offset (pblock, ploop, ss, ar, pss->dim[i], i); + } /* Remember this offset for the second loop. */ if (dim == loop->temp_dim - 1 && loop->parent == NULL) Otherwise this is OK. Thanks, Harald