------- Comment #4 from rguenth at gcc dot gnu dot org  2007-11-15 15:08 -------
This looks like this old bug that evaluate_stmt() sets results to UNDEFINED. 
As
we visit

D.26933_16 = __t_14 * D.26932_15;

the result should become VARYING, but we make it UNDEFINED.  Because also
likely_value () returns UNDEFINED for it.  Because in the process of setting
__t we use undefined operands (but those get overwritten).

  D.26929_10 = IMAGPART_EXPR <__t_6(D)>;
  __t_11 = COMPLEX_EXPR <b$_M_value$real_24, D.26929_10>;
  D.26931_13 = REALPART_EXPR <__t_11>;
  __t_14 = COMPLEX_EXPR <D.26931_13, b$_M_value$imag_23>;
  D.26932_15 = COMPLEX_EXPR <a$_M_value$real_21, a$_M_value$imag_22>;
  D.26933_16 = __t_14 * D.26932_15;

so at least

  has_constant_operand = false;
  FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE | SSA_OP_VUSE)
    {
      prop_value_t *val = get_value (use);

      if (val->lattice_val == UNDEFINED)
        return UNDEFINED; 

      if (val->lattice_val == CONSTANT)
        has_constant_operand = true;
    }

doesn't look conservatively correct, because we pro-actively prefer UNDEFINED
here.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34099

Reply via email to