/* { dg-do compile } */ /* { dg-options "-O1 -fdump-tree-optimized-raw" } */ /* PR tree-optimization/115449 */ void setBit_un(unsigned char *a, int b) { unsigned char c = 0x1UL << b; *a &= ~c; *a |= c; } void setBit_sign(signed char *a, int b) { signed char c = 0x1UL << b; *a &= ~c; *a |= c; } void setBit(char *a, int b) { char c = 0x1UL << b; *a &= ~c; *a |= c; } /* All three should produce: _1 = 1 << b_4(D); c_5 = (cast) _1; _2 = *a_7(D); _3 = _2 | c_5; *a_7(D) = _3; Removing the `&~c` as we are matching `(~x & y) | x` -> `x | y` match pattern even with extra casts are being involved. */ /* { dg-final { scan-tree-dump-not "bit_not_expr, " "optimized" } } */ /* { dg-final { scan-tree-dump-not "bit_and_expr, " "optimized" } } */ /* { dg-final { scan-tree-dump-times "bit_ior_expr, " 3 "optimized" } } */