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 
main()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"} } */
73