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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Last reconfirmed|                            |2021-11-25
           Severity|normal                      |enhancement
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
  _1 = MAX_EXPR <n_3(D), 63>;
  _2 = _1 & -64;
  _4 = n_3(D) - _2;

Something like:

(simplify
 (minus @0 (bit_and (max @0 INTEGER_CST@1) INTEGER_CST@2))
 (if (@1 == (@2)-1)
  (if (TYPE_SIGN (type) == UNSIGNED)
   (bit_and @0 @1)
   (cond (le @0 @1) @0 (bit_and @0 @1))
  )
 )
)

Note LLVM handles the unsigned case already.

Also note also even though GCC can handle the loop case for signed, it only
handles it on the RTL level, for gimple GCC produces:
  _3 = n_2(D) + -64;
  _8 = (unsigned int) n_2(D);
  _9 = _8 + 4294967232; // _9 = _3 - 64
  _10 = _9 >> 6; // _10 = _9/64
  _11 = (int) _10;
  _12 = _11 * -64;
  n_1 = _3 + _12;

Reply via email to