@@ -18,6 +18,11 @@ llvm.func @target_map_single_private() attributes {fir.internal_name = "_QPtarge
18
18
}
19
19
llvm.return
20
20
}
21
+ // CHECK: define internal void @__omp_offloading_
22
+ // CHECK-NOT: define {{.*}}
23
+ // CHECK: %[[PRIV_ALLOC:.*]] = alloca i32, align 4
24
+ // CHECK: %[[ADD:.*]] = add i32 {{.*}}, 10
25
+ // CHECK: store i32 %[[ADD]], ptr %[[PRIV_ALLOC]], align 4
21
26
22
27
omp.private {type = private } @n.privatizer : f32
23
28
@@ -45,6 +50,16 @@ llvm.func @target_map_2_privates() attributes {fir.internal_name = "_QPtarget_ma
45
50
}
46
51
47
52
53
+ // CHECK: define internal void @__omp_offloading_
54
+ // CHECK: %[[PRIV_I32_ALLOC:.*]] = alloca i32, align 4
55
+ // CHECK: %[[PRIV_FLOAT_ALLOC:.*]] = alloca float, align 4
56
+ // CHECK: %[[ADD_I32:.*]] = add i32 {{.*}}, 10
57
+ // CHECK: store i32 %[[ADD_I32]], ptr %[[PRIV_I32_ALLOC]], align 4
58
+ // CHECK: %[[LOAD_I32_AGAIN:.*]] = load i32, ptr %[[PRIV_I32_ALLOC]], align 4
59
+ // CHECK: %[[CAST_TO_FLOAT:.*]] = sitofp i32 %[[LOAD_I32_AGAIN]] to float
60
+ // CHECK: %[[ADD_FLOAT:.*]] = fadd contract float %[[CAST_TO_FLOAT]], 1.100000e+01
61
+ // CHECK: store float %[[ADD_FLOAT]], ptr %[[PRIV_FLOAT_ALLOC]], align 4
62
+
48
63
// An entirely artifical privatizer that is meant to check multi-block
49
64
// privatizers. The idea here is to prove that we set the correct
50
65
// insertion points for the builder when generating, first, LLVM IR for the
@@ -64,6 +79,10 @@ llvm.func @target_op_private_multi_block(%arg0: !llvm.ptr) {
64
79
}
65
80
llvm.return
66
81
}
82
+ // CHECK: define internal void @__omp_offloading_
83
+ // CHECK: %[[PRIV_ALLOC:.*]] = alloca float, align 4
84
+ // CHECK: %[[PHI_ALLOCA:.*]] = phi ptr [ %[[PRIV_ALLOC]], {{.*}} ]
85
+ // CHECK: %[[RESULT:.*]] = load float, ptr %[[PHI_ALLOCA]], align 4
67
86
68
87
// Descriptors are needed for CHARACTER arrays and their type is
69
88
// !fir.boxchar<KIND>. When such arrays are used in the private construct, the
@@ -146,99 +165,10 @@ llvm.func @llvm.memmove.p0.p0.i64(!llvm.ptr, !llvm.ptr, i64, i1) attributes {sym
146
165
147
166
148
167
149
- omp.private {type = firstprivate } @sf.firstprivate : f32 copy {
150
- ^bb0 (%arg0: !llvm.ptr , %arg1: !llvm.ptr ):
151
- %0 = llvm.load %arg0 : !llvm.ptr -> f32
152
- llvm.store %0 , %arg1 : f32 , !llvm.ptr
153
- omp.yield (%arg1 : !llvm.ptr )
154
- }
155
- omp.private {type = firstprivate } @sv.firstprivate : i32 copy {
156
- ^bb0 (%arg0: !llvm.ptr , %arg1: !llvm.ptr ):
157
- %0 = llvm.load %arg0 : !llvm.ptr -> i32
158
- llvm.store %0 , %arg1 : i32 , !llvm.ptr
159
- omp.yield (%arg1 : !llvm.ptr )
160
- }
161
- llvm.func @target_firstprivate_ () attributes {fir.internal_name = " _QPtarget_firstprivate" } {
162
- %0 = llvm.mlir.constant (1 : i64 ) : i64
163
- %sv = llvm.alloca %0 x i32 {bindc_name = " sv" } : (i64 ) -> !llvm.ptr
164
- %sf = llvm.alloca %0 x f32 {bindc_name = " sf" } : (i64 ) -> !llvm.ptr
165
- %6 = omp.map.info var_ptr (%sv : !llvm.ptr , i32 ) map_clauses (to ) capture (ByRef ) -> !llvm.ptr
166
- %7 = omp.map.info var_ptr (%sf : !llvm.ptr , f32 ) map_clauses (to ) capture (ByRef ) -> !llvm.ptr
167
- omp.target map_entries (%6 -> %arg0 , %7 -> %arg1 : !llvm.ptr , !llvm.ptr ) private (@sv.firstprivate %sv -> %arg2 [map_idx =0 ], @sf.firstprivate %sf -> %arg3 [map_idx =1 ] : !llvm.ptr , !llvm.ptr ) {
168
- %8 = llvm.mlir.constant (2.000000e+00 : f64 ) : f64
169
- %9 = llvm.mlir.constant (10 : i32 ) : i32
170
- %10 = llvm.load %arg2 : !llvm.ptr -> i32
171
- %11 = llvm.add %10 , %9 : i32
172
- llvm.store %11 , %arg2 : i32 , !llvm.ptr
173
- %12 = llvm.load %arg3 : !llvm.ptr -> f32
174
- %13 = llvm.fpext %12 : f32 to f64
175
- %14 = llvm.fadd %13 , %8 {fastmathFlags = #llvm.fastmath <contract >} : f64
176
- %15 = llvm.fptrunc %14 : f64 to f32
177
- llvm.store %15 , %arg3 : f32 , !llvm.ptr
178
- omp.terminator
179
- }
180
- llvm.return
181
- }
182
- // CHECK: define void @target_map_single_private() {
183
- // CHECK: call void @__omp_offloading_[[MAP_SINGLE_PRIVATE_OFFLOADED_FUNCTION:.*]](ptr {{.*}})
184
- // CHECK: define void @target_map_2_privates() {
185
- // CHECK: call void @__omp_offloading_[[MAP_2_PRIVATES_OFFLOADED_FUNCTION:.*]](ptr {{.*}})
186
- // CHECK: define void @target_op_private_multi_block
187
- // CHECK: call void @__omp_offloading_[[PRIVATE_MULTI_BLOCK_OFFLOADED_FUNCTION:.*]]()
188
- // CHECK: define void @target_boxchar_
189
- // CHECK: call void @__omp_offloading_[[BOXCHAR_OFFLOADED_FUNCTION:.*]](ptr {{.*}}, ptr {{.*}})
190
- // CHECK: define void @target_firstprivate_()
191
- // CHECK: call void @__omp_offloading_[[SIMPLE_OFFLOADED_FUNCTION:.*]](ptr {{.*}}, ptr {{.*}})
192
-
193
- // CHECK: define internal void @__omp_offloading_[[MAP_SINGLE_PRIVATE_OFFLOADED_FUNCTION]]
194
- // CHECK: %[[PRIV_ALLOC:.*]] = alloca i32, align 4
195
- // CHECK: %[[ADD:.*]] = add i32 {{.*}}, 10
196
- // CHECK: store i32 %[[ADD]], ptr %[[PRIV_ALLOC]], align 4
197
-
198
-
199
-
200
-
201
- // CHECK: define internal void @__omp_offloading_[[MAP_2_PRIVATES_OFFLOADED_FUNCTION]]
202
- // CHECK: %[[PRIV_I32_ALLOC:.*]] = alloca i32, align 4
203
- // CHECK: %[[PRIV_FLOAT_ALLOC:.*]] = alloca float, align 4
204
- // CHECK: %[[ADD_I32:.*]] = add i32 {{.*}}, 10
205
- // CHECK: store i32 %[[ADD_I32]], ptr %[[PRIV_I32_ALLOC]], align 4
206
- // CHECK: %[[LOAD_I32_AGAIN:.*]] = load i32, ptr %[[PRIV_I32_ALLOC]], align 4
207
- // CHECK: %[[CAST_TO_FLOAT:.*]] = sitofp i32 %[[LOAD_I32_AGAIN]] to float
208
- // CHECK: %[[ADD_FLOAT:.*]] = fadd contract float %[[CAST_TO_FLOAT]], 1.100000e+01
209
- // CHECK: store float %[[ADD_FLOAT]], ptr %[[PRIV_FLOAT_ALLOC]], align 4
210
-
211
- // CHECK: define internal void @__omp_offloading_[[PRIVATE_MULTI_BLOCK_OFFLOADED_FUNCTION]]
212
- // CHECK: %[[PRIV_ALLOC:.*]] = alloca float, align 4
213
- // CHECK: %[[PHI_ALLOCA:.*]] = phi ptr [ %[[PRIV_ALLOC]], {{.*}} ]
214
- // CHECK: %[[RESULT:.*]] = load float, ptr %[[PHI_ALLOCA]], align 4
215
-
216
-
217
- // CHECK: define internal void @__omp_offloading_[[BOXCHAR_OFFLOADED_FUNCTION]](ptr %{{[^,]+}}, ptr %[[MAPPED_ARG:.*]]) {
168
+ // CHECK: define internal void @__omp_offloading_{{.*}}(ptr %{{[^,]+}}, ptr %[[MAPPED_ARG:.*]]) {
218
169
// CHECK: %[[BOXCHAR:.*]] = load { ptr, i64 }, ptr %[[MAPPED_ARG]]
219
170
// CHECK: %[[BOXCHAR_PTR:.*]] = extractvalue { ptr, i64 } %[[BOXCHAR]], 0
220
171
// CHECK: %[[BOXCHAR_i64:.*]] = extractvalue { ptr, i64 } %[[BOXCHAR]], 1
221
172
// CHECK: %[[MEM_ALLOC:.*]] = alloca i8, i64 %[[BOXCHAR_i64]]
222
173
// CHECK: %[[PRIV_BOXCHAR0:.*]] = insertvalue { ptr, i64 } undef, ptr %[[MEM_ALLOC]], 0
223
174
// CHECK: %[[PRIV_BOXCHAR1:.*]] = insertvalue { ptr, i64 } %[[PRIV_BOXCHAR0]], i64 %[[BOXCHAR_i64]], 1
224
-
225
-
226
- // CHECK: define internal void @__omp_offloading_[[SIMPLE_OFFLOADED_FUNCTION]](ptr %[[SV:.*]], ptr %[[SF:.*]])
227
- // CHECK: entry:
228
- // CHECK-NEXT: %[[SV_PRIV_ALLOCA:.*]] = alloca i32, align 4
229
- // CHECK-NEXT: %[[SF_PRIV_ALLOCA:.*]] = alloca float, align 4
230
- // CHECK: omp.private.copy:
231
- // CHECK-NEXT: %[[INIT_SV:.*]] = load i32, ptr %[[SV]], align 4
232
- // CHECK-NEXT: store i32 %[[INIT_SV]], ptr %[[SV_PRIV_ALLOCA]], align 4
233
- // CHECK: %[[INIT_SF:.*]] = load float, ptr %[[SF]], align 4
234
- // CHECK-NEXT store float %[[INIT_SF]], ptr %[[SF_PRIV_ALLOCA]], align 4
235
- // CHECK: omp.target
236
- // CHECK: %[[LOAD_SV:.*]] = load i32, ptr %[[SV_PRIV_ALLOCA]], align 4
237
- // CHECK-NEXT: %[[ADD_SV:.*]] = add i32 %[[LOAD_SV]], 10
238
- // CHECK-NEXT: store i32 %[[ADD_SV]], ptr %[[SV_PRIV_ALLOCA]], align 4
239
- // CHECK: %[[LOAD_SF:.*]] = load float, ptr %[[SF_PRIV_ALLOCA]], align 4
240
- // CHECK-NEXT: %[[SF_EXT:.*]] = fpext float %[[LOAD_SF]] to double
241
- // CHECK-NEXT: %[[ADD_SF:.*]] = fadd contract double %[[SF_EXT]], 2.000000e+00
242
- // CHECK-NEXT: %[[TRUNC_SF:.*]] = fptrunc double %[[ADD_SF]] to float
243
- // CHECK-NEXT: store float %[[TRUNC_SF]], ptr %[[SF_PRIV_ALLOCA]], align 4
244
-
0 commit comments