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

--- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Tue, Jan 15, 2019 at 12:39:13PM +0000, tkoenig at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88810
> 
> Thomas Koenig <tkoenig at gcc dot gnu.org> changed:
> 
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>                  CC|                            |tkoenig at gcc dot gnu.org
> 
> --- Comment #4 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
> As far as I can see, the duplicated code does not do anything bad,
> and removing the duplicate also would not do anything bad.
> 
> A patch removing the duplication is pre-approved, provided it
> passes a regression test.
> 

Are you sure it is duplicate code?

Here, if reverse[m] == GFC_ENABLE_REVERSE and this_dep == GFC_DEP_BACKWARD,
then reverse[m] is update to GFC_REVERSE_SET; otherwise it is left as-is
which is GFC_ENABLE_REVERSE.

    /* Set reverse if backward dependence and not inhibited.  */
    if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
      reverse[m] = (this_dep == GFC_DEP_BACKWARD) ?
            GFC_REVERSE_SET : reverse[m];

Here, if reverse[m] was updated to GFC_REVERSE_SET, the first
conditional fails and reverse[m] is left unchanged.  However, if
reverse[m] was left unchanged from above, it is then GFC_ENABLE_REVERSE.
gfortran then checks this_dep == GFC_DEP_FORWARD and updates accordingly.

    /* Set forward if forward dependence and not inhibited.  */
    if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
      reverse[m] = (this_dep == GFC_DEP_FORWARD) ?
            GFC_FORWARD_SET : reverse[m];

The code is likely correct as-is, but confusing.  Some would have
written

    /* Set reverse if backward dependence and not inhibited.  */
    if (reverse && reverse[m] == GFC_ENABLE_REVERSE
         && this_dep == GFC_DEP_BACKWARD)
      reverse[m] = GFC_REVERSE_SET;

    /* Set forward if forward dependence and not inhibited.  */
    if (reverse && reverse[m] == GFC_ENABLE_REVERSE
        && this_dep == GFC_DEP_FORWARD)
      reverse[m] = GFC_FORWARD_SET;

or

    if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
      {
         if (this_dep == GFC_DEP_BACKWARD)
           reverse[m] = GFC_REVERSE_SET;
         else if (this_dep == GFC_DEP_FORWARD)
           reverse[m] = GFC_FORWARD_SET;
      }

If this_dep can only take on the values of GFC_REVERSE_SET and
GFC_DEP_FORWARD, then the above can be collapsed to

    if (reverse && reverse[m] == GFC_ENABLE_REVERSE)
       reverse[m] = this_dep == GFC_DEP_BACKWARD
                  ? GFC_REVERSE_SET : GFC_FORWARD_SET;

Looks like this PR is a false positive.

Reply via email to