(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
rotate-8.c
       1  /* PR middle-end/62263 */
       2  /* PR middle-end/82498 */
       3  /* { dg-do compile } */
       4  /* { dg-options "-O2 -fno-ipa-icf -fdump-tree-optimized" } */
       5  /* { dg-final { scan-tree-dump-times "r\[<>]\[<>]" 23 "optimized" } } */
       6  /* { dg-final { scan-tree-dump-not "PHI <" "optimized" } } */
       7  
       8  #if __SIZEOF_INT__ == 2
       9  #define LARGE_UNSIGNED 0x1234U
      10  #else
      11  #define LARGE_UNSIGNED 0x12345678U
      12  #endif
      13  
      14  unsigned int
      15  f1 (unsigned int x, unsigned char y)
      16  {
      17    y %= __CHAR_BIT__ * __SIZEOF_INT__;
      18    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
      19  }
      20  
      21  unsigned int
      22  f2 (unsigned int x, signed char y)
      23  {
      24    y &= __CHAR_BIT__ * __SIZEOF_INT__ - 1;
      25    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
      26  }
      27  
      28  unsigned int
      29  f3 (unsigned int x, unsigned char y)
      30  {
      31    return (x << (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))));
      32  }
      33  
      34  unsigned int
      35  f4 (unsigned int x, unsigned char y)
      36  {
      37    y = y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1);
      38    return y ? (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y)) : x;
      39  }
      40  
      41  unsigned int
      42  f5 (unsigned int x, unsigned char y)
      43  {
      44    y = y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1);
      45    return (x << y) | (x >> ((__CHAR_BIT__ * __SIZEOF_INT__ - y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      46  }
      47  
      48  unsigned int
      49  f6 (unsigned int x, unsigned char y)
      50  {
      51    return (x << (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (x >> ((__CHAR_BIT__ * __SIZEOF_INT__ - (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      52  }
      53  
      54  unsigned int
      55  f7 (unsigned int x, unsigned char y)
      56  {
      57    return (x << (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (x >> ((__CHAR_BIT__ * __SIZEOF_INT__ - y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      58  }
      59  
      60  unsigned int
      61  f8 (unsigned int x, unsigned char y)
      62  {
      63    return (x << (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (x >> ((-y) & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      64  }
      65  
      66  unsigned int
      67  f9 (unsigned int x, int y)
      68  {
      69    return (LARGE_UNSIGNED << (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (LARGE_UNSIGNED >> (-y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      70  }
      71  
      72  unsigned int
      73  f10 (unsigned int x, int y)
      74  {
      75    return (LARGE_UNSIGNED >> (-y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (LARGE_UNSIGNED << (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      76  }
      77  
      78  unsigned int
      79  f11 (unsigned int x, int y)
      80  {
      81    return (LARGE_UNSIGNED >> (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (LARGE_UNSIGNED << (-y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      82  }
      83  
      84  unsigned int
      85  f12 (unsigned int x, int y)
      86  {
      87    return (LARGE_UNSIGNED << (-y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1))) | (LARGE_UNSIGNED >> (y & (__CHAR_BIT__ * __SIZEOF_INT__ - 1)));
      88  }
      89  
      90  unsigned
      91  f13 (unsigned x, unsigned char y)
      92  {
      93    if (y == 0)
      94      return x;
      95    y %= __CHAR_BIT__ * __SIZEOF_INT__;
      96    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
      97  }
      98  
      99  unsigned
     100  f14 (unsigned x, unsigned y)
     101  {
     102    if (y == 0)
     103      return x;
     104    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     105    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
     106  }
     107  
     108  unsigned
     109  f15 (unsigned x, unsigned short y)
     110  {
     111    if (y == 0)
     112      return x;
     113    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     114    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
     115  }
     116  
     117  unsigned
     118  f16 (unsigned x, unsigned char y)
     119  {
     120    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     121    if (y == 0)
     122      return x;
     123    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
     124  }
     125  
     126  unsigned
     127  f17 (unsigned x, unsigned y)
     128  {
     129    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     130    if (y == 0)
     131      return x;
     132    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
     133  }
     134  
     135  unsigned
     136  f18 (unsigned x, unsigned short y)
     137  {
     138    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     139    if (y == 0)
     140      return x;
     141    return (x << y) | (x >> (__CHAR_BIT__ * __SIZEOF_INT__ - y));
     142  }
     143  
     144  unsigned
     145  f19 (unsigned x, unsigned char y)
     146  {
     147    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     148    return (x << y) | (x >> (((unsigned char) -y) % (__CHAR_BIT__ * __SIZEOF_INT__)));
     149  }
     150  
     151  unsigned
     152  f20 (unsigned x, unsigned int y)
     153  {
     154    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     155    return (x << y) | (x >> (-y % (__CHAR_BIT__ * __SIZEOF_INT__)));
     156  }
     157  
     158  unsigned
     159  f21 (unsigned x, unsigned short y)
     160  {
     161    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     162    return (x << y) | (x >> (((unsigned short) -y) % (__CHAR_BIT__ * __SIZEOF_INT__)));
     163  }
     164  
     165  unsigned
     166  f22 (unsigned x, unsigned char y)
     167  {
     168    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     169    return (x << y) | (x >> (-y & ((__CHAR_BIT__ * __SIZEOF_INT__) - 1)));
     170  }
     171  
     172  unsigned
     173  f23 (unsigned x, unsigned short y)
     174  {
     175    y %= __CHAR_BIT__ * __SIZEOF_INT__;
     176    return (x << y) | (x >> (-y & ((__CHAR_BIT__ * __SIZEOF_INT__) - 1)));
     177  }