Skip to content

Commit 76e6c8d

Browse files
chandraghaleChandra Ghale
andauthored
Codegen changes for strict modifier with grainsize/num_tasks of taskloop construct (#117196)
Initial parsing/sema for 'strict' modifier with 'num_tasks' and ‘grainsize’ clause is present in these commits [grainsize_parsing](ab9eac7) and [num_tasks_parsing](56c1660#diff-4184486638e85284c3a2c961a81e7752231022daf97e411007c13a6732b50db9R6545) . However, this implementation appears incomplete as it lacks code generation support. A runtime patch was introduced in this runtime commit [runtime_patch](540007b#diff-5e95f9319910d6965d09c301359dbe6b23f3eef5ce4d262ef2c2d2137875b5c4R374) , which adds a new API, _kmpc_taskloop_5, to accommodate the strict modifier.  In this patch I have added codegen support. When the strict modifier is present alongside the grainsize or num_tasks clauses of taskloop construct, the code now emits a call to _kmpc_taskloop_5, which includes an additional parameter of type i32 with the value 1 to indicate the strict modifier. If the strict modifier is not present, it falls back to the existing _kmpc_taskloop API call. --------- Co-authored-by: Chandra Ghale <[email protected]>
1 parent 3327195 commit 76e6c8d

File tree

5 files changed

+185
-6
lines changed

5 files changed

+185
-6
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4666,7 +4666,7 @@ void CGOpenMPRuntime::emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
46664666
CGF.getContext().VoidPtrTy);
46674667
}
46684668
enum { NoSchedule = 0, Grainsize = 1, NumTasks = 2 };
4669-
llvm::Value *TaskArgs[] = {
4669+
llvm::SmallVector<llvm::Value *, 12> TaskArgs{
46704670
UpLoc,
46714671
ThreadID,
46724672
Result.NewTask,
@@ -4683,12 +4683,18 @@ void CGOpenMPRuntime::emitTaskLoopCall(CodeGenFunction &CGF, SourceLocation Loc,
46834683
Data.Schedule.getPointer()
46844684
? CGF.Builder.CreateIntCast(Data.Schedule.getPointer(), CGF.Int64Ty,
46854685
/*isSigned=*/false)
4686-
: llvm::ConstantInt::get(CGF.Int64Ty, /*V=*/0),
4687-
Result.TaskDupFn ? CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
4688-
Result.TaskDupFn, CGF.VoidPtrTy)
4689-
: llvm::ConstantPointerNull::get(CGF.VoidPtrTy)};
4686+
: llvm::ConstantInt::get(CGF.Int64Ty, /*V=*/0)};
4687+
if (Data.HasModifier)
4688+
TaskArgs.push_back(llvm::ConstantInt::get(CGF.Int32Ty, 1));
4689+
4690+
TaskArgs.push_back(Result.TaskDupFn
4691+
? CGF.Builder.CreatePointerBitCastOrAddrSpaceCast(
4692+
Result.TaskDupFn, CGF.VoidPtrTy)
4693+
: llvm::ConstantPointerNull::get(CGF.VoidPtrTy));
46904694
CGF.EmitRuntimeCall(OMPBuilder.getOrCreateRuntimeFunction(
4691-
CGM.getModule(), OMPRTL___kmpc_taskloop),
4695+
CGM.getModule(), Data.HasModifier
4696+
? OMPRTL___kmpc_taskloop_5
4697+
: OMPRTL___kmpc_taskloop),
46924698
TaskArgs);
46934699
}
46944700

clang/lib/CodeGen/CGOpenMPRuntime.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ struct OMPTaskDataTy final {
122122
bool IsReductionWithTaskMod = false;
123123
bool IsWorksharingReduction = false;
124124
bool HasNowaitClause = false;
125+
bool HasModifier = false;
125126
};
126127

127128
/// Class intended to support codegen of all kind of the reduction clauses.

clang/lib/CodeGen/CGStmtOpenMP.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7831,10 +7831,14 @@ void CodeGenFunction::EmitOMPTaskLoopBasedDirective(const OMPLoopDirective &S) {
78317831
// grainsize clause
78327832
Data.Schedule.setInt(/*IntVal=*/false);
78337833
Data.Schedule.setPointer(EmitScalarExpr(Clause->getGrainsize()));
7834+
Data.HasModifier =
7835+
(Clause->getModifier() == OMPC_GRAINSIZE_strict) ? true : false;
78347836
} else if (const auto *Clause = S.getSingleClause<OMPNumTasksClause>()) {
78357837
// num_tasks clause
78367838
Data.Schedule.setInt(/*IntVal=*/true);
78377839
Data.Schedule.setPointer(EmitScalarExpr(Clause->getNumTasks()));
7840+
Data.HasModifier =
7841+
(Clause->getModifier() == OMPC_NUMTASKS_strict) ? true : false;
78387842
}
78397843

