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

--- Comment #61 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:3cf52b87ff6938e30883b8f8f542a638635d507d

commit r11-7383-g3cf52b87ff6938e30883b8f8f542a638635d507d
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Feb 25 10:16:55 2021 +0100

    vrp: Handle VCE in vrp_simplify_cond_using_ranges [PR80635]

    > So I wonder what other optimizations are prevented here?

    > Why does uninit warn with VCE but not with NOP_EXPR?  Or does the
    > warning disappear because of those other optimizations you mention?

    The optimization that it prevents is in this particular case in tree-vrp.c
    (vrp_simplify_cond_using_ranges):

          if (!is_gimple_assign (def_stmt)
              || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt)))
            return;
    so it punts on VIEW_CONVERT_EXPR, with NOP_EXPR it optimizes that:
      _9 = (bool) maybe_a$4_7;
      if (_9 != 0)
    into:
      _9 = (bool) maybe_a$4_7;
      if (maybe_a$4_7 != 0)

    Now, if I apply my patch but manually disable this
    vrp_simplify_cond_using_ranges optimization, then the uninit warning is
    back, so on the uninit side it is not about VIEW_CONVERT_EXPR vs. NOP_EXPR,
    both are bad there, uninit wants the guarding condition to be
    that SSA_NAME and not some demotion cast thereof.
    We have:
      # maybe_a$m_6 = PHI <_5(4), maybe_a$m_4(D)(6)>
      # maybe_a$4_7 = PHI <1(4), 0(6)>
    ...
    One of:
      _9 = VIEW_CONVERT_EXPR<bool>(maybe_a$4_7);
      if (_9 != 0)
    or:
      _9 = (bool) maybe_a$4_7;
      if (_9 != 0)
    or:
      if (maybe_a$4_7 != 0)
    followed by:
        goto <bb 11>; [0.00%]
      else
        goto <bb 14>; [0.00%]
    ...
      <bb 11> [count: 0]:
      set (maybe_a$m_6);
    and uninit wants to see that maybe_a$m_4(D) is not used if
    bb 11 is encountered.

    This patch fixes it by teaching vrp_simplify_cond_using_ranges
    to handle VCE (when from an integral type) in addition to
    NOP_EXPR/CONVERT_EXPR, of course as long as the VCE or demotion
    doesn't change any values, i.e. when the range of the VCE or
    conversion operand fits into the target type.

    2021-02-25  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/80635
            * tree-vrp.c (vrp_simplify_cond_using_ranges): Also handle
            VIEW_CONVERT_EXPR if modes are the same, innerop is integral and
            has mode precision.

            * g++.dg/warn/pr80635-1.C: New test.
            * g++.dg/warn/pr80635-2.C: New test.

Reply via email to