public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "jakub at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug fortran/107424] [13 Regression] ICE in gfc_trans_omp_do, at fortran/trans-openmp.cc:5397 - and wrong code - with non-rectangular loops
Date: Fri, 13 Jan 2023 11:07:43 +0000	[thread overview]
Message-ID: <bug-107424-4-NYbSasXhEL@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-107424-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107424

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think there are multiple issues.  For the do i = 1, 9, 1 case, the bug is
that we:
      gfc_init_se (&se, NULL);
      gfc_conv_expr_val (&se, code->ext.iterator->end);
      gfc_add_block_to_block (pblock, &se.pre);
      to = gfc_evaluate_now (se.expr, pblock);
and therefore evaluate the upper expression (but ditto the lower expression)
before the loop nest into a temporary rather than keeping it directly in the
expression.
That is fine for the cases where the expressions are loop invariant, which was
always the case before non-rectangular loops were introduced, but is not ok for
non-rectangular loops.  I think the above patch deals with that somehow, but
haven't studied yet exactly how.  Don't know about the step2 case on the outer
loop, but guess it is similar to the below thing too.
Another problem is that for steps other than -1 and 1, we use the non-simple
expansion:
          /* STEP is not 1 or -1.  Use:
             for (count = 0; count < (to + step - from) / step; count++)
               {
                 dovar = from + count * step;
                 body;
               cycle_label:;
               }  */
If the inner loop of non-rectangular loop nest (well, in particular whenever
from or to
uses some outer loop iterator and is one of the allowed non-rectangular forms):
var-outer
var-outer + a2
a2 + var-outer
var-outer - a2
a2 - var-outer
a1 * var-outer
a1 * var-outer + a2
a2 + a1 * var-outer
a1 * var-outer - a2
a2 - a1 * var-outer
var-outer * a1
var-outer * a1 + a2
a2 + var-outer * a1
var-outer * a1 - a2
a2 - var-outer * a1
then using the non-simple expansion just can't work, the middle-end expects
the init and cond expressions to be literally something from the above list,
if that is turned into something divided by step, we've lost.
Now, the reason I've added the above expansion is because the middle-end
representation was chosen to be of the C/C++ loops and I wasn't sure if the
Fortran DO loop semantics
can be easily mapped to it.  For the non-rectangular loops, I'm afraid we have
to,
or have some flag on each of the OMP_FOR/GOMP_FOR loops to request Fortran
semantics.
If we do the latter, we'd need to adjust the middle-end (omp_extract_for_data,
everything that computes number of iterations, omp-expand loop expansion) to
handle that.
And I believe the non-simple outer loop is the same thing, for the
non-rectangular loops
the middle-end relies on the inner loop expressions that refer to var-outer to
be actually the outer loop's iterator.
So if we use the non-simple expansion for the outer loop:
             for (count = 0; count < (to + step - from) / step; count++)
               {
                 dovar = from + count * step;
                 body;
that would mean remapping the var_outer (aka dovar) in those expressions to
count based computations.

  parent reply	other threads:[~2023-01-13 11:07 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-26 18:37 [Bug fortran/107424] New: [13 Regression] ICE in gfc_trans_omp_do, at fortran/trans-openmp.cc:5397 gscfq@t-online.de
2022-10-27  8:50 ` [Bug fortran/107424] " marxin at gcc dot gnu.org
2022-10-28 11:35 ` rguenth at gcc dot gnu.org
2023-01-11 15:30 ` [Bug fortran/107424] [13 Regression] ICE in gfc_trans_omp_do, at fortran/trans-openmp.cc:5397 - and wrong code - with non-rectangular loops burnus at gcc dot gnu.org
2023-01-11 15:59 ` burnus at gcc dot gnu.org
2023-01-13 10:46 ` burnus at gcc dot gnu.org
2023-01-13 10:53 ` burnus at gcc dot gnu.org
2023-01-13 11:07 ` jakub at gcc dot gnu.org [this message]
2023-01-13 11:46 ` burnus at gcc dot gnu.org
2023-01-13 11:51 ` jakub at gcc dot gnu.org
2023-01-18 22:24 ` burnus at gcc dot gnu.org
2023-01-25 14:50 ` burnus at gcc dot gnu.org
2023-02-09 14:51 ` cvs-commit at gcc dot gnu.org
2023-02-09 14:54 ` burnus at gcc dot gnu.org
2023-04-26  6:56 ` [Bug fortran/107424] [13/14 " rguenth at gcc dot gnu.org
2023-07-17 11:15 ` burnus at gcc dot gnu.org
2023-07-19  8:19 ` cvs-commit at gcc dot gnu.org
2023-07-19  8:27 ` burnus at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-107424-4-NYbSasXhEL@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).