78407844
auto &&BodyGen = [CS, &S](CodeGenFunction &CGF, PrePostActionTy &) {
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --prefix-filecheck-ir-name _ --version 5
2+
// RUN: %clang_cc1 -fopenmp -O1 -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK
3+
// expected-no-diagnostics
4+
#ifndef HEADER
5+
#define HEADER
6+
7+
int main(int argc, char **argv) {
8+
#pragma omp task
9+
#pragma omp master taskloop priority(argc)
10+
for (int i = 0; i < 10; ++i)
11+
;
12+
#pragma omp master taskloop nogroup grainsize(strict:argc)
13+
for (int i = 0; i < 10; ++i)
14+
;
15+
int i;
16+
#pragma omp master taskloop if(argc) shared(argc, argv) collapse(2) num_tasks(strict: 4)
17+
for (i = 0; i < argc; ++i)
18+
for (int j = argc; j < argv[argc][argc]; ++j)
19+
;
20+
#pragma omp master taskloop
21+
for (int i = 0; i < 10; ++i) {
22+
#pragma omp cancel taskgroup
23+
#pragma omp cancellation point taskgroup
24+
}
25+
}
26+
struct S {
27+
int a;
28+
S(int c) {
29+
#pragma omp master taskloop shared(c) num_tasks(strict:a)
30+
for (a = 0; a < c; ++a)
31+
;
32+
}
33+
} s(1);
34+
35+
#endif
36+
37+
// CHECK-LABEL: define noundef i32 @main(
38+
// CHECK-SAME: i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
39+
// CHECK-NEXT: [[ENTRY:.*:]]
40+
// CHECK-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4
41+
// CHECK-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 8
42+
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @__kmpc_global_thread_num(ptr nonnull @[[GLOB1:[0-9]+]])
43+
// CHECK-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3:![0-9]+]]
44+
// CHECK-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 8, !tbaa [[TBAA7:![0-9]+]]
45+
// CHECK-NEXT: [[TMP1:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 48, i64 1, ptr nonnull @.omp_task_entry..2)
46+
// CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP1]], i64 40
47+
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]]
48+
// CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP2]], align 8, !tbaa [[TBAA9:![0-9]+]]
49+
// CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @__kmpc_omp_task(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr [[TMP1]])
50+
// CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
51+
// CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP5]], 0
52+
// CHECK-NEXT: br i1 [[DOTNOT]], label %[[OMP_IF_END:.*]], label %[[OMP_IF_THEN:.*]]
53+
// CHECK: [[OMP_IF_THEN]]:
54+
// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]]
55+
// CHECK-NEXT: [[TMP7:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 1, ptr nonnull @.omp_task_entry..4)
56+
// CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 40
57+
// CHECK-NEXT: store i64 0, ptr [[TMP8]], align 8, !tbaa [[TBAA13:![0-9]+]]
58+
// CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 48
59+
// CHECK-NEXT: store i64 9, ptr [[TMP9]], align 8, !tbaa [[TBAA13]]
60+
// CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 56
61+
// CHECK-NEXT: store i64 1, ptr [[TMP10]], align 8, !tbaa [[TBAA13]]
62+
// CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 72
63+
// CHECK-NEXT: store i64 0, ptr [[TMP11]], align 8
64+
// CHECK-NEXT: [[TMP12:%.*]] = zext i32 [[TMP6]] to i64
65+
// CHECK-NEXT: tail call void @__kmpc_taskloop_5(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr [[TMP7]], i32 1, ptr nonnull [[TMP8]], ptr nonnull [[TMP9]], i64 1, i32 1, i32 1, i64 [[TMP12]], i32 1, ptr null) #[[ATTR1:[0-9]+]]
66+
// CHECK-NEXT: tail call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
67+
// CHECK-NEXT: br label %[[OMP_IF_END]]
68+
// CHECK: [[OMP_IF_END]]:
69+
// CHECK-NEXT: [[TMP13:%.*]] = tail call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
70+
// CHECK-NEXT: [[DOTNOT22:%.*]] = icmp eq i32 [[TMP13]], 0
71+
// CHECK-NEXT: br i1 [[DOTNOT22]], label %[[OMP_IF_END17:.*]], label %[[OMP_IF_THEN2:.*]]
72+
// CHECK: [[OMP_IF_THEN2]]:
73+
// CHECK-NEXT: tail call void @__kmpc_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
74+
// CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]]
75+
// CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr [[ARGV_ADDR]], align 8, !tbaa [[TBAA7]]
76+
// CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64
77+
// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[TMP15]], i64 [[IDXPROM]]
78+
// CHECK-NEXT: [[TMP16:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7]]
79+
// CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i8, ptr [[TMP16]], i64 [[IDXPROM]]
80+
// CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr [[ARRAYIDX9]], align 1, !tbaa [[TBAA15:![0-9]+]]
81+
// CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP17]] to i32
82+
// CHECK-NEXT: [[SUB12:%.*]] = sub i32 [[CONV]], [[TMP14]]
83+
// CHECK-NEXT: [[CONV15:%.*]] = zext i32 [[SUB12]] to i64
84+
// CHECK-NEXT: [[MUL:%.*]] = mul nsw i64 [[CONV15]], [[IDXPROM]]
85+
// CHECK-NEXT: [[SUB16:%.*]] = add nsw i64 [[MUL]], -1
86+
// CHECK-NEXT: [[TMP18:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 16, ptr nonnull @.omp_task_entry..6)
87+
// CHECK-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 8, !tbaa [[TBAA16:![0-9]+]]
88+
// CHECK-NEXT: store ptr [[ARGC_ADDR]], ptr [[TMP19]], align 8, !tbaa [[TBAA7]]
89+
// CHECK-NEXT: [[AGG_CAPTURED3_SROA_2_0__SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[TMP19]], i64 8
90+
// CHECK-NEXT: store ptr [[ARGV_ADDR]], ptr [[AGG_CAPTURED3_SROA_2_0__SROA_IDX]], align 8, !tbaa [[TBAA7]]
91+
// CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]]
92+
// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP20]], 0
93+
// CHECK-NEXT: [[TMP21:%.*]] = sext i1 [[TOBOOL]] to i32
94+
// CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 40
95+
// CHECK-NEXT: store i64 0, ptr [[TMP22]], align 8, !tbaa [[TBAA13]]
96+
// CHECK-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 48
97+
// CHECK-NEXT: store i64 [[SUB16]], ptr [[TMP23]], align 8, !tbaa [[TBAA13]]
98+
// CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 56
99+
// CHECK-NEXT: store i64 1, ptr [[TMP24]], align 8, !tbaa [[TBAA13]]
100+
// CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 72
101+
// CHECK-NEXT: store i64 0, ptr [[TMP25]], align 8
102+
// CHECK-NEXT: call void @__kmpc_taskloop_5(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr nonnull [[TMP18]], i32 [[TMP21]], ptr nonnull [[TMP22]], ptr nonnull [[TMP23]], i64 1, i32 1, i32 2, i64 4, i32 1, ptr null) #[[ATTR1]]
103+
// CHECK-NEXT: call void @__kmpc_end_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
104+
// CHECK-NEXT: call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
105+
// CHECK-NEXT: br label %[[OMP_IF_END17]]
106+
// CHECK: [[OMP_IF_END17]]:
107+
// CHECK-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
108+
// CHECK-NEXT: [[DOTNOT23:%.*]] = icmp eq i32 [[TMP26]], 0
109+
// CHECK-NEXT: br i1 [[DOTNOT23]], label %[[OMP_IF_END21:.*]], label %[[OMP_IF_THEN18:.*]]
110+
// CHECK: [[OMP_IF_THEN18]]:
111+
// CHECK-NEXT: call void @__kmpc_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
112+
// CHECK-NEXT: [[TMP27:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 1, ptr nonnull @.omp_task_entry..8)
113+
// CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 40
114+
// CHECK-NEXT: store i64 0, ptr [[TMP28]], align 8, !tbaa [[TBAA13]]
115+
// CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 48
116+
// CHECK-NEXT: store i64 9, ptr [[TMP29]], align 8, !tbaa [[TBAA13]]
117+
// CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 56
118+
// CHECK-NEXT: store i64 1, ptr [[TMP30]], align 8, !tbaa [[TBAA13]]
119+
// CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 72
120+
// CHECK-NEXT: store i64 0, ptr [[TMP31]], align 8
121+
// CHECK-NEXT: call void @__kmpc_taskloop(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr [[TMP27]], i32 1, ptr nonnull [[TMP28]], ptr nonnull [[TMP29]], i64 1, i32 1, i32 0, i64 0, ptr null)
122+
// CHECK-NEXT: call void @__kmpc_end_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
123+
// CHECK-NEXT: call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
124+
// CHECK-NEXT: br label %[[OMP_IF_END21]]
125+
// CHECK: [[OMP_IF_END21]]:
126+
// CHECK-NEXT: ret i32 0
127+
//
128+
//
129+
//
130+
// CHECK-LABEL: define linkonce_odr void @_ZN1SC2Ei(
131+
// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[C:%.*]]) unnamed_addr #[[ATTR6:[0-9]+]] align 2 {
132+
// CHECK-NEXT: [[ENTRY:.*:]]
133+
// CHECK-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4
134+
// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @__kmpc_global_thread_num(ptr nonnull @[[GLOB1]])
135+
// CHECK-NEXT: store i32 [[C]], ptr [[C_ADDR]], align 4, !tbaa [[TBAA3]]
136+
// CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
137+
// CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP1]], 0
138+
// CHECK-NEXT: br i1 [[DOTNOT]], label %[[OMP_IF_END:.*]], label %[[OMP_IF_THEN:.*]]
139+
// CHECK: [[OMP_IF_THEN]]:
140+
// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[THIS]], align 4, !tbaa [[TBAA27:![0-9]+]]
141+
// CHECK-NEXT: tail call void @__kmpc_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
142+
// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[C_ADDR]], align 4, !tbaa [[TBAA3]]
143+
// CHECK-NEXT: [[SUB4:%.*]] = add nsw i32 [[TMP3]], -1
144+
// CHECK-NEXT: [[TMP4:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 16, ptr nonnull @.omp_task_entry..10)
145+
// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !tbaa [[TBAA16]]
146+
// CHECK-NEXT: store ptr [[THIS]], ptr [[TMP5]], align 8, !tbaa [[TBAA7]]
147+
// CHECK-NEXT: [[AGG_CAPTURED_SROA_2_0__SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[TMP5]], i64 8
148+
// CHECK-NEXT: store ptr [[C_ADDR]], ptr [[AGG_CAPTURED_SROA_2_0__SROA_IDX]], align 8, !tbaa [[TBAA7]]
149+
// CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 40
150+
// CHECK-NEXT: store i64 0, ptr [[TMP6]], align 8, !tbaa [[TBAA13]]
151+
// CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 48
152+
// CHECK-NEXT: [[CONV:%.*]] = sext i32 [[SUB4]] to i64
153+
// CHECK-NEXT: store i64 [[CONV]], ptr [[TMP7]], align 8, !tbaa [[TBAA13]]
154+
// CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 56
155+
// CHECK-NEXT: store i64 1, ptr [[TMP8]], align 8, !tbaa [[TBAA13]]
156+
// CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 72
157+
// CHECK-NEXT: store i64 0, ptr [[TMP9]], align 8
158+
// CHECK-NEXT: [[TMP10:%.*]] = zext i32 [[TMP2]] to i64
159+
// CHECK-NEXT: call void @__kmpc_taskloop_5(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr nonnull [[TMP4]], i32 1, ptr nonnull [[TMP6]], ptr nonnull [[TMP7]], i64 1, i32 1, i32 2, i64 [[TMP10]], i32 1, ptr null) #[[ATTR1]]
160+
// CHECK-NEXT: call void @__kmpc_end_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
161+
// CHECK-NEXT: call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]])
162+
// CHECK-NEXT: br label %[[OMP_IF_END]]
163+
// CHECK: [[OMP_IF_END]]:
164+
// CHECK-NEXT: ret void
165+

llvm/include/llvm/Frontend/OpenMP/OMPKinds.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,9 @@ __OMP_RTL(__kmpc_omp_task_with_deps, false, Int32, IdentPtr, Int32,
365365
__OMP_RTL(__kmpc_taskloop, false, Void, IdentPtr, /* Int */ Int32, VoidPtr,
366366
/* Int */ Int32, Int64Ptr, Int64Ptr, Int64, /* Int */ Int32,
367367
/* Int */ Int32, Int64, VoidPtr)
368+
__OMP_RTL(__kmpc_taskloop_5, false, Void, IdentPtr, /* Int */ Int32, VoidPtr,
369+
/* Int */ Int32, Int64Ptr, Int64Ptr, Int64, /* Int */ Int32,
370+
/* Int */ Int32, Int64, Int32, VoidPtr)
368371
__OMP_RTL(__kmpc_omp_target_task_alloc, false, /* kmp_task_t */ VoidPtr,
369372
IdentPtr, Int32, Int32, SizeTy, SizeTy, TaskRoutineEntryPtr, Int64)
370373
__OMP_RTL(__kmpc_taskred_modifier_init, false, /* kmp_taskgroup */ VoidPtr,

0 commit comments

Comments
 (0)