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

--- Comment #7 from amker at gcc dot gnu.org ---
Case gcc.dg/tree-ssa/reassoc-19 failed, the ivopt dump before change is:

  <bb 2> [15.00%]:
  goto <bb 4>; [100.00%]

  <bb 3> [85.00%]:
  _1 = (sizetype) element_8(D);
  _2 = -_1;
  _12 = (unsigned long) element_8(D);
  _11 = -_12;
  _13 = rite_3 + _11;
  rite_9 = _13;
  bar (left_7(D), rite_9, element_8(D));

  <bb 4> [100.00%]:
  # rite_3 = PHI <rite_5(D)(2), rite_9(3)>
  if (rite_3 >= left_7(D))
    goto <bb 3>; [85.00%]
  else
    goto <bb 5>; [15.00%]

  <bb 5> [15.00%]:
  return;

But changed to below after change:
  <bb 2> [15.00%]:
  goto <bb 4>; [100.00%]

  <bb 3> [85.00%]:
  _1 = (sizetype) element_8(D);
  _2 = -_1;
  _12 = (unsigned long) rite_3;
  _11 = (unsigned long) element_8(D);
  _13 = _12 - _11;
  _14 = (char *) _13;
  rite_9 = _14;
  bar (left_7(D), rite_9, element_8(D));

  <bb 4> [100.00%]:
  # rite_3 = PHI <rite_5(D)(2), rite_9(3)>
  if (rite_3 >= left_7(D))
    goto <bb 3>; [85.00%]
  else
    goto <bb 5>; [15.00%]

  <bb 5> [15.00%]:
  return;

I  don't think this is real regression here, assembly code is the same.  The
additional type conversion is introduced by get_computation_aff.  Though we
have 
utype: char *
ctype: char *
var->typed.type: char *
The function still computes the expression in uutype:
  uutype = unsigned_type_for (utype);
which is unsigned long here.

Actually, given the computation sequence:

  if (common_type != uutype)
    aff_combination_convert (aff, uutype);

  aff_combination_scale (&var_aff, rat);
  aff_combination_add (aff, &var_aff);

I think type conversion is needed.  Of course, get_computation_aff should not
introduce unnecessary uutype conversion.

Reply via email to