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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
The SSA propagator does:

Visiting statement:
_11 = {x_4, x_4, x_4, x_4};
which is likely CONSTANT
Lattice value changed to VARYING.  Adding SSA edges to worklist.

Visiting statement:
_12 = BIT_FIELD_REF <_11, 32, 0>;
which is likely CONSTANT
Applying pattern match.pd:3627, gimple-match.c:67610
Match-and-simplified BIT_FIELD_REF <_11, 32, 0> to x_4
Lattice value changed to CONSTANT x_6(D).  Adding SSA edges to worklist.
marking stmt to be not simulated again

so while _11 is VARYING we still optimize the BIT_FIELD_REF optimistically,
namely to x_6(D) instead of x_4 using

Visiting PHI node: x_4 = PHI <x_6(D)(2), 1(3)>

    Argument #0 (2 -> 3 executable)
        x_6(D)  Value: CONSTANT x_6(D)

    Argument #1 (3 -> 3 not executable)

    PHI node value: CONSTANT x_6(D)

Lattice value changed to CONSTANT x_6(D).  Adding SSA edges to worklist.

this node will be visited again but the above not.

The issue is valueization here:

      simplified = ccp_fold (stmt);
      if (simplified && TREE_CODE (simplified) == SSA_NAME)
        {
          ccp_prop_value_t *val = get_value (simplified);
          if (val && val->lattice_val != VARYING)
            {
              fold_undefer_overflow_warnings (true, stmt, 0);
              return *val;
            }

ccp_fold (correctly) returns x_4 but then we valueize to x_6(D).

Reply via email to