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