aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/tree-ssa/pow_fold_1.c
blob: d98bcb0827e4bfc56fa1d35d01f17bcb0ddd2214 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-optimized -fexcess-precision=16" } */
/* { dg-add-options float16 } */
/* { dg-require-effective-target float16_runtime } */
/* { dg-require-effective-target c99_runtime } */

extern void link_error (void);

#define POW1OVER(TYPE1, TYPE2, CTY, TY)			\
  void							\
  pow1over_##TY (TYPE1 x, TYPE2 y)			\
  {							\
    TYPE1 t1 = 1.0##CTY / x;				\
    TYPE1 t2 = __builtin_pow##TY (t1, y);		\
    TYPE2 t3 = -y;					\
    TYPE1 t4 = __builtin_pow##TY (x, t3);		\
    if (t2 != t4)					\
      link_error ();					\
  }							\

#define POW0(TYPE1, TYPE2, CTY, TY)			\
  void							\
  pow0_##TY (TYPE2 x)					\
  {							\
    TYPE1 t1 = __builtin_pow##TY (0.0##CTY, x);		\
    if (t1 != 0.0##CTY)					\
      link_error ();					\
  }							\

#define TEST_ALL(TYPE1, TYPE2, CTY, TY)			\
  POW1OVER (TYPE1, TYPE2, CTY, TY)			\
  POW0 (TYPE1, TYPE2, CTY, TY)

TEST_ALL (double, double, , )
TEST_ALL (float, float, f, f)
TEST_ALL (_Float16, _Float16, f16, f16)
TEST_ALL (long double, long double, L, l)
TEST_ALL (double, int, , i)
TEST_ALL (float, int, f, if)
TEST_ALL (long double, int, L, il)

/* { dg-final { scan-tree-dump-not "link_error" "optimized" } } */