/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-optimized-raw" } */ int g(int x, int y) { int xp = ~x; return (x | y) & (xp ^ y); // x & y } int g0(int x, int y) { int xp = ~x; return (xp | y) & (x ^ y); // ~x & y } _Bool gb(_Bool x, _Bool y) { _Bool xp = !x; return (x | y) & (xp ^ y); // x & y } _Bool gb0(_Bool x, _Bool y) { _Bool xp = !x; return (xp | y) & (x ^ y); // !x & y } _Bool gbi(int a, int b) { _Bool x = a < 2; _Bool y = b < 3; _Bool xp = !x; return (x | y) & (xp ^ y); // x & y } _Bool gbi0(int a, int b) { _Bool x = a < 2; _Bool y = b < 3; _Bool xp = !x; return (xp | y) & (x ^ y); // !x & y } /* All of these should be optimized to `x & y` or `~x & y` */ /* { dg-final { scan-tree-dump-times "le_expr, " 3 "optimized" } } */ /* { dg-final { scan-tree-dump-times "gt_expr, " 1 "optimized" } } */ /* { dg-final { scan-tree-dump-not "bit_xor_expr, " "optimized" } } */ /* { dg-final { scan-tree-dump-times "bit_and_expr, " 6 "optimized" } } */ /* { dg-final { scan-tree-dump-times "bit_not_expr, " 2 "optimized" } } */