1  /* { dg-options "-funsafe-math-optimizations" } */
       2  
       3  double random_double (void);
       4  int setjmp (void *);
       5  void do_something (void);
       6  
       7  #define TEST_UNARY(FUNC)			\
       8    double					\
       9    FUNC##_dead (void *buffer)			\
      10    {						\
      11      double d = random_double ();		\
      12      setjmp (buffer);				\
      13      __builtin_##FUNC (d);			\
      14      d += 1;					\
      15      do_something ();				\
      16      return d;					\
      17    }						\
      18  						\
      19    double					\
      20    FUNC##_live (void *buffer)			\
      21    {						\
      22      double d = random_double ();		\
      23      setjmp (buffer);				\
      24      d = __builtin_##FUNC (d);			\
      25      do_something ();				\
      26      return d;					\
      27    }
      28  
      29  
      30  #define TEST_BINARY(FUNC)			\
      31    double					\
      32    FUNC##_dead (void *buffer)			\
      33    {						\
      34      double d1 = random_double ();		\
      35      double d2 = random_double ();		\
      36      setjmp (buffer);				\
      37      __builtin_##FUNC (d1, d2);			\
      38      d1 += 1;					\
      39      d2 += 1;					\
      40      do_something ();				\
      41      return d1 + d2;				\
      42    }						\
      43  						\
      44    double					\
      45    FUNC##_live (void *buffer)			\
      46    {						\
      47      double d1 = random_double ();		\
      48      double d2 = random_double ();		\
      49      setjmp (buffer);				\
      50      d1 = __builtin_##FUNC (d1, d2);		\
      51      d2 += 1;					\
      52      return d1 + d2;				\
      53    }
      54  
      55  TEST_UNARY (acos)
      56  TEST_UNARY (asin)
      57  TEST_UNARY (asinh)
      58  TEST_UNARY (atan)
      59  TEST_UNARY (atanh)
      60  TEST_UNARY (cos)
      61  TEST_UNARY (cosh)
      62  TEST_UNARY (exp)
      63  TEST_UNARY (expm1)
      64  TEST_UNARY (exp2)
      65  TEST_UNARY (exp10)
      66  TEST_UNARY (log)
      67  TEST_UNARY (log2)
      68  TEST_UNARY (log10)
      69  TEST_UNARY (log1p)
      70  TEST_UNARY (significand)
      71  TEST_UNARY (sin)
      72  TEST_UNARY (sinh)
      73  TEST_UNARY (sqrt)
      74  
      75  TEST_BINARY (fmod)
      76  TEST_BINARY (remainder)