volatile.c revision b9a751e1e9cca15b12dcc6d6005d7465ff799b5e
1// RUN: %clang_cc1 -emit-llvm < %s -o %t
2// RUN: grep volatile %t | count 28
3// RUN: grep memcpy %t | count 7
4// RUN: %clang_cc1 %s -Wall -verify -emit-llvm -o - | FileCheck %s
5
6// The number 28 comes from the current codegen for volatile loads;
7// if this number changes, it's not necessarily something wrong, but
8// something has changed to affect volatile load/store codegen
9
10int S;
11volatile int vS;
12
13int* pS;
14volatile int* pvS;
15
16int A[10];
17volatile int vA[10];
18
19struct { int x; } F;
20struct { volatile int x; } vF;
21
22struct { int x; } F2;
23volatile struct { int x; } vF2;
24volatile struct { int x; } *vpF2;
25
26struct { struct { int y; } x; } F3;
27volatile struct { struct { int y; } x; } vF3;
28
29struct { int x:3; } BF;
30struct { volatile int x:3; } vBF;
31
32typedef int v4si __attribute__ ((vector_size (16)));
33v4si V;
34volatile v4si vV;
35
36typedef __attribute__(( ext_vector_type(4) )) int extv4;
37extv4 VE;
38volatile extv4 vVE;
39
40volatile struct {int x;} aggFct(void);
41
42typedef volatile int volatile_int;
43volatile_int vtS;
44
45int main() {
46  int i;
47
48  // load
49  i=S;
50  i=vS;
51  i=*pS;
52  i=*pvS;
53  i=A[2];
54  i=vA[2];
55  i=F.x;
56  i=vF.x;
57  i=F2.x;
58  i=vF2.x;
59  i=vpF2->x;
60  i=F3.x.y;
61  i=vF3.x.y;
62  i=BF.x;
63  i=vBF.x;
64  i=V[3];
65  i=vV[3];
66  i=VE.yx[1];
67  i=vVE.zy[1];
68  i = aggFct().x; // Note: not volatile
69  i=vtS;
70
71
72  // store
73  S=i;
74  vS=i;
75  *pS=i;
76  *pvS=i;
77  A[2]=i;
78  vA[2]=i;
79  F.x=i;
80  vF.x=i;
81  F2.x=i;
82  vF2.x=i;
83  vpF2->x=i;
84  vF3.x.y=i;
85  BF.x=i;
86  vBF.x=i;
87  V[3]=i;
88  vV[3]=i;
89  vtS=i;
90
91  // other ops:
92  ++S;
93  ++vS;
94  i+=S;
95  i+=vS;
96  ++vtS;
97  (void)vF2;
98  vF2 = vF2;
99  vF2 = vF2 = vF2;
100  vF2 = (vF2, vF2); // expected-warning {{expression result unused}}
101}
102
103// Make sure this is emitted. rdar://8315219
104// CHECK: @gvx
105static volatile int gvx = 0;
106