2018-05-17 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / gcc.dg / pr23623.c
bloba0a92e0618dcb4107739a86a11c4e2fa3d1b4a96
1 /* { dg-do compile } */
2 /* { dg-require-effective-target size32plus } */
3 /* { dg-options "-fstrict-volatile-bitfields -fdump-rtl-final" } */
5 /* With -fstrict-volatile-bitfields, the volatile accesses to bf2.b
6 and bf3.b must do unsigned int reads/writes. The non-volatile
7 accesses to bf1.b are not so constrained. */
9 extern struct
11 unsigned int b : 1;
12 unsigned int : 31;
13 } __attribute__((aligned(4))) bf1;
15 extern volatile struct
17 unsigned int b : 1;
18 unsigned int : 31;
19 } __attribute__((aligned(4))) bf2;
21 extern struct
23 volatile unsigned int b : 1;
24 volatile unsigned int : 31;
25 } __attribute__((aligned(4))) bf3;
27 void writeb(void)
29 bf1.b = 1;
30 bf2.b = 1; /* volatile read + volatile write */
31 bf3.b = 1; /* volatile read + volatile write */
34 extern unsigned int x1, x2, x3;
36 void readb(void)
38 x1 = bf1.b;
39 x2 = bf2.b; /* volatile write */
40 x3 = bf3.b; /* volatile write */
43 /* There should be 6 volatile MEMs total, but scan-rtl-dump-times counts
44 the number of match variables and not the number of matches. Since
45 the parenthesized subexpression in the regexp introduces an extra match
46 variable, we need to give a count of 12 instead of 6 here. */
47 /* { dg-final { scan-rtl-dump-times "mem/v(/.)*:SI" 12 "final" } } */