Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / CodeGenCXX / lvalue-bitcasts.cpp
blob899c35781d92aa06808c922907f502c44eae82ce
1 // RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s | FileCheck %s
3 struct X { int i; float f; };
4 struct Y { X x; };
6 // CHECK-LABEL: define{{.*}} void @_Z21reinterpret_cast_testRiRfR1X
7 void reinterpret_cast_test(int &ir, float &fr, X &xr) {
8 // CHECK: load ptr, ptr
9 // CHECK: load i32, ptr
10 ir = reinterpret_cast<int&>(fr);
11 // CHECK: load
12 // CHECK: load i32, ptr
13 ir = reinterpret_cast<int&>(xr);
14 // CHECK: load ptr
15 // CHECK: load float, ptr
16 fr = reinterpret_cast<float&>(ir);
17 // CHECK: load
18 // CHECK: load float, ptr
19 fr = reinterpret_cast<float&>(xr);
20 // CHECK: load ptr, ptr
21 // CHECK: call void @llvm.memcpy.p0.p0.i64
22 xr = reinterpret_cast<X&>(ir);
23 // CHECK: load ptr, ptr
24 // CHECK: call void @llvm.memcpy.p0.p0.i64
25 xr = reinterpret_cast<X&>(fr);
26 _Complex float cf;
27 _Complex float &cfr = cf;
28 // CHECK: load ptr, ptr
29 // CHECK: load float, ptr
30 // CHECK: load float, ptr
31 cfr = reinterpret_cast<_Complex float&>(ir);
32 // CHECK: load ptr, ptr
33 // CHECK: load float, ptr
34 // CHECK: load float, ptr
35 cfr = reinterpret_cast<_Complex float&>(fr);
36 // CHECK: load float, ptr
37 // CHECK: load float, ptr
38 cfr = reinterpret_cast<_Complex float&>(xr);
39 // CHECK: ret void
42 // CHECK-LABEL: define{{.*}} void @_Z6c_castRiRfR1X
43 void c_cast(int &ir, float &fr, X &xr) {
44 // CHECK: load ptr, ptr
45 // CHECK: load i32, ptr
46 ir = (int&)fr;
47 // CHECK: load
48 // CHECK: load i32, ptr
49 ir = (int&)xr;
50 // CHECK: load ptr
51 // CHECK: load float, ptr
52 fr = (float&)ir;
53 // CHECK: load
54 // CHECK: load float, ptr
55 fr = (float&)xr;
56 // CHECK: load ptr, ptr
57 // CHECK: call void @llvm.memcpy.p0.p0.i64
58 xr = (X&)ir;
59 // CHECK: load ptr, ptr
60 // CHECK: call void @llvm.memcpy.p0.p0.i64
61 xr = (X&)fr;
62 _Complex float cf;
63 _Complex float &cfr = cf;
64 // CHECK: load ptr, ptr
65 // CHECK: load float, ptr
66 // CHECK: load float, ptr
67 cfr = (_Complex float&)ir;
68 // CHECK: load ptr, ptr
69 // CHECK: load float, ptr
70 // CHECK: load float, ptr
71 cfr = (_Complex float&)fr;
72 // CHECK: load float, ptr
73 // CHECK: load float, ptr
74 cfr = (_Complex float&)xr;
75 // CHECK: ret void
78 // CHECK-LABEL: define{{.*}} void @_Z15functional_castRiRfR1X
79 void functional_cast(int &ir, float &fr, X &xr) {
80 typedef int &intref;
81 typedef float &floatref;
82 typedef X &Xref;
83 // CHECK: load ptr, ptr
84 // CHECK: load i32, ptr
85 ir = intref(fr);
86 // CHECK: load
87 // CHECK: load i32, ptr
88 ir = intref(xr);
89 // CHECK: load ptr
90 // CHECK: load float, ptr
91 fr = floatref(ir);
92 // CHECK: load
93 // CHECK: load float, ptr
94 fr = floatref(xr);
95 // CHECK: load ptr, ptr
96 // CHECK: call void @llvm.memcpy.p0.p0.i64
97 xr = Xref(ir);
98 // CHECK: load ptr, ptr
99 // CHECK: call void @llvm.memcpy.p0.p0.i64
100 xr = Xref(fr);
101 typedef _Complex float &complex_float_ref;
102 _Complex float cf;
103 _Complex float &cfr = cf;
104 // CHECK: load ptr, ptr
105 // CHECK: load float, ptr
106 // CHECK: load float, ptr
107 cfr = complex_float_ref(ir);
108 // CHECK: load ptr, ptr
109 // CHECK: load float, ptr
110 // CHECK: load float, ptr
111 cfr = complex_float_ref(fr);
112 // CHECK: load float, ptr
113 // CHECK: load float, ptr
114 cfr = complex_float_ref(xr);
115 // CHECK: ret void
118 namespace PR6437 {
119 struct in_addr {};
120 void copy( const struct in_addr &new_addr ) {
121 int addr = (int&)new_addr;
125 namespace PR7593 {
126 void foo(double &X, char *A) {
127 X = reinterpret_cast<double&>(A[4]);
131 namespace PR7344 {
132 void serialize_annotatable_id( void*& id )
134 unsigned long l_id = (unsigned long&)id;