1 // RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s
3 llvm.func @_QPopenmp_target_data() {
4 %0 = llvm.mlir.constant(1 : i64) : i64
5 %1 = llvm.alloca %0 x i32 {bindc_name = "i", in_type = i32, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_dataEi"} : (i64) -> !llvm.ptr
6 %2 = omp.map.info var_ptr(%1 : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
7 omp.target_data map_entries(%2 : !llvm.ptr) {
8 %3 = llvm.mlir.constant(99 : i32) : i32
9 llvm.store %3, %1 : i32, !llvm.ptr
15 // CHECK: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 4]
16 // CHECK: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 3]
17 // CHECK-LABEL: define void @_QPopenmp_target_data() {
18 // CHECK: %[[VAL_0:.*]] = alloca [1 x ptr], align 8
19 // CHECK: %[[VAL_1:.*]] = alloca [1 x ptr], align 8
20 // CHECK: %[[VAL_2:.*]] = alloca [1 x ptr], align 8
21 // CHECK: %[[VAL_3:.*]] = alloca i32, i64 1, align 4
22 // CHECK: br label %[[VAL_4:.*]]
23 // CHECK: entry: ; preds = %[[VAL_5:.*]]
24 // CHECK: %[[VAL_6:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
25 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_6]], align 8
26 // CHECK: %[[VAL_7:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
27 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_7]], align 8
28 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_2]], i64 0, i64 0
29 // CHECK: store ptr null, ptr %[[VAL_8]], align 8
30 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
31 // CHECK: %[[VAL_10:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
32 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @2, i64 -1, i32 1, ptr %[[VAL_9]], ptr %[[VAL_10]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
33 // CHECK: store i32 99, ptr %[[VAL_3]], align 4
34 // CHECK: %[[VAL_11:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
35 // CHECK: %[[VAL_12:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
36 // CHECK: call void @__tgt_target_data_end_mapper(ptr @2, i64 -1, i32 1, ptr %[[VAL_11]], ptr %[[VAL_12]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
41 llvm.func @_QPopenmp_target_data_region(%0 : !llvm.ptr) {
42 %1 = llvm.mlir.constant(1023 : index) : i64
43 %2 = llvm.mlir.constant(0 : index) : i64
44 %3 = llvm.mlir.constant(1024 : index) : i64
45 %4 = llvm.mlir.constant(1 : index) : i64
46 %5 = omp.map.bounds lower_bound(%2 : i64) upper_bound(%1 : i64) extent(%3 : i64) stride(%4 : i64) start_idx(%4 : i64)
47 %6 = omp.map.info var_ptr(%0 : !llvm.ptr, !llvm.array<1024 x i32>) map_clauses(from) capture(ByRef) bounds(%5) -> !llvm.ptr {name = ""}
48 omp.target_data map_entries(%6 : !llvm.ptr) {
49 %7 = llvm.mlir.constant(99 : i32) : i32
50 %8 = llvm.mlir.constant(1 : i64) : i64
51 %9 = llvm.mlir.constant(1 : i64) : i64
52 %10 = llvm.mlir.constant(0 : i64) : i64
53 %11 = llvm.getelementptr %0[0, %10] : (!llvm.ptr, i64) -> !llvm.ptr, !llvm.array<1024 x i32>
54 llvm.store %7, %11 : i32, !llvm.ptr
60 // CHECK: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 4096]
61 // CHECK: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 2]
62 // CHECK-LABEL: define void @_QPopenmp_target_data_region
63 // CHECK: (ptr %[[ARG_0:.*]]) {
64 // CHECK: %[[VAL_0:.*]] = alloca [1 x ptr], align 8
65 // CHECK: %[[VAL_1:.*]] = alloca [1 x ptr], align 8
66 // CHECK: %[[VAL_2:.*]] = alloca [1 x ptr], align 8
67 // CHECK: br label %[[VAL_3:.*]]
68 // CHECK: entry: ; preds = %[[VAL_4:.*]]
69 // CHECK: %[[ARR_OFFSET:.*]] = getelementptr inbounds [1024 x i32], ptr %[[ARR_DATA:.*]], i64 0, i64 0
70 // CHECK: %[[VAL_5:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
71 // CHECK: store ptr %[[ARR_DATA]], ptr %[[VAL_5]], align 8
72 // CHECK: %[[VAL_6:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
73 // CHECK: store ptr %[[ARR_OFFSET]], ptr %[[VAL_6]], align 8
74 // CHECK: %[[VAL_7:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_2]], i64 0, i64 0
75 // CHECK: store ptr null, ptr %[[VAL_7]], align 8
76 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
77 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
78 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @2, i64 -1, i32 1, ptr %[[VAL_8]], ptr %[[VAL_9]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
79 // CHECK: %[[VAL_10:.*]] = getelementptr [1024 x i32], ptr %[[ARR_DATA]], i32 0, i64 0
80 // CHECK: store i32 99, ptr %[[VAL_10]], align 4
81 // CHECK: %[[VAL_11:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
82 // CHECK: %[[VAL_12:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
83 // CHECK: call void @__tgt_target_data_end_mapper(ptr @2, i64 -1, i32 1, ptr %[[VAL_11]], ptr %[[VAL_12]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
88 llvm.func @_QPomp_target_enter_exit(%1 : !llvm.ptr, %3 : !llvm.ptr) {
89 %4 = llvm.mlir.constant(1 : i64) : i64
90 %5 = llvm.alloca %4 x i32 {bindc_name = "dvc", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_enter_exitEdvc"} : (i64) -> !llvm.ptr
91 %6 = llvm.mlir.constant(1 : i64) : i64
92 %7 = llvm.alloca %6 x i32 {bindc_name = "i", in_type = i32, operandSegmentSizes = array<i32: 0, 0>, uniq_name = "_QFomp_target_enter_exitEi"} : (i64) -> !llvm.ptr
93 %8 = llvm.mlir.constant(5 : i32) : i32
94 llvm.store %8, %7 : i32, !llvm.ptr
95 %9 = llvm.mlir.constant(2 : i32) : i32
96 llvm.store %9, %5 : i32, !llvm.ptr
97 %10 = llvm.load %7 : !llvm.ptr -> i32
98 %11 = llvm.mlir.constant(10 : i32) : i32
99 %12 = llvm.icmp "slt" %10, %11 : i32
100 %13 = llvm.load %5 : !llvm.ptr -> i32
101 %14 = llvm.mlir.constant(1023 : index) : i64
102 %15 = llvm.mlir.constant(0 : index) : i64
103 %16 = llvm.mlir.constant(1024 : index) : i64
104 %17 = llvm.mlir.constant(1 : index) : i64
105 %18 = omp.map.bounds lower_bound(%15 : i64) upper_bound(%14 : i64) extent(%16 : i64) stride(%17 : i64) start_idx(%17 : i64)
106 %map1 = omp.map.info var_ptr(%1 : !llvm.ptr, !llvm.array<1024 x i32>) map_clauses(to) capture(ByRef) bounds(%18) -> !llvm.ptr {name = ""}
107 %19 = llvm.mlir.constant(511 : index) : i64
108 %20 = llvm.mlir.constant(0 : index) : i64
109 %21 = llvm.mlir.constant(512 : index) : i64
110 %22 = llvm.mlir.constant(1 : index) : i64
111 %23 = omp.map.bounds lower_bound(%20 : i64) upper_bound(%19 : i64) extent(%21 : i64) stride(%22 : i64) start_idx(%22 : i64)
112 %map2 = omp.map.info var_ptr(%3 : !llvm.ptr, !llvm.array<512 x i32>) map_clauses(exit_release_or_enter_alloc) capture(ByRef) bounds(%23) -> !llvm.ptr {name = ""}
113 omp.target_enter_data if(%12) device(%13 : i32) map_entries(%map1, %map2 : !llvm.ptr, !llvm.ptr)
114 %24 = llvm.load %7 : !llvm.ptr -> i32
115 %25 = llvm.mlir.constant(10 : i32) : i32
116 %26 = llvm.icmp "sgt" %24, %25 : i32
117 %27 = llvm.load %5 : !llvm.ptr -> i32
118 %28 = llvm.mlir.constant(1023 : index) : i64
119 %29 = llvm.mlir.constant(0 : index) : i64
120 %30 = llvm.mlir.constant(1024 : index) : i64
121 %31 = llvm.mlir.constant(1 : index) : i64
122 %32 = omp.map.bounds lower_bound(%29 : i64) upper_bound(%28 : i64) extent(%30 : i64) stride(%31 : i64) start_idx(%31 : i64)
123 %map3 = omp.map.info var_ptr(%1 : !llvm.ptr, !llvm.array<1024 x i32>) map_clauses(from) capture(ByRef) bounds(%32) -> !llvm.ptr {name = ""}
124 %33 = llvm.mlir.constant(511 : index) : i64
125 %34 = llvm.mlir.constant(0 : index) : i64
126 %35 = llvm.mlir.constant(512 : index) : i64
127 %36 = llvm.mlir.constant(1 : index) : i64
128 %37 = omp.map.bounds lower_bound(%34 : i64) upper_bound(%33 : i64) extent(%35 : i64) stride(%36 : i64) start_idx(%36 : i64)
129 %map4 = omp.map.info var_ptr(%3 : !llvm.ptr, !llvm.array<512 x i32>) map_clauses(exit_release_or_enter_alloc) capture(ByRef) bounds(%37) -> !llvm.ptr {name = ""}
130 omp.target_exit_data if(%26) device(%27 : i32) map_entries(%map3, %map4 : !llvm.ptr, !llvm.ptr)
134 // CHECK: @.offload_sizes = private unnamed_addr constant [2 x i64] [i64 4096, i64 2048]
135 // CHECK: @.offload_maptypes = private unnamed_addr constant [2 x i64] [i64 1, i64 0]
136 // CHECK: @.offload_sizes.1 = private unnamed_addr constant [2 x i64] [i64 4096, i64 2048]
137 // CHECK: @.offload_maptypes.2 = private unnamed_addr constant [2 x i64] [i64 2, i64 0]
138 // CHECK-LABEL: define void @_QPomp_target_enter_exit
139 // CHECK: (ptr %[[ARG_0:.*]], ptr %[[ARG_1:.*]]) {
140 // CHECK: %[[VAL_0:.*]] = alloca [2 x ptr], align 8
141 // CHECK: %[[VAL_1:.*]] = alloca [2 x ptr], align 8
142 // CHECK: %[[VAL_2:.*]] = alloca [2 x ptr], align 8
143 // CHECK: %[[VAL_3:.*]] = alloca [2 x ptr], align 8
144 // CHECK: %[[VAL_4:.*]] = alloca [2 x ptr], align 8
145 // CHECK: %[[VAL_5:.*]] = alloca [2 x ptr], align 8
146 // CHECK: %[[VAL_6:.*]] = alloca i32, i64 1, align 4
147 // CHECK: %[[VAL_7:.*]] = alloca i32, i64 1, align 4
148 // CHECK: store i32 5, ptr %[[VAL_7]], align 4
149 // CHECK: store i32 2, ptr %[[VAL_6]], align 4
150 // CHECK: %[[VAL_8:.*]] = load i32, ptr %[[VAL_7]], align 4
151 // CHECK: %[[VAL_9:.*]] = icmp slt i32 %[[VAL_8]], 10
152 // CHECK: %[[VAL_10:.*]] = load i32, ptr %[[VAL_6]], align 4
153 // CHECK: br label %[[VAL_11:.*]]
154 // CHECK: entry: ; preds = %[[VAL_12:.*]]
155 // CHECK: br i1 %[[VAL_9]], label %[[VAL_13:.*]], label %[[VAL_14:.*]]
156 // CHECK: omp_if.then: ; preds = %[[VAL_11]]
157 // CHECK: %[[ARR_OFFSET1:.*]] = getelementptr inbounds [1024 x i32], ptr %[[VAL_16:.*]], i64 0, i64 0
158 // CHECK: %[[ARR_OFFSET2:.*]] = getelementptr inbounds [512 x i32], ptr %[[VAL_20:.*]], i64 0, i64 0
159 // CHECK: %[[VAL_15:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_3]], i32 0, i32 0
160 // CHECK: store ptr %[[VAL_16]], ptr %[[VAL_15]], align 8
161 // CHECK: %[[VAL_17:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_4]], i32 0, i32 0
162 // CHECK: store ptr %[[ARR_OFFSET1]], ptr %[[VAL_17]], align 8
163 // CHECK: %[[VAL_18:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_5]], i64 0, i64 0
164 // CHECK: store ptr null, ptr %[[VAL_18]], align 8
165 // CHECK: %[[VAL_19:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_3]], i32 0, i32 1
166 // CHECK: store ptr %[[VAL_20]], ptr %[[VAL_19]], align 8
167 // CHECK: %[[VAL_21:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_4]], i32 0, i32 1
168 // CHECK: store ptr %[[ARR_OFFSET2]], ptr %[[VAL_21]], align 8
169 // CHECK: %[[VAL_22:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_5]], i64 0, i64 1
170 // CHECK: store ptr null, ptr %[[VAL_22]], align 8
171 // CHECK: %[[VAL_23:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_3]], i32 0, i32 0
172 // CHECK: %[[VAL_24:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_4]], i32 0, i32 0
173 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @3, i64 -1, i32 2, ptr %[[VAL_23]], ptr %[[VAL_24]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
174 // CHECK: br label %[[VAL_25:.*]]
175 // CHECK: omp_if.else: ; preds = %[[VAL_11]]
176 // CHECK: br label %[[VAL_25]]
177 // CHECK: omp_if.end: ; preds = %[[VAL_14]], %[[VAL_13]]
178 // CHECK: %[[VAL_26:.*]] = load i32, ptr %[[VAL_7]], align 4
179 // CHECK: %[[VAL_27:.*]] = icmp sgt i32 %[[VAL_26]], 10
180 // CHECK: %[[VAL_28:.*]] = load i32, ptr %[[VAL_6]], align 4
181 // CHECK: br i1 %[[VAL_27]], label %[[VAL_29:.*]], label %[[VAL_30:.*]]
182 // CHECK: omp_if.then2: ; preds = %[[VAL_25]]
183 // CHECK: %[[ARR_OFFSET3:.*]] = getelementptr inbounds [1024 x i32], ptr %[[VAL_16]], i64 0, i64 0
184 // CHECK: %[[ARR_OFFSET4:.*]] = getelementptr inbounds [512 x i32], ptr %[[VAL_20]], i64 0, i64 0
185 // CHECK: %[[VAL_31:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
186 // CHECK: store ptr %[[VAL_16]], ptr %[[VAL_31]], align 8
187 // CHECK: %[[VAL_32:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
188 // CHECK: store ptr %[[ARR_OFFSET3]], ptr %[[VAL_32]], align 8
189 // CHECK: %[[VAL_33:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_2]], i64 0, i64 0
190 // CHECK: store ptr null, ptr %[[VAL_33]], align 8
191 // CHECK: %[[VAL_34:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 1
192 // CHECK: store ptr %[[VAL_20]], ptr %[[VAL_34]], align 8
193 // CHECK: %[[VAL_35:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 1
194 // CHECK: store ptr %[[ARR_OFFSET4]], ptr %[[VAL_35]], align 8
195 // CHECK: %[[VAL_36:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_2]], i64 0, i64 1
196 // CHECK: store ptr null, ptr %[[VAL_36]], align 8
197 // CHECK: %[[VAL_37:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
198 // CHECK: %[[VAL_38:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
199 // CHECK: call void @__tgt_target_data_end_mapper(ptr @3, i64 -1, i32 2, ptr %[[VAL_37]], ptr %[[VAL_38]], ptr @.offload_sizes.1, ptr @.offload_maptypes.2, ptr @.offload_mapnames.3, ptr null)
200 // CHECK: br label %[[VAL_39:.*]]
201 // CHECK: omp_if.else8: ; preds = %[[VAL_25]]
202 // CHECK: br label %[[VAL_39]]
203 // CHECK: omp_if.end9: ; preds = %[[VAL_30]], %[[VAL_29]]
208 llvm.func @_QPopenmp_target_use_dev_ptr() {
209 %0 = llvm.mlir.constant(1 : i64) : i64
210 %a = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
211 %map1 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}
212 %map2 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}
213 omp.target_data map_entries(%map1 : !llvm.ptr) use_device_ptr(%map2 -> %arg0 : !llvm.ptr) {
214 %1 = llvm.mlir.constant(10 : i32) : i32
215 %2 = llvm.load %arg0 : !llvm.ptr -> !llvm.ptr
216 llvm.store %1, %2 : i32, !llvm.ptr
222 // CHECK: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 8]
223 // CHECK: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 66]
224 // CHECK-LABEL: define void @_QPopenmp_target_use_dev_ptr
225 // CHECK: %[[VAL_0:.*]] = alloca [1 x ptr], align 8
226 // CHECK: %[[VAL_1:.*]] = alloca [1 x ptr], align 8
227 // CHECK: %[[VAL_2:.*]] = alloca [1 x ptr], align 8
228 // CHECK: %[[VAL_3:.*]] = alloca ptr, align 8
229 // CHECK: %[[VAL_4:.*]] = alloca ptr, i64 1, align 8
230 // CHECK: br label %[[VAL_5:.*]]
231 // CHECK: entry: ; preds = %[[VAL_6:.*]]
232 // CHECK: %[[VAL_7:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
233 // CHECK: store ptr %[[VAL_4]], ptr %[[VAL_7]], align 8
234 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
235 // CHECK: store ptr %[[VAL_4]], ptr %[[VAL_8]], align 8
236 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_2]], i64 0, i64 0
237 // CHECK: store ptr null, ptr %[[VAL_9]], align 8
238 // CHECK: %[[VAL_10:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
239 // CHECK: %[[VAL_11:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
240 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @{{.*}}, i64 -1, i32 1, ptr %[[VAL_10]], ptr %[[VAL_11]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
241 // CHECK: %[[VAL_12:.*]] = load ptr, ptr %[[VAL_7]], align 8
242 // CHECK: store ptr %[[VAL_12]], ptr %[[VAL_3]], align 8
243 // CHECK: %[[VAL_13:.*]] = load ptr, ptr %[[VAL_3]], align 8
244 // CHECK: store i32 10, ptr %[[VAL_13]], align 4
245 // CHECK: %[[VAL_14:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
246 // CHECK: %[[VAL_15:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
247 // CHECK: call void @__tgt_target_data_end_mapper(ptr @{{.*}}, i64 -1, i32 1, ptr %[[VAL_14]], ptr %[[VAL_15]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
252 llvm.func @_QPopenmp_target_use_dev_addr() {
253 %0 = llvm.mlir.constant(1 : i64) : i64
254 %a = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
255 %map = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}
256 %map2 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}
257 omp.target_data map_entries(%map : !llvm.ptr) use_device_addr(%map2 -> %arg0 : !llvm.ptr) {
258 %1 = llvm.mlir.constant(10 : i32) : i32
259 %2 = llvm.load %arg0 : !llvm.ptr -> !llvm.ptr
260 llvm.store %1, %2 : i32, !llvm.ptr
266 // CHECK: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 8]
267 // CHECK: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 66]
268 // CHECK-LABEL: define void @_QPopenmp_target_use_dev_addr
269 // CHECK: %[[VAL_0:.*]] = alloca [1 x ptr], align 8
270 // CHECK: %[[VAL_1:.*]] = alloca [1 x ptr], align 8
271 // CHECK: %[[VAL_2:.*]] = alloca [1 x ptr], align 8
272 // CHECK: %[[VAL_3:.*]] = alloca ptr, i64 1, align 8
273 // CHECK: br label %[[VAL_4:.*]]
274 // CHECK: entry: ; preds = %[[VAL_5:.*]]
275 // CHECK: %[[VAL_6:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
276 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_6]], align 8
277 // CHECK: %[[VAL_7:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
278 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_7]], align 8
279 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_2]], i64 0, i64 0
280 // CHECK: store ptr null, ptr %[[VAL_8]], align 8
281 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
282 // CHECK: %[[VAL_10:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
283 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @{{.*}}, i64 -1, i32 1, ptr %[[VAL_9]], ptr %[[VAL_10]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
284 // CHECK: %[[VAL_11:.*]] = load ptr, ptr %[[VAL_6]], align 8
285 // CHECK: %[[VAL_12:.*]] = load ptr, ptr %[[VAL_11]], align 8
286 // CHECK: store i32 10, ptr %[[VAL_12]], align 4
287 // CHECK: %[[VAL_13:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
288 // CHECK: %[[VAL_14:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
289 // CHECK: call void @__tgt_target_data_end_mapper(ptr @{{.*}}, i64 -1, i32 1, ptr %[[VAL_13]], ptr %[[VAL_14]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
294 llvm.func @_QPopenmp_target_use_dev_addr_no_ptr() {
295 %0 = llvm.mlir.constant(1 : i64) : i64
296 %a = llvm.alloca %0 x i32 : (i64) -> !llvm.ptr
297 %map = omp.map.info var_ptr(%a : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
298 %map2 = omp.map.info var_ptr(%a : !llvm.ptr, i32) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
299 omp.target_data map_entries(%map : !llvm.ptr) use_device_addr(%map2 -> %arg0 : !llvm.ptr) {
300 %1 = llvm.mlir.constant(10 : i32) : i32
301 llvm.store %1, %arg0 : i32, !llvm.ptr
307 // CHECK: @.offload_sizes = private unnamed_addr constant [1 x i64] [i64 4]
308 // CHECK: @.offload_maptypes = private unnamed_addr constant [1 x i64] [i64 67]
309 // CHECK-LABEL: define void @_QPopenmp_target_use_dev_addr_no_ptr
310 // CHECK: %[[VAL_0:.*]] = alloca [1 x ptr], align 8
311 // CHECK: %[[VAL_1:.*]] = alloca [1 x ptr], align 8
312 // CHECK: %[[VAL_2:.*]] = alloca [1 x ptr], align 8
313 // CHECK: %[[VAL_3:.*]] = alloca i32, i64 1, align 4
314 // CHECK: br label %[[VAL_4:.*]]
315 // CHECK: entry: ; preds = %[[VAL_5:.*]]
316 // CHECK: %[[VAL_6:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
317 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_6]], align 8
318 // CHECK: %[[VAL_7:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
319 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_7]], align 8
320 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_2]], i64 0, i64 0
321 // CHECK: store ptr null, ptr %[[VAL_8]], align 8
322 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
323 // CHECK: %[[VAL_10:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
324 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @{{.*}}, i64 -1, i32 1, ptr %[[VAL_9]], ptr %[[VAL_10]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
325 // CHECK: %[[VAL_11:.*]] = load ptr, ptr %[[VAL_6]], align 8
326 // CHECK: store i32 10, ptr %[[VAL_11]], align 4
327 // CHECK: %[[VAL_12:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_0]], i32 0, i32 0
328 // CHECK: %[[VAL_13:.*]] = getelementptr inbounds [1 x ptr], ptr %[[VAL_1]], i32 0, i32 0
329 // CHECK: call void @__tgt_target_data_end_mapper(ptr @{{.*}}, i64 -1, i32 1, ptr %[[VAL_12]], ptr %[[VAL_13]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
334 llvm.func @_QPopenmp_target_use_dev_addr_nomap() {
335 %0 = llvm.mlir.constant(1 : i64) : i64
336 %a = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
337 %1 = llvm.mlir.constant(1 : i64) : i64
338 %b = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
339 %map = omp.map.info var_ptr(%b : !llvm.ptr, !llvm.ptr) map_clauses(from) capture(ByRef) -> !llvm.ptr {name = ""}
340 %map2 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
341 omp.target_data map_entries(%map : !llvm.ptr) use_device_addr(%map2 -> %arg0 : !llvm.ptr) {
342 %2 = llvm.mlir.constant(10 : i32) : i32
343 %3 = llvm.load %arg0 : !llvm.ptr -> !llvm.ptr
344 llvm.store %2, %3 : i32, !llvm.ptr
345 %4 = llvm.mlir.constant(20 : i32) : i32
346 %5 = llvm.load %b : !llvm.ptr -> !llvm.ptr
347 llvm.store %4, %5 : i32, !llvm.ptr
353 // CHECK: @.offload_sizes = private unnamed_addr constant [2 x i64] [i64 8, i64 0]
354 // CHECK: @.offload_maptypes = private unnamed_addr constant [2 x i64] [i64 2, i64 64]
355 // CHECK-LABEL: define void @_QPopenmp_target_use_dev_addr_nomap
356 // CHECK: %[[VAL_0:.*]] = alloca [2 x ptr], align 8
357 // CHECK: %[[VAL_1:.*]] = alloca [2 x ptr], align 8
358 // CHECK: %[[VAL_2:.*]] = alloca [2 x ptr], align 8
359 // CHECK: %[[VAL_3:.*]] = alloca ptr, i64 1, align 8
360 // CHECK: %[[VAL_4:.*]] = alloca ptr, i64 1, align 8
361 // CHECK: br label %[[VAL_5:.*]]
362 // CHECK: entry: ; preds = %[[VAL_6:.*]]
363 // CHECK: %[[VAL_7:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
364 // CHECK: store ptr %[[VAL_4]], ptr %[[VAL_7]], align 8
365 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
366 // CHECK: store ptr %[[VAL_4]], ptr %[[VAL_8]], align 8
367 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_2]], i64 0, i64 0
368 // CHECK: store ptr null, ptr %[[VAL_9]], align 8
369 // CHECK: %[[VAL_10:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 1
370 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_10]], align 8
371 // CHECK: %[[VAL_11:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 1
372 // CHECK: store ptr %[[VAL_3]], ptr %[[VAL_11]], align 8
373 // CHECK: %[[VAL_12:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_2]], i64 0, i64 1
374 // CHECK: store ptr null, ptr %[[VAL_12]], align 8
375 // CHECK: %[[VAL_13:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
376 // CHECK: %[[VAL_14:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
377 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @3, i64 -1, i32 2, ptr %[[VAL_13]], ptr %[[VAL_14]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
378 // CHECK: %[[VAL_15:.*]] = load ptr, ptr %[[VAL_10]], align 8
379 // CHECK: %[[VAL_16:.*]] = load ptr, ptr %[[VAL_15]], align 8
380 // CHECK: store i32 10, ptr %[[VAL_16]], align 4
381 // CHECK: %[[VAL_17:.*]] = load ptr, ptr %[[VAL_4]], align 8
382 // CHECK: store i32 20, ptr %[[VAL_17]], align 4
383 // CHECK: %[[VAL_18:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
384 // CHECK: %[[VAL_19:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
385 // CHECK: call void @__tgt_target_data_end_mapper(ptr @3, i64 -1, i32 2, ptr %[[VAL_18]], ptr %[[VAL_19]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
390 llvm.func @_QPopenmp_target_use_dev_both() {
391 %0 = llvm.mlir.constant(1 : i64) : i64
392 %a = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
393 %1 = llvm.mlir.constant(1 : i64) : i64
394 %b = llvm.alloca %0 x !llvm.ptr : (i64) -> !llvm.ptr
395 %map = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
396 %map1 = omp.map.info var_ptr(%b : !llvm.ptr, !llvm.ptr) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
397 %map2 = omp.map.info var_ptr(%a : !llvm.ptr, !llvm.ptr) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
398 %map3 = omp.map.info var_ptr(%b : !llvm.ptr, !llvm.ptr) map_clauses(tofrom) capture(ByRef) -> !llvm.ptr {name = ""}
399 omp.target_data map_entries(%map, %map1 : !llvm.ptr, !llvm.ptr) use_device_addr(%map3 -> %arg0 : !llvm.ptr) use_device_ptr(%map2 -> %arg1 : !llvm.ptr) {
400 %2 = llvm.mlir.constant(10 : i32) : i32
401 %3 = llvm.load %arg1 : !llvm.ptr -> !llvm.ptr
402 llvm.store %2, %3 : i32, !llvm.ptr
403 %4 = llvm.mlir.constant(20 : i32) : i32
404 %5 = llvm.load %arg0 : !llvm.ptr -> !llvm.ptr
405 llvm.store %4, %5 : i32, !llvm.ptr
411 // CHECK: @.offload_sizes = private unnamed_addr constant [2 x i64] [i64 8, i64 8]
412 // CHECK: @.offload_maptypes = private unnamed_addr constant [2 x i64] [i64 67, i64 67]
413 // CHECK-LABEL: define void @_QPopenmp_target_use_dev_both
414 // CHECK: %[[VAL_0:.*]] = alloca [2 x ptr], align 8
415 // CHECK: %[[VAL_1:.*]] = alloca [2 x ptr], align 8
416 // CHECK: %[[VAL_2:.*]] = alloca [2 x ptr], align 8
417 // CHECK: %[[VAL_3:.*]] = alloca ptr, align 8
418 // CHECK: %[[VAL_4:.*]] = alloca ptr, i64 1, align 8
419 // CHECK: %[[VAL_5:.*]] = alloca ptr, i64 1, align 8
420 // CHECK: br label %[[VAL_6:.*]]
421 // CHECK: entry: ; preds = %[[VAL_7:.*]]
422 // CHECK: %[[VAL_8:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
423 // CHECK: store ptr %[[VAL_4]], ptr %[[VAL_8]], align 8
424 // CHECK: %[[VAL_9:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
425 // CHECK: store ptr %[[VAL_4]], ptr %[[VAL_9]], align 8
426 // CHECK: %[[VAL_10:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_2]], i64 0, i64 0
427 // CHECK: store ptr null, ptr %[[VAL_10]], align 8
428 // CHECK: %[[VAL_11:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 1
429 // CHECK: store ptr %[[VAL_5]], ptr %[[VAL_11]], align 8
430 // CHECK: %[[VAL_12:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 1
431 // CHECK: store ptr %[[VAL_5]], ptr %[[VAL_12]], align 8
432 // CHECK: %[[VAL_13:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_2]], i64 0, i64 1
433 // CHECK: store ptr null, ptr %[[VAL_13]], align 8
434 // CHECK: %[[VAL_14:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
435 // CHECK: %[[VAL_15:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
436 // CHECK: call void @__tgt_target_data_begin_mapper(ptr @{{.*}}, i64 -1, i32 2, ptr %[[VAL_14]], ptr %[[VAL_15]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
437 // CHECK: %[[VAL_16:.*]] = load ptr, ptr %[[VAL_8]], align 8
438 // CHECK: store ptr %[[VAL_16]], ptr %[[VAL_3]], align 8
439 // CHECK: %[[VAL_17:.*]] = load ptr, ptr %[[VAL_11]], align 8
440 // CHECK: %[[VAL_18:.*]] = load ptr, ptr %[[VAL_3]], align 8
441 // CHECK: store i32 10, ptr %[[VAL_18]], align 4
442 // CHECK: %[[VAL_19:.*]] = load ptr, ptr %[[VAL_17]], align 8
443 // CHECK: store i32 20, ptr %[[VAL_19]], align 4
444 // CHECK: %[[VAL_20:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_0]], i32 0, i32 0
445 // CHECK: %[[VAL_21:.*]] = getelementptr inbounds [2 x ptr], ptr %[[VAL_1]], i32 0, i32 0
446 // CHECK: call void @__tgt_target_data_end_mapper(ptr @{{.*}}, i64 -1, i32 2, ptr %[[VAL_20]], ptr %[[VAL_21]], ptr @.offload_sizes, ptr @.offload_maptypes, ptr @.offload_mapnames, ptr null)
451 llvm.func @_QPopenmp_target_data_update() {
452 %0 = llvm.mlir.constant(1 : i64) : i64
453 %1 = llvm.alloca %0 x i32 {bindc_name = "i", in_type = i32, operand_segment_sizes = array<i32: 0, 0>, uniq_name = "_QFopenmp_target_dataEi"} : (i64) -> !llvm.ptr
454 %2 = omp.map.info var_ptr(%1 : !llvm.ptr, i32) map_clauses(to) capture(ByRef) -> !llvm.ptr {name = ""}
455 omp.target_data map_entries(%2 : !llvm.ptr) {
456 %3 = llvm.mlir.constant(99 : i32) : i32
457 llvm.store %3, %1 : i32, !llvm.ptr
461 omp.target_update map_entries(%2 : !llvm.ptr)
466 // CHECK-LABEL: define void @_QPopenmp_target_data_update
468 // CHECK-DAG: %[[OFFLOAD_BASEPTRS:.*]] = alloca [1 x ptr], align 8
469 // CHECK-DAG: %[[OFFLOAD_PTRS:.*]] = alloca [1 x ptr], align 8
470 // CHECK-DAG: %[[INT_ALLOCA:.*]] = alloca i32, i64 1, align 4
471 // CHECK-DAG: %[[OFFLOAD_MAPPERS:.*]] = alloca [1 x ptr], align 8
473 // CHECK: call void @__tgt_target_data_begin_mapper
474 // CHECK: store i32 99, ptr %[[INT_ALLOCA]], align 4
475 // CHECK: call void @__tgt_target_data_end_mapper
477 // CHECK: %[[BASEPTRS_VAL:.*]] = getelementptr inbounds [1 x ptr], ptr %[[OFFLOAD_BASEPTRS]], i32 0, i32 0
478 // CHECK: store ptr %[[INT_ALLOCA]], ptr %[[BASEPTRS_VAL]], align 8
479 // CHECK: %[[PTRS_VAL:.*]] = getelementptr inbounds [1 x ptr], ptr %[[OFFLOAD_PTRS]], i32 0, i32 0
480 // CHECK: store ptr %[[INT_ALLOCA]], ptr %[[PTRS_VAL]], align 8
481 // CHECK: %[[MAPPERS_VAL:.*]] = getelementptr inbounds [1 x ptr], ptr %[[OFFLOAD_MAPPERS]], i64 0, i64 0
482 // CHECK: store ptr null, ptr %[[MAPPERS_VAL]], align 8
483 // CHECK: %[[BASEPTRS_VAL_2:.*]] = getelementptr inbounds [1 x ptr], ptr %[[OFFLOAD_BASEPTRS]], i32 0, i32 0
484 // CHECK: %[[PTRS_VAL_2:.*]] = getelementptr inbounds [1 x ptr], ptr %[[OFFLOAD_PTRS]], i32 0, i32 0
485 // CHECK: call void @__tgt_target_data_update_mapper(ptr @2, i64 -1, i32 1, ptr %[[BASEPTRS_VAL_2]], ptr %[[PTRS_VAL_2]], ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr null)