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

Andrew Macleod <amacleod at redhat dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |amacleod at redhat dot com

--- Comment #1 from Andrew Macleod <amacleod at redhat dot com> ---
I'm not sure exactly what you want to do.
When we go into SSA we see:

  <bb 12> :
  _8 = arr[i_15];
  i.1_9 = (unsigned int) i_15;
  _10 = i.1_9 & 1;
  _11 = _10 != 0;
  _12 = (int) _11;
  if (_8 == _12)
    goto <bb 13>; [INV]
  else
    goto <bb 14>; [INV]

  <bb 13> :
  iftmp.0_27 = i_15 != -1;
  goto <bb 15>; [INV]

  <bb 14> :
  iftmp.0_26 = i_15 != -2;

  <bb 15> :
  # iftmp.0_16 = PHI <iftmp.0_27(13), iftmp.0_26(14)>
  if (iftmp.0_16 != 0)
    goto <bb 17>; [INV]
  else
    goto <bb 16>; [INV]

The EVRP pass recognizes that i_15 has a range of int [0, 32], thus folds 
 # iftmp.0_16 = PHI <iftmp.0_27(13), iftmp.0_26(14)>
into
# iftmp.0_16 = PHI <1, 1>
and continues to fold away the if that leads to the assert.

This seems to be too late to determine that a warning might be appropriate..
and I'm not sure how you would figure that out from this IL.

We have to go way back before gimple before we see the conditional expression.
I see the front end generates this is the .original file:
<D.1973>:;
    {
      if (arr[i] == (((unsigned int) i & 1) != 0) ? i != -1 : i != -2)
        {
          (void) 0;
        }
      else
        {
          __assert_fail ((const char *) "arr[i] == ((i % 2) != 0) ? i + 1 : i +
2", (const char *) "as.c", 17, (const char *) &__PRETTY_FUNCTION__);
        }

but even by the .gimple listing the COND_EXPR is gone, replaced with the iftmp
sequence.  Im not sure how you would determine that this is not working as
intended.. ?  we usually rejoice when we can fold asserts away :-)

The range machinery knows what you want to know, but IM not sure how you could
use it. Its only available once we go into SSA.

Reply via email to