1  /* PR target/98737 */
       2  /* { dg-do compile { target i?86-*-* x86_64-*-* powerpc*-*-* aarch64*-*-* } } */
       3  /* { dg-options "-O2 -fdump-tree-optimized -fcompare-debug" } */
       4  /* { dg-additional-options "-march=i686" { target ia32 } } */
       5  /* { dg-final { scan-tree-dump-not "__atomic_fetch_" "optimized" } } */
       6  /* { dg-final { scan-tree-dump-not "__sync_fetch_and_" "optimized" } } */
       7  
       8  typedef signed char schar;
       9  typedef unsigned long ulong;
      10  typedef unsigned int uint;
      11  typedef unsigned short ushort;
      12  typedef unsigned char uchar;
      13  long vlong;
      14  int vint;
      15  short vshort;
      16  schar vschar;
      17  ulong vulong;
      18  uint vuint;
      19  ushort vushort;
      20  uchar vuchar;
      21  #define A(n, t, ut, f, o, ...) \
      22  t fn##n (t x)					\
      23  {						\
      24    ut z = f (&v##t, x, ##__VA_ARGS__);		\
      25    t w = (t) z;					\
      26    return w o x;					\
      27  }
      28  #define B(n, f, o, ...) \
      29    A(n##0, long, ulong, f, o, ##__VA_ARGS__)	\
      30    A(n##1, int, uint, f, o, ##__VA_ARGS__)	\
      31    A(n##2, short, ushort, f, o, ##__VA_ARGS__)	\
      32    A(n##3, schar, uchar, f, o, ##__VA_ARGS__)	\
      33    A(n##4, ulong, ulong, f, o, ##__VA_ARGS__)	\
      34    A(n##5, uint, uint, f, o, ##__VA_ARGS__)	\
      35    A(n##6, ushort, ushort, f, o, ##__VA_ARGS__)	\
      36    A(n##7, uchar, uchar, f, o, ##__VA_ARGS__)
      37  
      38  B(00, __atomic_fetch_add, +, __ATOMIC_RELAXED)
      39  B(01, __atomic_fetch_sub, -, __ATOMIC_RELAXED)
      40  B(02, __atomic_fetch_and, &, __ATOMIC_RELAXED)
      41  B(03, __atomic_fetch_xor, ^, __ATOMIC_RELAXED)
      42  B(04, __atomic_fetch_or, |, __ATOMIC_RELAXED)
      43  B(05, __sync_fetch_and_add, +)
      44  B(06, __sync_fetch_and_sub, -)
      45  B(07, __sync_fetch_and_and, &)
      46  B(08, __sync_fetch_and_xor, ^)
      47  B(09, __sync_fetch_and_or, |)
      48  
      49  #undef A
      50  #define A(n, t, ut, f, o, ...) \
      51  t fn##n (void)					\
      52  {						\
      53    ut z = f (&v##t, 42, ##__VA_ARGS__);		\
      54    t w = (t) z;					\
      55    return w o 42;				\
      56  }
      57  
      58  B(10, __atomic_fetch_add, +, __ATOMIC_RELAXED)
      59  B(11, __atomic_fetch_sub, -, __ATOMIC_RELAXED)
      60  B(12, __atomic_fetch_and, &, __ATOMIC_RELAXED)
      61  B(13, __atomic_fetch_xor, ^, __ATOMIC_RELAXED)
      62  B(14, __atomic_fetch_or, |, __ATOMIC_RELAXED)
      63  B(15, __sync_fetch_and_add, +)
      64  B(16, __sync_fetch_and_sub, -)
      65  B(17, __sync_fetch_and_and, &)
      66  B(18, __sync_fetch_and_xor, ^)
      67  B(19, __sync_fetch_and_or, |)
      68  
      69  #undef A
      70  #define A(n, t, ut, f, o, ...) \
      71  t fn##n (t x)					\
      72  {						\
      73    ut z = f (&v##t, x, ##__VA_ARGS__);		\
      74    t w = (t) z;					\
      75    t v = w o x;					\
      76    return v == 0;				\
      77  }
      78  
      79  B(20, __atomic_fetch_add, +, __ATOMIC_RELAXED)
      80  B(21, __atomic_fetch_sub, -, __ATOMIC_RELAXED)
      81  B(22, __atomic_fetch_and, &, __ATOMIC_RELAXED)
      82  B(23, __atomic_fetch_xor, ^, __ATOMIC_RELAXED)
      83  B(24, __atomic_fetch_or, |, __ATOMIC_RELAXED)
      84  B(25, __sync_fetch_and_add, +)
      85  B(26, __sync_fetch_and_sub, -)
      86  B(27, __sync_fetch_and_and, &)
      87  B(28, __sync_fetch_and_xor, ^)
      88  B(29, __sync_fetch_and_or, |)
      89  
      90  #undef A
      91  #define A(n, t, ut, f, o, ...) \
      92  t fn##n (void)					\
      93  {						\
      94    ut z = f (&v##t, 42, ##__VA_ARGS__);		\
      95    t w = (t) z;					\
      96    t v = w o 42;					\
      97    return v != 0;				\
      98  }
      99  
     100  B(30, __atomic_fetch_add, +, __ATOMIC_RELAXED)
     101  B(31, __atomic_fetch_sub, -, __ATOMIC_RELAXED)
     102  B(32, __atomic_fetch_and, &, __ATOMIC_RELAXED)
     103  B(33, __atomic_fetch_xor, ^, __ATOMIC_RELAXED)
     104  B(34, __atomic_fetch_or, |, __ATOMIC_RELAXED)
     105  B(35, __sync_fetch_and_add, +)
     106  B(36, __sync_fetch_and_sub, -)
     107  B(37, __sync_fetch_and_and, &)
     108  B(38, __sync_fetch_and_xor, ^)
     109  B(39, __sync_fetch_and_or, |)
     110  
     111  #undef A
     112  #define A(n, t, ut, f, o, ...) \
     113  t fn##n (t x)					\
     114  {						\
     115    return (t) (((t) f (&v##t, x, ##__VA_ARGS__))	\
     116  	      o x) != 0;			\
     117  }
     118  
     119  B(40, __atomic_fetch_add, +, __ATOMIC_RELAXED)
     120  B(41, __atomic_fetch_sub, -, __ATOMIC_RELAXED)
     121  B(42, __atomic_fetch_and, &, __ATOMIC_RELAXED)
     122  B(43, __atomic_fetch_xor, ^, __ATOMIC_RELAXED)
     123  B(44, __atomic_fetch_or, |, __ATOMIC_RELAXED)
     124  B(45, __sync_fetch_and_add, +)
     125  B(46, __sync_fetch_and_sub, -)
     126  B(47, __sync_fetch_and_and, &)
     127  B(48, __sync_fetch_and_xor, ^)
     128  B(49, __sync_fetch_and_or, |)
     129  
     130  #undef A
     131  #define A(n, t, ut, f, o, ...) \
     132  t fn##n (void)					\
     133  {						\
     134    return (t) (((t) f (&v##t, 42, ##__VA_ARGS__))\
     135  	      o 42) == 0;			\
     136  }
     137  
     138  B(50, __atomic_fetch_add, +, __ATOMIC_RELAXED)
     139  B(51, __atomic_fetch_sub, -, __ATOMIC_RELAXED)
     140  B(52, __atomic_fetch_and, &, __ATOMIC_RELAXED)
     141  B(53, __atomic_fetch_xor, ^, __ATOMIC_RELAXED)
     142  /* (whatever | 42) == 0 is 0, so we can't test this.  */
     143  /* B(54, __atomic_fetch_or, |, __ATOMIC_RELAXED) */
     144  B(55, __sync_fetch_and_add, +)
     145  B(56, __sync_fetch_and_sub, -)
     146  B(57, __sync_fetch_and_and, &)
     147  B(58, __sync_fetch_and_xor, ^)
     148  /* B(59, __sync_fetch_and_or, |) */