1  /* PR tree-optimization/92834 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -fdump-tree-optimized" } */
       4  /* { dg-final { scan-tree-dump-times "MIN_EXPR <" 8 "optimized" } } */
       5  /* { dg-final { scan-tree-dump-times "MAX_EXPR <" 8 "optimized" } } */
       6  
       7  static inline unsigned
       8  umax1 (unsigned a, unsigned b)
       9  {
      10    return a - ((a - b) & -(a < b));
      11  }
      12  
      13  static inline unsigned
      14  umin1 (unsigned a, unsigned b)
      15  {
      16    return a - ((a - b) & -(a > b));
      17  }
      18  
      19  static inline int
      20  smax1 (int a, int b)
      21  {
      22    return a - ((a - b) & -(a < b));
      23  }
      24  
      25  static inline int
      26  smin1 (int a, int b)
      27  {
      28    return a - ((a - b) & -(a > b));
      29  }
      30  
      31  static inline unsigned long long
      32  umax2 (unsigned long long a, unsigned long long b)
      33  {
      34    return a - ((a - b) & -(a <= b));
      35  }
      36  
      37  static inline unsigned long long
      38  umin2 (unsigned long long a, unsigned long long b)
      39  {
      40    return a - ((a - b) & -(a >= b));
      41  }
      42  
      43  static inline long long
      44  smax2 (long long a, long long b)
      45  {
      46    return a - ((a - b) & -(a <= b));
      47  }
      48  
      49  static inline long long
      50  smin2 (long long a, long long b)
      51  {
      52    return a - ((a - b) & -(a >= b));
      53  }
      54  
      55  static inline unsigned
      56  umax3 (unsigned a, unsigned b)
      57  {
      58    return a + ((b - a) & -(a < b));
      59  }
      60  
      61  static inline unsigned
      62  umin3 (unsigned a, unsigned b)
      63  {
      64    return a + ((b - a) & -(a > b));
      65  }
      66  
      67  static inline int
      68  smax3 (int a, int b)
      69  {
      70    return a + ((b - a) & -(a < b));
      71  }
      72  
      73  static inline int
      74  smin3 (int a, int b)
      75  {
      76    return a + ((b - a) & -(a > b));
      77  }
      78  
      79  static inline unsigned long long
      80  umax4 (unsigned long long a, unsigned long long b)
      81  {
      82    return a + ((b - a) & -(a <= b));
      83  }
      84  
      85  static inline unsigned long long
      86  umin4 (unsigned long long a, unsigned long long b)
      87  {
      88    return a + ((b - a) & -(a >= b));
      89  }
      90  
      91  static inline long long
      92  smax4 (long long a, long long b)
      93  {
      94    return a + ((b - a) & -(a <= b));
      95  }
      96  
      97  static inline long long
      98  smin4 (long long a, long long b)
      99  {
     100    return a + ((b - a) & -(a >= b));
     101  }
     102  
     103  void
     104  test (unsigned *x, int *y, unsigned long long *z, long long *w)
     105  {
     106    x[2] = umax1 (x[0], x[1]);
     107    x[5] = umin1 (x[2], x[3]);
     108    y[2] = smax1 (y[0], y[1]);
     109    y[5] = smin1 (y[2], y[3]);
     110    z[2] = umax2 (z[0], z[1]);
     111    z[5] = umin2 (z[2], z[3]);
     112    w[2] = smax2 (w[0], w[1]);
     113    w[5] = smin2 (w[2], w[3]);
     114    x[8] = umax3 (x[6], x[7]);
     115    x[11] = umin3 (x[9], x[10]);
     116    y[8] = smax3 (y[6], y[7]);
     117    y[11] = smin3 (y[9], y[10]);
     118    z[8] = umax4 (z[6], z[7]);
     119    z[11] = umin4 (z[9], z[10]);
     120    w[8] = smax4 (w[6], w[7]);
     121    w[11] = smin4 (w[9], w[10]);
     122  }