@@ -18,6 +18,11 @@ llvm.func @target_map_single_private() attributes {fir.internal_name = "_QPtarge
1818 }
1919 llvm.return
2020}
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
2126
2227omp.private {type = private } @n.privatizer : f32
2328
@@ -45,6 +50,16 @@ llvm.func @target_map_2_privates() attributes {fir.internal_name = "_QPtarget_ma
4550}
4651
4752
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+
4863// An entirely artifical privatizer that is meant to check multi-block
4964// privatizers. The idea here is to prove that we set the correct
5065// 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) {
6479 }
6580 llvm.return
6681}
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
6786
6887// Descriptors are needed for CHARACTER arrays and their type is
6988// !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
146165
147166
148167
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:.*]]) {
218169// CHECK: %[[BOXCHAR:.*]] = load { ptr, i64 }, ptr %[[MAPPED_ARG]]
219170// CHECK: %[[BOXCHAR_PTR:.*]] = extractvalue { ptr, i64 } %[[BOXCHAR]], 0
220171// CHECK: %[[BOXCHAR_i64:.*]] = extractvalue { ptr, i64 } %[[BOXCHAR]], 1
221172// CHECK: %[[MEM_ALLOC:.*]] = alloca i8, i64 %[[BOXCHAR_i64]]
222173// CHECK: %[[PRIV_BOXCHAR0:.*]] = insertvalue { ptr, i64 } undef, ptr %[[MEM_ALLOC]], 0
223174// 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