2012-05-25 06:04:19 +08:00
|
|
|
// RUN: %clang_cc1 -emit-llvm -triple x86_64-pc-linux-gnu %s -o - -std=c++11 | FileCheck %s
|
|
|
|
|
|
|
|
volatile int g1;
|
|
|
|
struct S {
|
|
|
|
volatile int a;
|
|
|
|
} g2;
|
|
|
|
|
|
|
|
volatile int& refcall();
|
|
|
|
|
|
|
|
// CHECK: define void @_Z2f1PViPV1S
|
|
|
|
void f1(volatile int *x, volatile S* s) {
|
|
|
|
// We should perform the load in these cases.
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
(*x);
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
__extension__ g1;
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
s->a;
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
g2.a;
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
s->*(&S::a);
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
x[0], 1 ? x[0] : *x;
|
|
|
|
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
|
|
|
// CHECK: load volatile i32, i32*
|
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
*x ?: *x;
|
|
|
|
|
2015-02-28 05:19:58 +08:00
|
|
|
// CHECK: load volatile i32, i32*
|
2012-05-25 06:04:19 +08:00
|
|
|
({ *x; });
|
|
|
|
|
|
|
|
// CHECK-NOT: load volatile
|
|
|
|
// CHECK: ret
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: define void @_Z2f2PVi
|
|
|
|
// CHECK-NOT: load volatile
|
|
|
|
// CHECK: ret
|
|
|
|
void f2(volatile int *x) {
|
|
|
|
// We shouldn't perform the load in these cases.
|
|
|
|
refcall();
|
|
|
|
1 ? refcall() : *x;
|
|
|
|
}
|