Skip to content

Commit 237c2ab

Browse files
committed
CodeGen: Emit QUAL.OSS.CAPTURED
1 parent fed547d commit 237c2ab

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

clang/lib/CodeGen/CGOmpSsRuntime.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,8 @@ static LValue EmitRefAsIs(CodeGenFunction &CGF, const VarDecl *VD) {
353353
}
354354

355355
static void EmitVLADims(CodeGenFunction &CGF, llvm::Value *V, QualType Q,
356-
SmallVectorImpl<llvm::OperandBundleDef> &TaskInfo) {
356+
SmallVectorImpl<llvm::OperandBundleDef> &TaskInfo,
357+
SmallVectorImpl<llvm::Value *> &CapturedList) {
357358
// C long -> LLVM long
358359
llvm::Type *OSSArgTy = CGF.ConvertType(CGF.getContext().LongTy);
359360

@@ -364,10 +365,13 @@ static void EmitVLADims(CodeGenFunction &CGF, llvm::Value *V, QualType Q,
364365
auto VlaSize = CGF.getVLAElements1D(BaseArrayTy);
365366
llvm::Value *DimExpr = CGF.Builder.CreateSExt(VlaSize.NumElts, OSSArgTy);
366367
DimsWithValue.push_back(DimExpr);
368+
CapturedList.push_back(DimExpr);
367369
Q = BaseArrayTy->getElementType();
368370
} else if (const ConstantArrayType *BaseArrayTy = CGF.getContext().getAsConstantArrayType(Q)) {
369371
uint64_t DimSize = BaseArrayTy->getSize().getSExtValue();
370-
DimsWithValue.push_back(llvm::ConstantInt::getSigned(OSSArgTy, DimSize));
372+
llvm::Value *DimConstant = llvm::ConstantInt::getSigned(OSSArgTy, DimSize);
373+
DimsWithValue.push_back(DimConstant);
374+
CapturedList.push_back(DimConstant);
371375
Q = BaseArrayTy->getElementType();
372376
} else {
373377
llvm_unreachable("Unhandled array type");
@@ -378,7 +382,8 @@ static void EmitVLADims(CodeGenFunction &CGF, llvm::Value *V, QualType Q,
378382
}
379383

380384
static void EmitDSA(StringRef Name, CodeGenFunction &CGF, const Expr *E,
381-
SmallVectorImpl<llvm::OperandBundleDef> &TaskInfo) {
385+
SmallVectorImpl<llvm::OperandBundleDef> &TaskInfo,
386+
SmallVectorImpl<llvm::Value*> &CapturedList) {
382387
std::string Basename = Name;
383388

384389
if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
@@ -394,7 +399,7 @@ static void EmitDSA(StringRef Name, CodeGenFunction &CGF, const Expr *E,
394399
}
395400
QualType Q = VD->getType();
396401
if (Q->isVariableArrayType())
397-
EmitVLADims(CGF, V, Q, TaskInfo);
402+
EmitVLADims(CGF, V, Q, TaskInfo, CapturedList);
398403
} else if (const CXXThisExpr *ThisE = dyn_cast<CXXThisExpr>(E)) {
399404
TaskInfo.emplace_back(Basename, CGF.EmitScalarExpr(ThisE));
400405
} else {
@@ -523,15 +528,21 @@ void CGOmpSsRuntime::emitTaskCall(CodeGenFunction &CGF,
523528
llvm::Value *ExitCallee = CGM.getIntrinsic(llvm::Intrinsic::directive_region_exit);
524529
SmallVector<llvm::OperandBundleDef, 8> TaskInfo;
525530
TaskInfo.emplace_back("DIR.OSS", llvm::ConstantDataArray::getString(CGM.getLLVMContext(), "TASK"));
531+
532+
SmallVector<llvm::Value*, 4> CapturedList;
526533
for (const Expr *E : Data.DSAs.Shareds) {
527-
EmitDSA("QUAL.OSS.SHARED", CGF, E, TaskInfo);
534+
EmitDSA("QUAL.OSS.SHARED", CGF, E, TaskInfo, CapturedList);
528535
}
529536
for (const Expr *E : Data.DSAs.Privates) {
530-
EmitDSA("QUAL.OSS.PRIVATE", CGF, E, TaskInfo);
537+
EmitDSA("QUAL.OSS.PRIVATE", CGF, E, TaskInfo, CapturedList);
531538
}
532539
for (const Expr *E : Data.DSAs.Firstprivates) {
533-
EmitDSA("QUAL.OSS.FIRSTPRIVATE", CGF, E, TaskInfo);
540+
EmitDSA("QUAL.OSS.FIRSTPRIVATE", CGF, E, TaskInfo, CapturedList);
534541
}
542+
543+
if (!CapturedList.empty())
544+
TaskInfo.emplace_back("QUAL.OSS.CAPTURED", CapturedList);
545+
535546
for (const OSSDepDataTy &Dep : Data.Deps.Ins) {
536547
EmitDependency("QUAL.OSS.DEP.IN", CGF, Dep, TaskInfo);
537548
}

clang/test/OmpSs/IR/task_depend_array_section.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ void foo(int x) {
2727
// CHECK: %3 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"([10 x [10 x i32*]]* %aFix), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay, i64 80, i64 0, i64 80, i64 10, i64 0, i64 10), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay1, i64 80, i64 0, i64 80, i64 10, i64 1, i64 10), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay2, i64 80, i64 0, i64 80, i64 10, i64 0, i64 2), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay3, i64 80, i64 0, i64 80, i64 10, i64 3, i64 7) ]
2828

2929
// CHECK: %4 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"([10 x [10 x i32*]]* %aFix), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay4, i64 80, i64 0, i64 80, i64 10, i64 5, i64 6), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay5, i64 80, i64 8, i64 80, i64 10, i64 5, i64 6), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay6, i64 80, i64 0, i64 16, i64 10, i64 5, i64 6), "QUAL.OSS.DEP.IN"([10 x i32*]* %arraydecay7, i64 80, i64 24, i64 56, i64 10, i64 5, i64 6) ]
30-
// CHECK-NEXT: %5 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"([7 x i32]* %vla), "QUAL.OSS.VLA.DIMS"([7 x i32]* %vla, i64 %1, i64 7), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 0, i64 %1), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 1, i64 %1), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 0, i64 2), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 3, i64 7) ]
31-
// CHECK-NEXT: %6 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"([7 x i32]* %vla), "QUAL.OSS.VLA.DIMS"([7 x i32]* %vla, i64 %1, i64 7), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 5, i64 6), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 4, i64 28, i64 %1, i64 5, i64 6), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 8, i64 %1, i64 5, i64 6), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 12, i64 28, i64 %1, i64 5, i64 6) ]
30+
// CHECK-NEXT: %5 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"([7 x i32]* %vla), "QUAL.OSS.VLA.DIMS"([7 x i32]* %vla, i64 %1, i64 7), "QUAL.OSS.CAPTURED"(i64 %1, i64 7), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 0, i64 %1), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 1, i64 %1), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 0, i64 2), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 3, i64 7) ]
31+
// CHECK-NEXT: %6 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.SHARED"([7 x i32]* %vla), "QUAL.OSS.VLA.DIMS"([7 x i32]* %vla, i64 %1, i64 7), "QUAL.OSS.CAPTURED"(i64 %1, i64 7), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 28, i64 %1, i64 5, i64 6), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 4, i64 28, i64 %1, i64 5, i64 6), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 0, i64 8, i64 %1, i64 5, i64 6), "QUAL.OSS.DEP.IN"([7 x i32]* %vla, i64 28, i64 12, i64 28, i64 %1, i64 5, i64 6) ]
3232

3333
void bar() {
3434
int **p;

clang/test/OmpSs/IR/task_vla.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ void foo(int n) {
2020
// CHECK-NEXT %10 = load i32, i32* %i, align 4
2121
// CHECK-NEXT %11 = sext i32 %10 to i64
2222
// 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), "QUAL.OSS.VLA.DIMS"([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) ]
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), "QUAL.OSS.VLA.DIMS"([7 x i32]* %vla, i64 %1, i64 7, i64 %3, i64 7), "QUAL.OSS.FIRSTPRIVATE"(i32* %i), "QUAL.OSS.CAPTURED"(i64 %1, i64 7, i64 %3, i64 7), "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) ]
2424
// CHECK-NEXT call void @llvm.directive.region.exit(token %13)
2525
// CHECK-NEXT %14 = load i32, i32* %n.addr, align 4
2626
// CHECK-NEXT %add2 = add nsw i32 %14, 1
@@ -55,8 +55,5 @@ void foo2(int x) {
5555
{ array[0][0] = 1; }
5656
}
5757

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"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3) ]
61-
// CHECK-NEXT: %7 = mul nsw i64 0, %3
58+
// CHECK: %6 = call token @llvm.directive.region.entry() [ "DIR.OSS"([5 x i8] c"TASK\00"), "QUAL.OSS.FIRSTPRIVATE"(i32* %vla), "QUAL.OSS.VLA.DIMS"(i32* %vla, i64 %1, i64 %3), "QUAL.OSS.CAPTURED"(i64 %1, i64 %3) ]
6259

0 commit comments

Comments
 (0)