blob: a42986c85fef256caf9a89c1437f95c327e8d971 [file] [log] [blame]
Eli Friedmanf798f652012-05-24 22:04:19 +00001// RUN: %clang_cc1 -emit-llvm -triple x86_64-pc-linux-gnu %s -o - -std=c++11 | FileCheck %s
2
3volatile int g1;
4struct S {
5 volatile int a;
6} g2;
7
8volatile int& refcall();
9
10// CHECK: define void @_Z2f1PViPV1S
11void f1(volatile int *x, volatile S* s) {
12 // We should perform the load in these cases.
David Blaikiea953f282015-02-27 21:19:58 +000013 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000014 (*x);
David Blaikiea953f282015-02-27 21:19:58 +000015 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000016 __extension__ g1;
David Blaikiea953f282015-02-27 21:19:58 +000017 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000018 s->a;
David Blaikiea953f282015-02-27 21:19:58 +000019 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000020 g2.a;
David Blaikiea953f282015-02-27 21:19:58 +000021 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000022 s->*(&S::a);
David Blaikiea953f282015-02-27 21:19:58 +000023 // CHECK: load volatile i32, i32*
24 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000025 x[0], 1 ? x[0] : *x;
26
David Blaikiea953f282015-02-27 21:19:58 +000027 // CHECK: load volatile i32, i32*
28 // CHECK: load volatile i32, i32*
29 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000030 *x ?: *x;
31
David Blaikiea953f282015-02-27 21:19:58 +000032 // CHECK: load volatile i32, i32*
Eli Friedmanf798f652012-05-24 22:04:19 +000033 ({ *x; });
34
35 // CHECK-NOT: load volatile
36 // CHECK: ret
37}
38
39// CHECK: define void @_Z2f2PVi
40// CHECK-NOT: load volatile
41// CHECK: ret
42void f2(volatile int *x) {
43 // We shouldn't perform the load in these cases.
44 refcall();
45 1 ? refcall() : *x;
46}