view gcc/testsuite/g++.dg/opt/pr69570.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
line wrap: on
line source

// PR rtl-optimization/69570
// { dg-do run }
// { dg-options "-O2" }
// { dg-additional-options "-fpic" { target fpic } }
// { dg-additional-options "-march=i686" { target ia32 } }

template <typename T> inline const T &
min (const T &a, const T &b)
{
  if (b < a)
    return b;
  return a;
}

template <typename T> inline const T &
max (const T &a, const T &b)
{
  if (a < b)
    return b;
  return a;
}

static inline void
foo (unsigned x, unsigned y, unsigned z, double &h, double &s, double &l)
{
  double r = x / 255.0;
  double g = y / 255.0;
  double b = z / 255.0;
  double m = max (r, max (g, b));
  double n = min (r, min (g, b));
  double d = m - n;
  double e = m + n;
  h = 0.0, s = 0.0, l = e / 2.0;
  if (d > 0.0)
    {
      s = l > 0.5 ? d / (2.0 - e) : d / e;
      if (m == r && m != g)
        h = (g - b) / d + (g < b ? 6.0 : 0.0);
      if (m == g && m != b)
        h = (b - r) / d + 2.0;
      if (m == b && m != r)
        h = (r - g) / d + 4.0;
      h /= 6.0;
    }
}

__attribute__ ((noinline, noclone))
void bar (unsigned x[3], double y[3])
{
  double h, s, l;
  foo (x[0], x[1], x[2], h, s, l);
  y[0] = h;
  y[1] = s;
  y[2] = l;
}

int
main ()
{
  unsigned x[3] = { 0, 128, 0 };
  double y[3];

  bar (x, y);
  if (__builtin_fabs (y[0] - 0.33333) > 0.001
      || __builtin_fabs (y[1] - 1) > 0.001
      || __builtin_fabs (y[2] - 0.25098) > 0.001)
    __builtin_abort ();

  return 0;
}