@@ -278,3 +278,116 @@ void foo4(int x, int y, int z) {
278
278
#pragma oss task inout([c]([a][b]vla[sizeof(vla)]))
279
279
{}
280
280
}
281
+
282
+ // CHECK: %9 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3, i64 %5), "QUAL.OSS.FIRSTPRIVATE"(i32* %a), "QUAL.OSS.FIRSTPRIVATE"(i32* %b), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %5), "QUAL.OSS.DEP.INOUT"(i32* %vla, %struct._depend_unpack_t.9 (i32*, i32*, i32*, i64, i64, i64)* @compute_dep.10, i32* %vla, i32* %a, i32* %b, i64 %1, i64 %3, i64 %5) ]
283
+ // CHECK: %10 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3, i64 %5), "QUAL.OSS.FIRSTPRIVATE"(i32* %a), "QUAL.OSS.FIRSTPRIVATE"(i32* %b), "QUAL.OSS.FIRSTPRIVATE"(i32* %c), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %5), "QUAL.OSS.DEP.INOUT"(i32* %vla, %struct._depend_unpack_t.10 (i32*, i32*, i32*, i32*, i64, i64, i64)* @compute_dep.11, i32* %vla, i32* %a, i32* %b, i32* %c, i64 %1, i64 %3, i64 %5) ]
284
+ // CHECK: %11 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3, i64 %5), "QUAL.OSS.FIRSTPRIVATE"(i32* %a), "QUAL.OSS.FIRSTPRIVATE"(i32* %b), "QUAL.OSS.FIRSTPRIVATE"(i32* %c), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %5), "QUAL.OSS.DEP.INOUT"(i32* %vla, %struct._depend_unpack_t.11 (i32*, i32*, i32*, i32*, i64, i64, i64)* @compute_dep.12, i32* %vla, i32* %a, i32* %b, i32* %c, i64 %1, i64 %3, i64 %5) ]
285
+
286
+ // CHECK: define internal %struct._depend_unpack_t.9 @compute_dep.10(i32* %vla, i32* %a, i32* %b, i64 %0, i64 %1, i64 %2) {
287
+ // CHECK-NEXT: entry:
288
+ // CHECK-NEXT: %return.val = alloca %struct._depend_unpack_t.9, align 8
289
+ // CHECK-NEXT: %3 = load i32, i32* %b, align 4
290
+ // CHECK-NEXT: %4 = sext i32 %3 to i64
291
+ // CHECK-NEXT: %5 = add i64 %4, 1
292
+ // CHECK-NEXT: %6 = mul nuw i64 %1, %2
293
+ // CHECK-NEXT: %7 = mul nsw i64 2, %6
294
+ // CHECK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %vla, i64 %7
295
+ // CHECK-NEXT: %8 = load i32, i32* %a, align 4
296
+ // CHECK-NEXT: %9 = zext i32 %8 to i64
297
+ // CHECK-NEXT: %10 = mul i64 %2, 4
298
+ // CHECK-NEXT: %11 = mul i64 %2, 4
299
+ // CHECK-NEXT: %12 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 0
300
+ // CHECK-NEXT: store i32* %arrayidx, i32** %12, align 8
301
+ // CHECK-NEXT: %13 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 1
302
+ // CHECK-NEXT: store i64 %10, i64* %13, align 8
303
+ // CHECK-NEXT: %14 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 2
304
+ // CHECK-NEXT: store i64 0, i64* %14, align 8
305
+ // CHECK-NEXT: %15 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 3
306
+ // CHECK-NEXT: store i64 %11, i64* %15, align 8
307
+ // CHECK-NEXT: %16 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 4
308
+ // CHECK-NEXT: store i64 %9, i64* %16, align 8
309
+ // CHECK-NEXT: %17 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 5
310
+ // CHECK-NEXT: store i64 %4, i64* %17, align 8
311
+ // CHECK-NEXT: %18 = getelementptr inbounds %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, i32 0, i32 6
312
+ // CHECK-NEXT: store i64 %5, i64* %18, align 8
313
+ // CHECK-NEXT: %19 = load %struct._depend_unpack_t.9, %struct._depend_unpack_t.9* %return.val, align 8
314
+ // CHECK-NEXT: ret %struct._depend_unpack_t.9 %19
315
+ // CHECK-NEXT: }
316
+
317
+ // CHECK: define internal %struct._depend_unpack_t.10 @compute_dep.11(i32* %vla, i32* %a, i32* %b, i32* %c, i64 %0, i64 %1, i64 %2) {
318
+ // CHECK-NEXT: entry:
319
+ // CHECK-NEXT: %return.val = alloca %struct._depend_unpack_t.10, align 8
320
+ // CHECK-NEXT: %3 = load i32, i32* %c, align 4
321
+ // CHECK-NEXT: %4 = zext i32 %3 to i64
322
+ // CHECK-NEXT: %5 = load i32, i32* %b, align 4
323
+ // CHECK-NEXT: %6 = zext i32 %5 to i64
324
+ // CHECK-NEXT: %7 = mul i64 %2, 4
325
+ // CHECK-NEXT: %8 = mul i64 %2, 4
326
+ // CHECK-NEXT: %9 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 0
327
+ // CHECK-NEXT: store i32* %vla, i32** %9, align 8
328
+ // CHECK-NEXT: %10 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 1
329
+ // CHECK-NEXT: store i64 %7, i64* %10, align 8
330
+ // CHECK-NEXT: %11 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 2
331
+ // CHECK-NEXT: store i64 0, i64* %11, align 8
332
+ // CHECK-NEXT: %12 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 3
333
+ // CHECK-NEXT: store i64 %8, i64* %12, align 8
334
+ // CHECK-NEXT: %13 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 4
335
+ // CHECK-NEXT: store i64 %1, i64* %13, align 8
336
+ // CHECK-NEXT: %14 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 5
337
+ // CHECK-NEXT: store i64 0, i64* %14, align 8
338
+ // CHECK-NEXT: %15 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 6
339
+ // CHECK-NEXT: store i64 %1, i64* %15, align 8
340
+ // CHECK-NEXT: %16 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 7
341
+ // CHECK-NEXT: store i64 %6, i64* %16, align 8
342
+ // CHECK-NEXT: %17 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 8
343
+ // CHECK-NEXT: store i64 0, i64* %17, align 8
344
+ // CHECK-NEXT: %18 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 9
345
+ // CHECK-NEXT: store i64 %6, i64* %18, align 8
346
+ // CHECK-NEXT: %19 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 10
347
+ // CHECK-NEXT: store i64 %4, i64* %19, align 8
348
+ // CHECK-NEXT: %20 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 11
349
+ // CHECK-NEXT: store i64 0, i64* %20, align 8
350
+ // CHECK-NEXT: %21 = getelementptr inbounds %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, i32 0, i32 12
351
+ // CHECK-NEXT: store i64 %4, i64* %21, align 8
352
+ // CHECK-NEXT: %22 = load %struct._depend_unpack_t.10, %struct._depend_unpack_t.10* %return.val, align 8
353
+ // CHECK-NEXT: ret %struct._depend_unpack_t.10 %22
354
+ // CHECK-NEXT: }
355
+
356
+ // CHECK: define internal %struct._depend_unpack_t.11 @compute_dep.12(i32* %vla, i32* %a, i32* %b, i32* %c, i64 %0, i64 %1, i64 %2) {
357
+ // CHECK-NEXT: entry:
358
+ // CHECK-NEXT: %return.val = alloca %struct._depend_unpack_t.11, align 8
359
+ // CHECK-NEXT: %3 = mul nuw i64 %0, %1
360
+ // CHECK-NEXT: %4 = mul nuw i64 %3, %2
361
+ // CHECK-NEXT: %5 = mul nuw i64 4, %4
362
+ // CHECK-NEXT: %6 = mul nuw i64 %1, %2
363
+ // CHECK-NEXT: %7 = mul nsw i64 %5, %6
364
+ // CHECK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %vla, i64 %7
365
+ // CHECK-NEXT: %8 = load i32, i32* %c, align 4
366
+ // CHECK-NEXT: %9 = zext i32 %8 to i64
367
+ // CHECK-NEXT: %10 = load i32, i32* %b, align 4
368
+ // CHECK-NEXT: %11 = zext i32 %10 to i64
369
+ // CHECK-NEXT: %12 = mul i64 %2, 4
370
+ // CHECK-NEXT: %13 = mul i64 %2, 4
371
+ // CHECK-NEXT: %14 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 0
372
+ // CHECK-NEXT: store i32* %arrayidx, i32** %14, align 8
373
+ // CHECK-NEXT: %15 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 1
374
+ // CHECK-NEXT: store i64 %12, i64* %15, align 8
375
+ // CHECK-NEXT: %16 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 2
376
+ // CHECK-NEXT: store i64 0, i64* %16, align 8
377
+ // CHECK-NEXT: %17 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 3
378
+ // CHECK-NEXT: store i64 %13, i64* %17, align 8
379
+ // CHECK-NEXT: %18 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 4
380
+ // CHECK-NEXT: store i64 %11, i64* %18, align 8
381
+ // CHECK-NEXT: %19 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 5
382
+ // CHECK-NEXT: store i64 0, i64* %19, align 8
383
+ // CHECK-NEXT: %20 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 6
384
+ // CHECK-NEXT: store i64 %11, i64* %20, align 8
385
+ // CHECK-NEXT: %21 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 7
386
+ // CHECK-NEXT: store i64 %9, i64* %21, align 8
387
+ // CHECK-NEXT: %22 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 8
388
+ // CHECK-NEXT: store i64 0, i64* %22, align 8
389
+ // CHECK-NEXT: %23 = getelementptr inbounds %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, i32 0, i32 9
390
+ // CHECK-NEXT: store i64 %9, i64* %23, align 8
391
+ // CHECK-NEXT: %24 = load %struct._depend_unpack_t.11, %struct._depend_unpack_t.11* %return.val, align 8
392
+ // CHECK-NEXT: ret %struct._depend_unpack_t.11 %24
393
+ // CHECK-NEXT: }
0 commit comments