Skip to content

Commit f97b53b

Browse files
committed
Emit data-sharings for variables used in declarations and variables used to declare VLAs
Closes llvm#31
1 parent e16fbd5 commit f97b53b

File tree

3 files changed

+87
-37
lines changed

3 files changed

+87
-37
lines changed

clang/lib/CodeGen/CGOmpSsRuntime.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ class OSSDependVisitor
8484
Dims.push_back(llvm::ConstantInt::getSigned(OSSArgTy, DimSize));
8585
TmpTy = BaseArrayTy->getElementType();
8686
} else if (const VariableArrayType *BaseArrayTy = CGF.getContext().getAsVariableArrayType(TmpTy)) {
87-
llvm::Value *DimExpr = CGF.EmitScalarExpr(BaseArrayTy->getSizeExpr());
88-
DimExpr = CGF.Builder.CreateSExt(DimExpr, OSSArgTy);
87+
auto VlaSize = CGF.getVLAElements1D(BaseArrayTy);
88+
llvm::Value *DimExpr = CGF.Builder.CreateSExt(VlaSize.NumElts, OSSArgTy);
8989
Dims.push_back(DimExpr);
9090
TmpTy = BaseArrayTy->getElementType();
9191
} else {
@@ -158,8 +158,8 @@ class OSSDependVisitor
158158
Dims.push_back(llvm::ConstantInt::getSigned(OSSArgTy, DimSize));
159159
TmpTy = BaseArrayTy->getElementType();
160160
} else if (const VariableArrayType *BaseArrayTy = CGF.getContext().getAsVariableArrayType(TmpTy)) {
161-
llvm::Value *DimExpr = CGF.EmitScalarExpr(BaseArrayTy->getSizeExpr());
162-
DimExpr = CGF.Builder.CreateSExt(DimExpr, OSSArgTy);
161+
auto VlaSize = CGF.getVLAElements1D(BaseArrayTy);
162+
llvm::Value *DimExpr = CGF.Builder.CreateSExt(VlaSize.NumElts, OSSArgTy);
163163
Dims.push_back(DimExpr);
164164
TmpTy = BaseArrayTy->getElementType();
165165
} else {
@@ -226,8 +226,8 @@ static void EmitDSA(StringRef Name, CodeGenFunction &CGF, const Expr *E,
226226
FirstTime = false;
227227
Basename += ".VLA";
228228
}
229-
llvm::Value *DimExpr = CGF.EmitScalarExpr(BaseArrayTy->getSizeExpr());
230-
DimExpr = CGF.Builder.CreateSExt(DimExpr, OSSArgTy);
229+
auto VlaSize = CGF.getVLAElements1D(BaseArrayTy);
230+
llvm::Value *DimExpr = CGF.Builder.CreateSExt(VlaSize.NumElts, OSSArgTy);
231231
DsaData.push_back(DimExpr);
232232
TmpTy = BaseArrayTy->getElementType();
233233
} else if (const ConstantArrayType *BaseArrayTy = CGF.getContext().getAsConstantArrayType(TmpTy)) {

clang/lib/Sema/SemaOmpSs.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,23 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
264264
Stmt *CS = nullptr;
265265
llvm::SmallVector<Expr *, 4> ImplicitShared;
266266
llvm::SmallVector<Expr *, 4> ImplicitFirstprivate;
267-
llvm::SmallSet<const ValueDecl *, 4> InnerDecls;
267+
llvm::SmallSet<ValueDecl *, 4> InnerDecls;
268+
269+
// Walks over all array dimensions looking for VLA size Expr.
270+
void GetTypeDSAs(QualType T) {
271+
QualType TmpTy = T;
272+
while (TmpTy->isArrayType()) {
273+
if (const ConstantArrayType *BaseArrayTy = SemaRef.Context.getAsConstantArrayType(TmpTy)) {
274+
TmpTy = BaseArrayTy->getElementType();
275+
} else if (const VariableArrayType *BaseArrayTy = SemaRef.Context.getAsVariableArrayType(TmpTy)) {
276+
Expr *SizeExpr = BaseArrayTy->getSizeExpr();
277+
Visit(SizeExpr);
278+
TmpTy = BaseArrayTy->getElementType();
279+
} else {
280+
llvm_unreachable("Unhandled array type");
281+
}
282+
}
283+
}
268284

269285
public:
270286
void VisitDeclRefExpr(DeclRefExpr *E) {
@@ -306,7 +322,7 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
306322
} else {
307323

308324
QualType Type = VD->getType();
309-
if (!Type.isPODType(SemaRef.Context) || Type->isVariableArrayType()) {
325+
if (!Type.isPODType(SemaRef.Context)) {
310326
return;
311327
}
312328

@@ -354,6 +370,13 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
354370
}
355371
}
356372

373+
void VisitExpr(Expr *E) {
374+
for (Stmt *Child : E->children()) {
375+
if (Child)
376+
Visit(Child);
377+
}
378+
}
379+
357380
void VisitStmt(Stmt *S) {
358381
for (Stmt *C : S->children()) {
359382
if (C)
@@ -362,9 +385,15 @@ class DSAAttrChecker final : public StmtVisitor<DSAAttrChecker, void> {
362385
}
363386

364387
void VisitDeclStmt(DeclStmt *S) {
365-
for (const Decl *D : S->decls())
366-
if (const auto *VD = dyn_cast_or_null<ValueDecl>(D))
388+
for (Decl *D : S->decls()) {
389+
if (auto *VD = dyn_cast_or_null<VarDecl>(D)) {
367390
InnerDecls.insert(VD);
391+
if (VD->hasInit()) {
392+
Visit(VD->getInit());
393+
}
394+
GetTypeDSAs(VD->getType());
395+
}
396+
}
368397
}
369398

370399
bool isErrorFound() const { return ErrorFound; }

clang/test/OmpSs/IR/task_vla.c

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,52 @@ void foo(int n) {
1111
{}
1212
}
1313

14-
// CHECK: %7 = load i32, i32* %n.addr, align 4
15-
// CHECK-NEXT: %8 = sext i32 %7 to i64
16-
// CHECK-NEXT: %9 = load i32, i32* %n.addr, align 4
17-
// CHECK-NEXT: %add1 = add nsw i32 %9, 1
18-
// CHECK-NEXT: %10 = sext i32 %add1 to i64
19-
// CHECK-NEXT: %11 = load i32, i32* %i, align 4
20-
// CHECK-NEXT: %add2 = add nsw i32 %11, 1
21-
// CHECK-NEXT: %12 = sext i32 %add2 to i64
22-
// CHECK-NEXT: %13 = add i64 %12, 1
23-
// CHECK-NEXT: %14 = load i32, i32* %i, align 4
24-
// CHECK-NEXT: %15 = sext i32 %14 to i64
25-
// CHECK-NEXT: %16 = add i64 %15, 1
26-
// CHECK-NEXT: %17 = load i32, i32* %n.addr, align 4
27-
// CHECK-NEXT: %add3 = add nsw i32 %17, 1
28-
// CHECK-NEXT: %18 = sext i32 %add3 to i64
29-
// CHECK-NEXT: %19 = load i32, i32* %n.addr, align 4
30-
// CHECK-NEXT: %add4 = add nsw i32 %19, 1
31-
// CHECK-NEXT: %20 = sext i32 %add4 to i64
32-
// CHECK-NEXT: %21 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED.VLA"([7 x i32]* %vla, i64 %8, i64 7, i64 %10, i64 7), "QUAL.OSS.FIRSTPRIVATE"(i32* %i), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %18, i64 0, i64 %18, i64 7, i64 %12, i64 %13, i64 1, i64 %15, i64 %16), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %20, i64 0, i64 %20, i64 7, i64 0, i64 7) ]
14+
// CHECK store i64 %1, i64* %__vla_expr0, align 8
15+
// CHECK-NEXT store i64 %3, i64* %__vla_expr1, align 8
16+
// CHECK-NEXT %7 = load i32, i32* %i, align 4
17+
// CHECK-NEXT %add1 = add nsw i32 %7, 1
18+
// CHECK-NEXT %8 = sext i32 %add1 to i64
19+
// CHECK-NEXT %9 = add i64 %8, 1
20+
// CHECK-NEXT %10 = load i32, i32* %i, align 4
21+
// CHECK-NEXT %11 = sext i32 %10 to i64
22+
// CHECK-NEXT %12 = add i64 %11, 1
23+
// CHECK-NEXT %13 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED.VLA"([7 x i32]* %vla, i64 %1, i64 7, i64 %3, i64 7), "QUAL.OSS.FIRSTPRIVATE"(i32* %i), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %3, i64 0, i64 %3, i64 7, i64 %8, i64 %9, i64 1, i64 %11, i64 %12), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %3, i64 0, i64 %3, i64 7, i64 0, i64 7) ]
24+
// CHECK-NEXT call void @llvm.directive.region.exit(token %13)
25+
// CHECK-NEXT %14 = load i32, i32* %n.addr, align 4
26+
// CHECK-NEXT %add2 = add nsw i32 %14, 1
27+
// CHECK-NEXT %15 = zext i32 %add2 to i64
28+
// CHECK-NEXT %16 = load i32, i32* %n.addr, align 4
29+
// CHECK-NEXT %add3 = add nsw i32 %16, 1
30+
// CHECK-NEXT %17 = zext i32 %add3 to i64
31+
// CHECK-NEXT %18 = load [7 x i32]*, [7 x i32]** %p_array, align 8
32+
// CHECK-NEXT %19 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.FIRSTPRIVATE"([7 x i32]** %p_array), "QUAL.OSS.DEP.IN"([7 x i32]* %18, i64 28, i64 0, i64 28, i64 %17, i64 0, i64 %17, i64 7, i64 0, i64 7, i64 %15, i64 0, i64 %15, i64 1, i64 0, i64 1) ]
33+
// CHECK-NEXT call void @llvm.directive.region.exit(token %19)
34+
35+
int p;
36+
void foo1(int x) {
37+
int y;
38+
#pragma oss task
39+
{
40+
int vla[x][7][y][p];
41+
}
42+
#pragma oss task
43+
{
44+
int z = x + y + p;
45+
}
46+
}
47+
48+
// CHECK: %0 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* @p), "QUAL.OSS.FIRSTPRIVATE"(i32* %x.addr), "QUAL.OSS.FIRSTPRIVATE"(i32* %y) ]
49+
// CHECK: %12 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"(i32* @p), "QUAL.OSS.FIRSTPRIVATE"(i32* %x.addr), "QUAL.OSS.FIRSTPRIVATE"(i32* %y) ]
50+
51+
void foo2(int x) {
52+
int y;
53+
int array[x + 1][y + 1];
54+
#pragma oss task
55+
{ array[0][0] = 1; }
56+
}
57+
58+
// CHECK: store i64 %1, i64* %__vla_expr0, align 8
59+
// CHECK-NEXT: store i64 %3, i64* %__vla_expr1, align 8
60+
// CHECK-NEXT: %6 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.FIRSTPRIVATE.VLA"(i32* %vla, i64 %1, i64 %3) ]
61+
// CHECK-NEXT: %7 = mul nsw i64 0, %3
3362

34-
// CHECK: %26 = load [7 x i32]*, [7 x i32]** %p_array, align 8
35-
// CHECK-NEXT: %27 = load i32, i32* %n.addr, align 4
36-
// CHECK-NEXT: %add7 = add nsw i32 %27, 1
37-
// CHECK-NEXT: %28 = sext i32 %add7 to i64
38-
// CHECK-NEXT: %29 = load i32, i32* %n.addr, align 4
39-
// CHECK-NEXT: %add8 = add nsw i32 %29, 1
40-
// CHECK-NEXT: %30 = sext i32 %add8 to i64
41-
// CHECK-NEXT: %31 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.FIRSTPRIVATE"([7 x i32]** %p_array), "QUAL.OSS.DEP.IN"([7 x i32]* %26, i64 28, i64 0, i64 28, i64 %30, i64 0, i64 %30, i64 7, i64 0, i64 7, i64 %28, i64 0, i64 %28, i64 1, i64 0, i64 1) ]

0 commit comments

Comments
 (0)