1  /* { dg-do run } */
       2  /* { dg-options "-O -fdump-tree-optimized-raw" } */
       3  
       4  #define DECLS(n,VOL)			\
       5  __attribute__((noinline,noclone))	\
       6  int f##n(int A,int B){			\
       7      VOL int C = A & ~B;			\
       8      VOL int D = A ^ B;			\
       9      return C | D;			\
      10  }					\
      11  __attribute__((noinline,noclone))	\
      12  int g##n(int A,int B){			\
      13      VOL int C = A & ~B;			\
      14      return C ^ ~A;			\
      15  }					\
      16  __attribute__((noinline,noclone))	\
      17  int h##n(int A,int B){			\
      18      VOL int C = A | B;			\
      19      VOL int D = A ^ B;			\
      20      return C & ~D;			\
      21  }					\
      22  __attribute__((noinline,noclone))	\
      23  int i##n(int A,int B){			\
      24      VOL int C = A ^ B;			\
      25      return A | ~C;			\
      26  }					\
      27  __attribute__((noinline,noclone))	\
      28  int J##n(int A,int B){			\
      29      VOL int C = A | B;			\
      30      VOL int D = A & B;			\
      31      return C | D;			\
      32  }					\
      33  __attribute__((noinline,noclone))	\
      34  int k##n(int A,int B){			\
      35      VOL int C = A & B;			\
      36      VOL int D = A ^ B;			\
      37      return C | ~D;			\
      38  }					\
      39  __attribute__((noinline,noclone))	\
      40  int l##n(int A,int B){			\
      41      VOL int C = A & ~B;			\
      42      return ~C;				\
      43  }					\
      44  __attribute__((noinline,noclone))	\
      45  int m##n(int A,int B){			\
      46      VOL int C = A & B;			\
      47      VOL int D = A ^ B;			\
      48      return C ^ D;			\
      49  }
      50  
      51  DECLS(0,)
      52  DECLS(1,volatile)
      53  
      54  int main(){
      55      for(int A = 0; A <= 1; ++A)
      56        for(int B = 0; B <= 1; ++B)
      57  	{
      58  	  if (f0 (A, B) != f1 (A, B)) __builtin_abort();
      59  	  if (g0 (A, B) != g1 (A, B)) __builtin_abort();
      60  	  if (h0 (A, B) != h1 (A, B)) __builtin_abort();
      61  	  if (i0 (A, B) != i1 (A, B)) __builtin_abort();
      62  	  if (J0 (A, B) != J1 (A, B)) __builtin_abort();
      63  	  if (k0 (A, B) != k1 (A, B)) __builtin_abort();
      64  	  if (l0 (A, B) != l1 (A, B)) __builtin_abort();
      65  	  if (m0 (A, B) != m1 (A, B)) __builtin_abort();
      66  	}
      67  }
      68  
      69  /* { dg-final { scan-tree-dump-times "bit_not_expr" 12 "optimized"} } */
      70  /* { dg-final { scan-tree-dump-times "bit_and_expr"  9 "optimized"} } */
      71  /* { dg-final { scan-tree-dump-times "bit_ior_expr" 10 "optimized"} } */
      72  /* { dg-final { scan-tree-dump-times "bit_xor_expr"  9 "optimized"} } */