2
2
// RUN: FileCheck --input-file=%t.cir --check-prefixes=C,CHECK %s
3
3
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -x c++ -fclangir -emit-cir -o %t.cir %s
4
4
// RUN: FileCheck --input-file=%t.cir --check-prefixes=CPP,CHECK %s
5
+ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -o %t.ll %s
6
+ // RUN: FileCheck --input-file=%t.ll --check-prefixes=LLVM %s
5
7
6
8
double _Complex c , c2 ;
7
9
int _Complex ci , ci2 ;
@@ -24,6 +26,10 @@ void list_init() {
24
26
// CHECK-NEXT: %{{.+}} = cir.complex.create %[[#REAL]], %[[#IMAG]] : !s32i -> !cir.complex<!s32i>
25
27
// CHECK: }
26
28
29
+ // LLVM: define void @list_init()
30
+ // LLVM: store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %{{.+}}, align 8
31
+ // LLVM: }
32
+
27
33
void list_init_2 (double r , double i ) {
28
34
double _Complex c1 = {r , i };
29
35
}
@@ -36,6 +42,12 @@ void list_init_2(double r, double i) {
36
42
// CHECK-NEXT: cir.store %[[#C]], %{{.+}} : !cir.complex<!cir.double>, !cir.ptr<!cir.complex<!cir.double>>
37
43
// CHECK: }
38
44
45
+ // LLVM: define void @list_init_2(double %{{.+}}, double %{{.+}})
46
+ // LLVM: %[[#A:]] = insertvalue { double, double } undef, double %{{.+}}, 0
47
+ // LLVM-NEXT: %[[#B:]] = insertvalue { double, double } %[[#A]], double %{{.+}}, 1
48
+ // LLVM-NEXT: store { double, double } %[[#B]], ptr %5, align 8
49
+ // LLVM: }
50
+
39
51
void imag_literal () {
40
52
c = 3.0 i ;
41
53
ci = 3 i ;
@@ -51,6 +63,11 @@ void imag_literal() {
51
63
// CHECK-NEXT: %{{.+}} = cir.complex.create %[[#REAL]], %[[#IMAG]] : !s32i -> !cir.complex<!s32i>
52
64
// CHECK: }
53
65
66
+ // LLVM: define void @imag_literal()
67
+ // LLVM: store { double, double } { double 0.000000e+00, double 3.000000e+00 }, ptr @c, align 8
68
+ // LLVM: store { i32, i32 } { i32 0, i32 3 }, ptr @ci, align 4
69
+ // LLVM: }
70
+
54
71
void load_store () {
55
72
c = c2 ;
56
73
ci = ci2 ;
@@ -68,6 +85,13 @@ void load_store() {
68
85
// CHECK-NEXT: cir.store %[[#CI2]], %[[#CI_PTR]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
69
86
// CHECK: }
70
87
88
+ // LLVM: define void @load_store()
89
+ // LLVM: %[[#A:]] = load { double, double }, ptr @c2, align 8
90
+ // LLVM-NEXT: store { double, double } %[[#A]], ptr @c, align 8
91
+ // LLVM-NEXT: %[[#B:]] = load { i32, i32 }, ptr @ci2, align 4
92
+ // LLVM-NEXT: store { i32, i32 } %[[#B]], ptr @ci, align 4
93
+ // LLVM: }
94
+
71
95
void load_store_volatile () {
72
96
vc = vc2 ;
73
97
vci = vci2 ;
@@ -85,6 +109,13 @@ void load_store_volatile() {
85
109
// CHECK-NEXT: cir.store volatile %[[#VCI2]], %[[#VCI_PTR]] : !cir.complex<!s32i>, !cir.ptr<!cir.complex<!s32i>>
86
110
// CHECK: }
87
111
112
+ // LLVM: define void @load_store_volatile()
113
+ // LLVM: %[[#A:]] = load volatile { double, double }, ptr @vc2, align 8
114
+ // LLVM-NEXT: store volatile { double, double } %[[#A]], ptr @vc, align 8
115
+ // LLVM-NEXT: %[[#B:]] = load volatile { i32, i32 }, ptr @vci2, align 4
116
+ // LLVM-NEXT: store volatile { i32, i32 } %[[#B]], ptr @vci, align 4
117
+ // LLVM: }
118
+
88
119
void real_ptr () {
89
120
double * r1 = & __real__ c ;
90
121
int * r2 = & __real__ ci ;
@@ -98,6 +129,11 @@ void real_ptr() {
98
129
// CHECK-NEXT: %{{.+}} = cir.complex.real_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr<!s32i>
99
130
// CHECK: }
100
131
132
+ // LLVM: define void @real_ptr()
133
+ // LLVM: store ptr @c, ptr %{{.+}}, align 8
134
+ // LLVM-NEXT: store ptr @ci, ptr %{{.+}}, align 8
135
+ // LLVM: }
136
+
101
137
void real_ptr_local () {
102
138
double _Complex c1 = {1.0 , 2.0 };
103
139
double * r3 = & __real__ c1 ;
@@ -109,6 +145,11 @@ void real_ptr_local() {
109
145
// CHECK: %{{.+}} = cir.complex.real_ptr %[[#C]] : !cir.ptr<!cir.complex<!cir.double>> -> !cir.ptr<!cir.double>
110
146
// CHECK: }
111
147
148
+ // LLVM: define void @real_ptr_local()
149
+ // LLVM: store { double, double } { double 1.000000e+00, double 2.000000e+00 }, ptr %{{.+}}, align 8
150
+ // LLVM-NEXT: %{{.+}} = getelementptr inbounds { double, double }, ptr %{{.+}}, i32 0, i32 0
151
+ // LLVM: }
152
+
112
153
void extract_real () {
113
154
double r1 = __real__ c ;
114
155
int r2 = __real__ ci ;
@@ -124,6 +165,11 @@ void extract_real() {
124
165
// CHECK-NEXT: %{{.+}} = cir.load %[[#REAL_PTR]] : !cir.ptr<!s32i>, !s32i
125
166
// CHECK: }
126
167
168
+ // LLVM: define void @extract_real()
169
+ // LLVM: %{{.+}} = load double, ptr @c, align 8
170
+ // LLVM: %{{.+}} = load i32, ptr @ci, align 4
171
+ // LLVM: }
172
+
127
173
void imag_ptr () {
128
174
double * i1 = & __imag__ c ;
129
175
int * i2 = & __imag__ ci ;
@@ -137,6 +183,11 @@ void imag_ptr() {
137
183
// CHECK-NEXT: %{{.+}} = cir.complex.imag_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr<!s32i>
138
184
// CHECK: }
139
185
186
+ // LLVM: define void @imag_ptr()
187
+ // LLVM: store ptr getelementptr inbounds ({ double, double }, ptr @c, i32 0, i32 1), ptr %{{.+}}, align 8
188
+ // LLVM: store ptr getelementptr inbounds ({ i32, i32 }, ptr @ci, i32 0, i32 1), ptr %{{.+}}, align 8
189
+ // LLVM: }
190
+
140
191
void extract_imag () {
141
192
double i1 = __imag__ c ;
142
193
int i2 = __imag__ ci ;
@@ -151,3 +202,8 @@ void extract_imag() {
151
202
// CHECK-NEXT: %[[#IMAG_PTR:]] = cir.complex.imag_ptr %[[#CI_PTR]] : !cir.ptr<!cir.complex<!s32i>> -> !cir.ptr<!s32i>
152
203
// CHECK-NEXT: %{{.+}} = cir.load %[[#IMAG_PTR]] : !cir.ptr<!s32i>, !s32i
153
204
// CHECK: }
205
+
206
+ // LLVM: define void @extract_imag()
207
+ // LLVM: %{{.+}} = load double, ptr getelementptr inbounds ({ double, double }, ptr @c, i32 0, i32 1), align 8
208
+ // LLVM: %{{.+}} = load i32, ptr getelementptr inbounds ({ i32, i32 }, ptr @ci, i32 0, i32 1), align 4
209
+ // LLVM: }
0 commit comments