The vrp47 testcase currently fails on i386 and S/390.  The ssa code before vrp
looks different for both compared to x86_64 due to a different value
returned by BRANCH_COST. (Branches on S/390 are relatively cheap due
to a sophisticated branch prediction unit.)  Therefore during
gimplification fold_truthop (line 5866) uses more branches for
function h in vrp47.c than the x86_64 variant.
The problem can also be reproduced on x86 when compiling for a cpu with low
branch costs defined in i386.c as e.g. -march=i386.

int h(int x, int y)
{
  if ((x >= 0 && x <= 1) && (y >= 0 && y <= 1))
    return x && y;
  else
    return -1;
}

Compile the testcase above with:
cc1 -m32 -O2 vrp47.c -fdump-tree-vrp -march=i386

The vrp pass is not able to get rid of the comparisons in this case
(069t.vrp1 from i386):

h (int x, int y)
{
  int D.2021;
  unsigned int y.1;
  unsigned int x.0;

<bb 2>:
  x.0_4 = (unsigned int) x_3(D);
  if (x.0_4 <= 1)
    goto <bb 3>;
  else
    goto <bb 7>;

<bb 3>:
  y.1_6 = (unsigned int) y_5(D);
  if (y.1_6 <= 1)
    goto <bb 4>;
  else
    goto <bb 7>;

<bb 4>:
  if (x_3(D) != 0)
    goto <bb 5>;
  else
    goto <bb 6>;

<bb 5>:
  if (y_5(D) != 0)
    goto <bb 7>;
  else
    goto <bb 6>;

<bb 6>:

<bb 7>:
  # D.2021_1 = PHI <0(6), -1(3), -1(2), 1(5)>
  return D.2021_1;

}


-- 
           Summary: VRP fails to get rid of compares
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: krebbel at gcc dot gnu dot org
 GCC build triplet: i386-gnu-linux, s390x-ibm-linux
  GCC host triplet: i386-gnu-linux, s390x-ibm-linux
GCC target triplet: i386-gnu-linux, s390x-ibm-linux


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

Reply via email to