1  /* PR tree-optimization/94786 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -fdump-tree-optimized" } */
       4  /* { dg-final { scan-tree-dump-times "MIN_EXPR <" 4 "optimized" } } */
       5  /* { dg-final { scan-tree-dump-times "MAX_EXPR <" 4 "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  void
      56  test (unsigned *x, int *y, unsigned long long *z, long long *w)
      57  {
      58    x[2] = umax1 (x[0], x[1]);
      59    x[5] = umin1 (x[2], x[3]);
      60    y[2] = smax1 (y[0], y[1]);
      61    y[5] = smin1 (y[2], y[3]);
      62    z[2] = umax2 (z[0], z[1]);
      63    z[5] = umin2 (z[2], z[3]);
      64    w[2] = smax2 (w[0], w[1]);
      65    w[5] = smin2 (w[2], w[3]);
      66  }