2
2
3
3
// This test checks the offload sizes, map types and base pointers and pointers
4
4
// provided to the OpenMP kernel argument structure are correct when lowering
5
- // to LLVM-IR from MLIR when the fortran allocatables flag is switched on and
6
- // a fortran allocatable descriptor type is provided alongside the omp.map_info,
7
- // the test utilises mapping of array sections, full arrays and individual
8
- // allocated scalars.
5
+ // to LLVM-IR from MLIR when a fortran allocatable descriptor type is provided
6
+ // alongside the omp.map_info, the test utilises mapping of array sections,
7
+ // full arrays and individual allocated scalars.
9
8
10
9
module attributes {omp.is_target_device = false } {
11
10
llvm.func @_QQmain () {
@@ -26,8 +25,8 @@ module attributes {omp.is_target_device = false} {
26
25
%14 = llvm.sub %11 , %2 : i64
27
26
%15 = omp.bounds lower_bound (%7 : i64 ) upper_bound (%14 : i64 ) extent (%11 : i64 ) stride (%13 : i64 ) start_idx (%9 : i64 ) {stride_in_bytes = true }
28
27
%16 = llvm.getelementptr %3 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
29
- %17 = omp.map_info var_ptr (%16 : !llvm.ptr , f32 ) map_clauses (tofrom ) capture (ByRef ) bounds (%15 ) -> !llvm.ptr {name = " full_arr" }
30
- %18 = omp.map_info var_ptr (%3 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>) map_clauses (tofrom ) capture (ByRef ) members (%17 : !llvm.ptr ) -> !llvm.ptr {name = " full_arr" }
28
+ %17 = omp.map_info var_ptr (%16 : !llvm.ptr , f32 ) map_clauses (ptr_and_obj , tofrom ) capture (ByRef ) bounds (%15 ) -> !llvm.ptr {name = " full_arr" }
29
+ %18 = omp.map_info var_ptr (%3 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>) map_clauses (tofrom ) capture (ByRef ) members (%17 : !llvm.ptr : [ 0 ] ) -> !llvm.ptr {name = " full_arr" }
31
30
%19 = llvm.getelementptr %6 [0 , 7 , %7 , 0 ] : (!llvm.ptr , i64 ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
32
31
%20 = llvm.load %19 : !llvm.ptr -> i64
33
32
%21 = llvm.getelementptr %6 [0 , 7 , %7 , 1 ] : (!llvm.ptr , i64 ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
@@ -38,11 +37,11 @@ module attributes {omp.is_target_device = false} {
38
37
%26 = llvm.sub %0 , %20 : i64
39
38
%27 = omp.bounds lower_bound (%25 : i64 ) upper_bound (%26 : i64 ) extent (%22 : i64 ) stride (%24 : i64 ) start_idx (%20 : i64 ) {stride_in_bytes = true }
40
39
%28 = llvm.getelementptr %6 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>
41
- %29 = omp.map_info var_ptr (%6 : !llvm.ptr , i32 ) var_ptr_ptr (%28 : !llvm.ptr ) map_clauses (tofrom ) capture (ByRef ) bounds (%27 ) -> !llvm.ptr {name = " sect_arr(2:5)" }
42
- %30 = omp.map_info var_ptr (%6 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>) map_clauses (tofrom ) capture (ByRef ) members (%29 : !llvm.ptr ) -> !llvm.ptr {name = " sect_arr(2:5)" }
40
+ %29 = omp.map_info var_ptr (%6 : !llvm.ptr , i32 ) var_ptr_ptr (%28 : !llvm.ptr ) map_clauses (ptr_and_obj , tofrom ) capture (ByRef ) bounds (%27 ) -> !llvm.ptr {name = " sect_arr(2:5)" }
41
+ %30 = omp.map_info var_ptr (%6 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 , array <1 x array <3 x i64 >>)>) map_clauses (tofrom ) capture (ByRef ) members (%29 : !llvm.ptr : [ 0 ] ) -> !llvm.ptr {name = " sect_arr(2:5)" }
43
42
%31 = llvm.getelementptr %5 [0 , 0 ] : (!llvm.ptr ) -> !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 )>
44
- %32 = omp.map_info var_ptr (%5 : !llvm.ptr , f32 ) var_ptr_ptr (%31 : !llvm.ptr ) map_clauses (tofrom ) capture (ByRef ) -> !llvm.ptr {name = " scalar" }
45
- %33 = omp.map_info var_ptr (%5 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 )>) map_clauses (tofrom ) capture (ByRef ) members (%32 : !llvm.ptr ) -> !llvm.ptr {name = " scalar" }
43
+ %32 = omp.map_info var_ptr (%5 : !llvm.ptr , f32 ) var_ptr_ptr (%31 : !llvm.ptr ) map_clauses (ptr_and_obj , tofrom ) capture (ByRef ) -> !llvm.ptr {name = " scalar" }
44
+ %33 = omp.map_info var_ptr (%5 : !llvm.ptr , !llvm.struct <(ptr , i64 , i32 , i8 , i8 , i8 , i8 )>) map_clauses (tofrom ) capture (ByRef ) members (%32 : !llvm.ptr : [ 0 ] ) -> !llvm.ptr {name = " scalar" }
46
45
omp.target map_entries (%17 -> %arg0 , %18 -> %arg1 , %29 -> %arg2 , %30 -> %arg3 , %32 -> %arg4 , %33 -> %arg5 : !llvm.ptr , !llvm.ptr , !llvm.ptr , !llvm.ptr , !llvm.ptr , !llvm.ptr ) {
47
46
^bb0 (%arg0: !llvm.ptr , %arg1: !llvm.ptr , %arg2: !llvm.ptr , %arg3: !llvm.ptr , %arg4: !llvm.ptr , %arg5: !llvm.ptr ):
48
47
omp.terminator
@@ -81,20 +80,19 @@ module attributes {omp.is_target_device = false} {
81
80
// CHECK: %[[ARR_SECT_SIZE2:.*]] = add i64 %[[ARR_SECT_SIZE3]], 1
82
81
// CHECK: %[[ARR_SECT_SIZE1:.*]] = mul i64 1, %[[ARR_SECT_SIZE2]]
83
82
// CHECK: %[[ARR_SECT_SIZE:.*]] = mul i64 %[[ARR_SECT_SIZE1]], 4
84
- // CHECK: %[[FULL_ARR_DESC_SIZE:.*]] = sdiv exact i64 sub (i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEfull_arr, i32 1) to i64), i64 ptrtoint (ptr @_QFEfull_arr to i64)), ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
85
83
// CHECK: %[[LFULL_ARR:.*]] = load ptr, ptr @_QFEfull_arr, align 8
86
84
// CHECK: %[[FULL_ARR_PTR:.*]] = getelementptr inbounds float, ptr %[[LFULL_ARR]], i64 0
87
- // CHECK: %[[ARR_SECT_DESC_SIZE:.*]] = sdiv exact i64 sub (i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEsect_arr, i32 1) to i64), i64 ptrtoint (ptr @_QFEsect_arr to i64)), ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
88
85
// CHECK: %[[ARR_SECT_OFFSET1:.*]] = mul i64 %[[ARR_SECT_OFFSET2]], 1
89
86
// CHECK: %[[LARR_SECT:.*]] = load ptr, ptr @_QFEsect_arr, align 8
90
87
// CHECK: %[[ARR_SECT_PTR:.*]] = getelementptr inbounds i32, ptr %[[LARR_SECT]], i64 %[[ARR_SECT_OFFSET1]]
88
+ // CHECK: %[[SCALAR_PTR_LOAD:.*]] = load ptr, ptr %[[SCALAR_BASE]], align 8
89
+ // CHECK: %[[FULL_ARR_DESC_SIZE:.*]] = sdiv exact i64 sub (i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEfull_arr, i32 1) to i64), i64 ptrtoint (ptr @_QFEfull_arr to i64)), ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
90
+ // CHECK: %[[ARR_SECT_DESC_SIZE:.*]] = sdiv exact i64 sub (i64 ptrtoint (ptr getelementptr inbounds ({ ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] }, ptr @_QFEsect_arr, i32 1) to i64), i64 ptrtoint (ptr @_QFEsect_arr to i64)), ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
91
91
// CHECK: %[[SCALAR_DESC_SZ4:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8 }, ptr %[[SCALAR_ALLOCA]], i32 1
92
92
// CHECK: %[[SCALAR_DESC_SZ3:.*]] = ptrtoint ptr %[[SCALAR_DESC_SZ4]] to i64
93
93
// CHECK: %[[SCALAR_DESC_SZ2:.*]] = ptrtoint ptr %[[SCALAR_ALLOCA]] to i64
94
94
// CHECK: %[[SCALAR_DESC_SZ1:.*]] = sub i64 %[[SCALAR_DESC_SZ3]], %[[SCALAR_DESC_SZ2]]
95
95
// CHECK: %[[SCALAR_DESC_SZ:.*]] = sdiv exact i64 %[[SCALAR_DESC_SZ1]], ptrtoint (ptr getelementptr (i8, ptr null, i32 1) to i64)
96
- // CHECK: %[[SCALAR_PTR_LOAD:.*]] = load ptr, ptr %[[SCALAR_BASE]], align 8
97
- // CHECK: %[[SCALAR_PTR:.*]] = getelementptr inbounds float, ptr %[[SCALAR_PTR_LOAD]], i64 0
98
96
99
97
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 0
100
98
// CHECK: store ptr @_QFEfull_arr, ptr %[[OFFLOADBASEPTRS]], align 8
@@ -143,6 +141,6 @@ module attributes {omp.is_target_device = false} {
143
141
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 7
144
142
// CHECK: store ptr %[[SCALAR_ALLOCA]], ptr %[[OFFLOADPTRS]], align 8
145
143
// CHECK: %[[OFFLOADBASEPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_baseptrs, i32 0, i32 8
146
- // CHECK: store ptr %[[SCALAR_BASE ]], ptr %[[OFFLOADBASEPTRS]], align 8
144
+ // CHECK: store ptr %[[SCALAR_ALLOCA ]], ptr %[[OFFLOADBASEPTRS]], align 8
147
145
// CHECK: %[[OFFLOADPTRS:.*]] = getelementptr inbounds [9 x ptr], ptr %.offload_ptrs, i32 0, i32 8
148
- // CHECK: store ptr %[[SCALAR_PTR ]], ptr %[[OFFLOADPTRS]], align 8
146
+ // CHECK: store ptr %[[SCALAR_PTR_LOAD ]], ptr %[[OFFLOADPTRS]], align 8
0 commit comments