1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -march=skylake-avx512 -fdump-tree-optimized" } */
       3  /* { dg-final { scan-tree-dump-times ".COND_SHR" 2 "optimized" } } */
       4  /* { dg-final { scan-tree-dump-times ".COND_SHL" 2 "optimized" } } */
       5  /* { dg-final { scan-assembler-times "vpsrad"  1 } } */
       6  /* { dg-final { scan-assembler-times "vpslld"  1 } } */
       7  /* { dg-final { scan-assembler-times "vpsravd"  1 } } */
       8  /* { dg-final { scan-assembler-times "vpsllvd"  1 } } */
       9  
      10  
      11  typedef short int16;
      12  typedef unsigned short uint16;
      13  typedef int int32;
      14  typedef unsigned int uint32;
      15  typedef long long int64;
      16  typedef unsigned long long uint64;
      17  
      18  #ifndef NUM
      19  #define NUM 800
      20  #endif
      21  #ifndef TYPE
      22  #define TYPE int
      23  #endif
      24  
      25  TYPE a[NUM], b[NUM], c[NUM], d[NUM], e[NUM], j[NUM];
      26  #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
      27  #define MAX(X,Y) ((X) < (Y) ? (Y) : (X))
      28  
      29  #define BINC(OPNAME, OP)			\
      30    void						\
      31    __attribute__ ((noipa,optimize ("O3")))	\
      32    foo_##OPNAME##_const ()			\
      33    {						\
      34      for (int i = 0; i != NUM; i++)		\
      35        if (b[i] < c[i])				\
      36  	a[i] = d[i] OP 3;			\
      37        else					\
      38  	a[i] = MAX(d[i], e[i]);		\
      39    }
      40  
      41  #define BINV(OPNAME, OP)			\
      42    void						\
      43    __attribute__ ((noipa,optimize ("O3")))	\
      44    foo_##OPNAME##_variable ()			\
      45    {						\
      46      for (int i = 0; i != NUM; i++)		\
      47        if (b[i] < c[i])				\
      48  	a[i] = d[i] OP e[i];			\
      49        else					\
      50  	a[i] = MAX(d[i], e[i]);		\
      51    }
      52  
      53  BINC (shl, <<);
      54  BINC (shr, >>);
      55  BINV (shl, <<);
      56  BINV (shr, >>);