blob: b02863534473af6c040c35b17be99ba787de4737 [file] [log] [blame]
Tim Northover51dbecf2013-02-07 15:39:16 +00001// RUN: %clang_cc1 -emit-llvm < %s | FileCheck %s
Eli Friedman1e692ac2008-06-13 23:01:12 +00002
Douglas Gregor5291c3c2010-07-13 08:18:22 +00003// The number 28 comes from the current codegen for volatile loads;
Eli Friedman1e692ac2008-06-13 23:01:12 +00004// if this number changes, it's not necessarily something wrong, but
5// something has changed to affect volatile load/store codegen
6
7int S;
8volatile int vS;
9
10int* pS;
11volatile int* pvS;
12
13int A[10];
14volatile int vA[10];
15
16struct { int x; } F;
17struct { volatile int x; } vF;
18
19struct { int x; } F2;
20volatile struct { int x; } vF2;
21volatile struct { int x; } *vpF2;
22
23struct { struct { int y; } x; } F3;
24volatile struct { struct { int y; } x; } vF3;
25
26struct { int x:3; } BF;
27struct { volatile int x:3; } vBF;
28
29typedef int v4si __attribute__ ((vector_size (16)));
30v4si V;
31volatile v4si vV;
32
33typedef __attribute__(( ext_vector_type(4) )) int extv4;
34extv4 VE;
35volatile extv4 vVE;
36
37volatile struct {int x;} aggFct(void);
38
Mike Stumpcb9b0102009-11-03 23:32:42 +000039typedef volatile int volatile_int;
40volatile_int vtS;
41
John McCall13591ed2009-07-25 04:36:53 +000042int main() {
Eli Friedman1e692ac2008-06-13 23:01:12 +000043 int i;
44
45 // load
46 i=S;
47 i=vS;
Tim Northover51dbecf2013-02-07 15:39:16 +000048// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000049 i=*pS;
50 i=*pvS;
Tim Northover51dbecf2013-02-07 15:39:16 +000051// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000052 i=A[2];
53 i=vA[2];
Tim Northover51dbecf2013-02-07 15:39:16 +000054// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000055 i=F.x;
56 i=vF.x;
Tim Northover51dbecf2013-02-07 15:39:16 +000057// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000058 i=F2.x;
59 i=vF2.x;
Tim Northover51dbecf2013-02-07 15:39:16 +000060// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000061 i=vpF2->x;
Tim Northover51dbecf2013-02-07 15:39:16 +000062// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000063 i=F3.x.y;
64 i=vF3.x.y;
Tim Northover51dbecf2013-02-07 15:39:16 +000065// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000066 i=BF.x;
67 i=vBF.x;
Tim Northover51dbecf2013-02-07 15:39:16 +000068// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000069 i=V[3];
70 i=vV[3];
Tim Northover51dbecf2013-02-07 15:39:16 +000071// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000072 i=VE.yx[1];
73 i=vVE.zy[1];
Tim Northover51dbecf2013-02-07 15:39:16 +000074// CHECK: load volatile
Douglas Gregor5291c3c2010-07-13 08:18:22 +000075 i = aggFct().x; // Note: not volatile
Mike Stumpcb9b0102009-11-03 23:32:42 +000076 i=vtS;
Tim Northover51dbecf2013-02-07 15:39:16 +000077// CHECK: load volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000078
79
80 // store
81 S=i;
82 vS=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000083// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000084 *pS=i;
85 *pvS=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000086// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000087 A[2]=i;
88 vA[2]=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000089// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000090 F.x=i;
91 vF.x=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000092// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000093 F2.x=i;
94 vF2.x=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000095// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000096 vpF2->x=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000097// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +000098 vF3.x.y=i;
Tim Northover51dbecf2013-02-07 15:39:16 +000099// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +0000100 BF.x=i;
Daniel Dunbared3849b2008-11-19 09:36:46 +0000101 vBF.x=i;
Tim Northover51dbecf2013-02-07 15:39:16 +0000102// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +0000103 V[3]=i;
104 vV[3]=i;
Tim Northover51dbecf2013-02-07 15:39:16 +0000105// CHECK: store volatile
Mike Stumpcb9b0102009-11-03 23:32:42 +0000106 vtS=i;
Tim Northover51dbecf2013-02-07 15:39:16 +0000107// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +0000108
109 // other ops:
110 ++S;
111 ++vS;
Tim Northover51dbecf2013-02-07 15:39:16 +0000112// CHECK: load volatile
113// CHECK: store volatile
Eli Friedman1e692ac2008-06-13 23:01:12 +0000114 i+=S;
115 i+=vS;
Tim Northover51dbecf2013-02-07 15:39:16 +0000116// CHECK: load volatile
Mike Stumpcb9b0102009-11-03 23:32:42 +0000117 ++vtS;
Tim Northover51dbecf2013-02-07 15:39:16 +0000118// CHECK: load volatile
119// CHECK: store volatile
Mike Stump49d1cd52009-05-26 22:03:21 +0000120 (void)vF2;
Tim Northover51dbecf2013-02-07 15:39:16 +0000121 // From vF2 to a temporary
122// CHECK: call void @llvm.memcpy{{.*}} i1 true
Mike Stump49d1cd52009-05-26 22:03:21 +0000123 vF2 = vF2;
Tim Northover51dbecf2013-02-07 15:39:16 +0000124 // vF2 to itself
125// CHECK: call void @llvm.memcpy{{.*}} i1 true
Mike Stump49d1cd52009-05-26 22:03:21 +0000126 vF2 = vF2 = vF2;
Tim Northover51dbecf2013-02-07 15:39:16 +0000127 // vF2 to itself twice
128// CHECK: call void @llvm.memcpy{{.*}} i1 true
129// CHECK: call void @llvm.memcpy{{.*}} i1 true
Argyrios Kyrtzidis8028bfa2010-08-25 23:42:51 +0000130 vF2 = (vF2, vF2);
Tim Northover51dbecf2013-02-07 15:39:16 +0000131 // vF2 to a temporary, then vF2 to itself
132// CHECK: call void @llvm.memcpy{{.*}} i1 true
133// CHECK: call void @llvm.memcpy{{.*}} i1 true
Eli Friedman1e692ac2008-06-13 23:01:12 +0000134}