1  /* PR tree-optimization/56064 */
       2  /* { dg-do run } */
       3  /* { dg-options "-std=gnu99 -O2 -fno-builtin-memcpy" } */
       4  
       5  extern void abort (void);
       6  extern void *memcpy (void*, const void*, __SIZE_TYPE__);
       7  
       8  #define f_pun_i(F, I, VAL)                      \
       9    {                                             \
      10      I i1 = VAL;                                 \
      11      I i2 = VAL;                                 \
      12      F q1, q2;                                   \
      13      memcpy (&q1, &i1, sizeof (I));              \
      14      __builtin_memcpy (&q2, &i2, sizeof (I));    \
      15      if (q1 != q2)                               \
      16        abort();                                  \
      17    }
      18  
      19  #define i_pun_f(I, F, VAL)                      \
      20    {                                             \
      21      F q1 = VAL;                                 \
      22      F q2 = VAL;                                 \
      23      I i1, i2;                                   \
      24      memcpy (&i1, &q1, sizeof (I));              \
      25      __builtin_memcpy (&i2, &q2, sizeof (I));    \
      26      if (i1 != i2)                               \
      27        abort();                                  \
      28    }
      29  
      30  
      31  void __attribute__((noinline))
      32  test8 (void)
      33  {
      34  #ifdef __INT8_TYPE__
      35    if (sizeof (__INT8_TYPE__) == sizeof (short _Fract))
      36      {
      37  #define TEST(X) f_pun_i (short _Fract, __INT8_TYPE__, __INT8_C (X))
      38        TEST (123);
      39        TEST (-123);
      40  #undef TEST
      41  
      42  #define TEST(X) i_pun_f (__INT8_TYPE__, short _Fract, X ## hr)
      43        TEST (0.1234);
      44        TEST (-0.987);
      45  #undef TEST
      46      }
      47  #endif /* __INT8_TYPE__ */
      48  }
      49  
      50  
      51  void __attribute__((noinline))
      52  test16 (void)
      53  {
      54  #ifdef __INT16_TYPE__
      55  
      56    if (sizeof (__INT16_TYPE__) == sizeof (_Fract))
      57      {
      58  #define TEST(X) f_pun_i (_Fract, __INT16_TYPE__, __INT16_C (X))
      59        TEST (0x4321);
      60        TEST (-0x4321);
      61        TEST (0x8000);
      62  #undef TEST
      63  
      64  #define TEST(X) i_pun_f (__INT16_TYPE__, _Fract, X ## r)
      65        TEST (0.12345);
      66        TEST (-0.98765);
      67  #undef TEST
      68      }
      69  #endif /* __INT16_TYPE__ */
      70  }
      71  
      72  
      73  void __attribute__((noinline))
      74  test32 (void)
      75  {
      76  #ifdef __INT32_TYPE__
      77    if (sizeof (__INT32_TYPE__) == sizeof (_Accum))
      78      {
      79  #define TEST(X) f_pun_i (_Accum, __INT32_TYPE__, __INT32_C (X))
      80        TEST (0x76543219);
      81        TEST (-0x76543219);
      82        TEST (0x80000000);
      83  #undef TEST
      84  
      85  #define TEST(X) i_pun_f (__INT32_TYPE__, _Accum, X ## k)
      86        TEST (123.456789);
      87        TEST (-123.456789);
      88  #undef TEST
      89      }
      90  #endif /* __INT32_TYPE__ */
      91  }
      92  
      93  
      94  void __attribute__((noinline))
      95  test64 (void)
      96  {
      97  #ifdef __INT64_TYPE__
      98    if (sizeof (__INT64_TYPE__) == sizeof (long _Accum))
      99      {
     100  #define TEST(X) f_pun_i (long _Accum, __INT64_TYPE__, __INT64_C (X))
     101        TEST (0x12345678abcdef01);
     102        TEST (-0x12345678abcdef01);
     103        TEST (0x8000000000000000);
     104  #undef TEST
     105  
     106  #define TEST(X) i_pun_f (__INT64_TYPE__, long _Accum, X ## lk)
     107        TEST (123.456789);
     108        TEST (-123.456789);
     109  #undef TEST
     110      }
     111  #endif /* __INT64_TYPE__ */
     112  }
     113  
     114  int main()
     115  {
     116    test8();
     117    test16();
     118    test32();
     119    test64();
     120    
     121    return 0;
     122  }