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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
The issue is tail merging and I think we have a duplicate bug for this.

find_duplicates: <bb 5> duplicate of <bb 7>
Removing basic block 7
;; basic block 7, loop depth 0
;;  pred:
_27 = -9223372036854775808 / si2_15(D);
goto <bb 10>; [100.00%]

and we have

  <bb 4> [local count: 268435457]:
  _5 = si2_15(D) > 0;
  _6 = _1 | _5;
  if (_6 != 0)
    goto <bb 6>; [20.00%]
  else
    goto <bb 5>; [80.00%]

  <bb 5> [local count: 214748365]:
  _13 = -9223372036854775808 / si1_14(D);
  goto <bb 10>; [100.00%]

  <bb 6> [local count: 301989889]:
  _7 = si1_14(D) > 0;
  _9 = _2 | _7;
  if (_9 != 0)
    goto <bb 8>; [0.00%]
  else
    goto <bb 7>; [100.00%]

  <bb 7> [local count: 301989888]:
  _27 = -9223372036854775808 / si2_15(D);
  goto <bb 10>; [100.00%]

oddly enough gimple_equal_p looks strange:

    case GIMPLE_ASSIGN:
      lhs1 = gimple_get_lhs (s1);
      lhs2 = gimple_get_lhs (s2);
      if (TREE_CODE (lhs1) != SSA_NAME
          && TREE_CODE (lhs2) != SSA_NAME)
        return (operand_equal_p (lhs1, lhs2, 0)
                && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
                                                 gimple_assign_rhs1 (s2)));
      else if (TREE_CODE (lhs1) == SSA_NAME
               && TREE_CODE (lhs2) == SSA_NAME)
        return operand_equal_p (gimple_assign_rhs1 (s1),
                                gimple_assign_rhs1 (s2), 0);

that looks pre-tuplish to me.

Reply via email to