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

            Bug ID: 111324
           Summary: More optimization about "(X * Y) / Y"
           Product: gcc
           Version: 14.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: guojiufu at gcc dot gnu.org
  Target Milestone: ---

For case:
------ t.c
typedef unsigned int INT;

INT
foo (INT x, INT y)
{
  if (x > 100 || y > 100)
    return 0;
  return (x * y) / y;
}
---------
gcc -O2 t.c -S -fdump-tree-optimized

  <bb 4> [local count: 467721933]:
  _1 = x_3(D) * y_4(D);
  _5 = _1 / y_4(D);

  <bb 5> [local count: 1073741824]:
  # _2 = PHI <0(2), _5(4), 0(3)>
  return _2;

While for the below case, it can be optimized.

------
typedef unsigned int INT;

INT
foo (INT x, INT y)
{
  if (x > 100 || y > 100)
    return 0;
  INT x1 = x + 1;
  INT y1 = y + 1;
  return (x1 * y1) / y1;
}
-------

The "(x1 * y1) / y1" is optimized to "x1". 

  <bb 4> [local count: 467721933]:
  x1_4 = x_2(D) + 1;

  <bb 5> [local count: 1073741824]:
  # _1 = PHI <0(2), x1_4(4), 0(3)>
  return _1;

Reply via email to