Skip to content

Commit 52e693b

Browse files
committed
Get VLA dimensions when there is a pointer to VLA
Fixes llvm#42
1 parent b98aaec commit 52e693b

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

clang/lib/CodeGen/CGOmpSsRuntime.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,9 @@ static void EmitDSAShared(
676676
TaskInfo.emplace_back(BundleName, V);
677677
}
678678
QualType Q = VD->getType();
679+
// int (**p)[sizex][sizey] -> we need sizex sizey for vla dims
680+
while (Q->isPointerType())
681+
Q = Q->getPointeeType();
679682
if (Q->isVariableArrayType())
680683
EmitVLADims(CGF, V, Q, TaskInfo, CapturedList);
681684

@@ -708,6 +711,9 @@ static void EmitDSAPrivate(
708711
TaskInfo.emplace_back(BundleName, V);
709712
}
710713
QualType Q = VD->getType();
714+
// int (**p)[sizex][sizey] -> we need sizex sizey for vla dims
715+
while (Q->isPointerType())
716+
Q = Q->getPointeeType();
711717
if (Q->isVariableArrayType())
712718
EmitVLADims(CGF, V, Q, TaskInfo, CapturedList);
713719

@@ -742,6 +748,9 @@ static void EmitDSAFirstprivate(
742748
TaskInfo.emplace_back(BundleName, V);
743749
}
744750
QualType Q = VD->getType();
751+
// int (**p)[sizex][sizey] -> we need sizex sizey for vla dims
752+
while (Q->isPointerType())
753+
Q = Q->getPointeeType();
745754
if (Q->isVariableArrayType())
746755
EmitVLADims(CGF, V, Q, TaskInfo, CapturedList);
747756

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: %clang_cc1 -verify -fompss-2 -disable-llvm-passes -ferror-limit 100 %s -S -emit-llvm -o - | FileCheck %s
2+
// expected-no-diagnostics
3+
void foo(int sizex,
4+
int sizey,
5+
int (*p1)[sizex][sizey],
6+
int (**p2)[sizex][sizey],
7+
int *p3[sizex][sizey],
8+
int p4[sizex][sizey]) {
9+
int a;
10+
#pragma oss task in(p1[3], p4[2], p3[5], p2[3])
11+
#pragma oss task shared(p1, p4, p3, p2)
12+
#pragma oss task private(p1, p4, p3, p2)
13+
#pragma oss task firstprivate(p1, p4, p3, p2)
14+
{
15+
(*p1)[0][1] = 3;
16+
(*p2)[0][1][4] = 3;
17+
p4[2][3] = 4;
18+
p3[5][3] = 0;
19+
}
20+
}
21+
22+
// CHECK: %26 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.FIRSTPRIVATE"(i32** %p1.addr), "QUAL.OSS.VLA.DIMS"(i32** %p1.addr, i64 %1, i64 %3), "QUAL.OSS.FIRSTPRIVATE"(i32** %p4.addr), "QUAL.OSS.VLA.DIMS"(i32** %p4.addr, i64 %15), "QUAL.OSS.FIRSTPRIVATE"(i32*** %p3.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p3.addr, i64 %11), "QUAL.OSS.FIRSTPRIVATE"(i32*** %p2.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p2.addr, i64 %5, i64 %7), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %15, i64 %11, i64 %5, i64 %7), "QUAL.OSS.DEP.IN"(i32* %16, i64 %17, i64 0, i64 %18, i64 %1, i64 0, i64 %1, i64 1, i64 3, i64 4), "QUAL.OSS.DEP.IN"(i32* %19, i64 %20, i64 0, i64 %21, i64 1, i64 2, i64 3), "QUAL.OSS.DEP.IN"(i32** %22, i64 %23, i64 0, i64 %24, i64 1, i64 5, i64 6), "QUAL.OSS.DEP.IN"(i32** %25, i64 8, i64 24, i64 32) ], !dbg !13
23+
// CHECK: %27 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32** %p1.addr), "QUAL.OSS.VLA.DIMS"(i32** %p1.addr, i64 %1, i64 %3), "QUAL.OSS.SHARED"(i32** %p4.addr), "QUAL.OSS.VLA.DIMS"(i32** %p4.addr, i64 %15), "QUAL.OSS.SHARED"(i32*** %p3.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p3.addr, i64 %11), "QUAL.OSS.SHARED"(i32*** %p2.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p2.addr, i64 %5, i64 %7), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %15, i64 %11, i64 %5, i64 %7) ], !dbg !14
24+
// CHECK: %28 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.PRIVATE"(i32** %p1.addr), "QUAL.OSS.VLA.DIMS"(i32** %p1.addr, i64 %1, i64 %3), "QUAL.OSS.PRIVATE"(i32** %p4.addr), "QUAL.OSS.VLA.DIMS"(i32** %p4.addr, i64 %15), "QUAL.OSS.PRIVATE"(i32*** %p3.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p3.addr, i64 %11), "QUAL.OSS.PRIVATE"(i32*** %p2.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p2.addr, i64 %5, i64 %7), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %15, i64 %11, i64 %5, i64 %7) ], !dbg !15
25+
// CHECK: %29 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.FIRSTPRIVATE"(i32** %p1.addr), "QUAL.OSS.VLA.DIMS"(i32** %p1.addr, i64 %1, i64 %3), "QUAL.OSS.FIRSTPRIVATE"(i32** %p4.addr), "QUAL.OSS.VLA.DIMS"(i32** %p4.addr, i64 %15), "QUAL.OSS.FIRSTPRIVATE"(i32*** %p3.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p3.addr, i64 %11), "QUAL.OSS.FIRSTPRIVATE"(i32*** %p2.addr), "QUAL.OSS.VLA.DIMS"(i32*** %p2.addr, i64 %5, i64 %7), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3, i64 %15, i64 %11, i64 %5, i64 %7) ], !dbg !16
26+

0 commit comments

Comments
 (0)