[OPNEMP]Allow grainsize clause in combined task-based directives.
The expression of the grainsize clause must be captured in the combined task-based directives, like 'parallel master taskloop' directive. llvm-svn: 374810
This commit is contained in:
parent
6362a2168b
commit
b9c55e2760
|
|
@ -5268,7 +5268,7 @@ public:
|
||||||
/// \endcode
|
/// \endcode
|
||||||
/// In this example directive '#pragma omp taskloop' has clause 'grainsize'
|
/// In this example directive '#pragma omp taskloop' has clause 'grainsize'
|
||||||
/// with single expression '4'.
|
/// with single expression '4'.
|
||||||
class OMPGrainsizeClause : public OMPClause {
|
class OMPGrainsizeClause : public OMPClause, public OMPClauseWithPreInit {
|
||||||
friend class OMPClauseReader;
|
friend class OMPClauseReader;
|
||||||
|
|
||||||
/// Location of '('.
|
/// Location of '('.
|
||||||
|
|
@ -5284,16 +5284,23 @@ public:
|
||||||
/// Build 'grainsize' clause.
|
/// Build 'grainsize' clause.
|
||||||
///
|
///
|
||||||
/// \param Size Expression associated with this clause.
|
/// \param Size Expression associated with this clause.
|
||||||
|
/// \param HelperSize Helper grainsize for the construct.
|
||||||
|
/// \param CaptureRegion Innermost OpenMP region where expressions in this
|
||||||
|
/// clause must be captured.
|
||||||
/// \param StartLoc Starting location of the clause.
|
/// \param StartLoc Starting location of the clause.
|
||||||
/// \param EndLoc Ending location of the clause.
|
/// \param EndLoc Ending location of the clause.
|
||||||
OMPGrainsizeClause(Expr *Size, SourceLocation StartLoc,
|
OMPGrainsizeClause(Expr *Size, Stmt *HelperSize,
|
||||||
|
OpenMPDirectiveKind CaptureRegion, SourceLocation StartLoc,
|
||||||
SourceLocation LParenLoc, SourceLocation EndLoc)
|
SourceLocation LParenLoc, SourceLocation EndLoc)
|
||||||
: OMPClause(OMPC_grainsize, StartLoc, EndLoc), LParenLoc(LParenLoc),
|
: OMPClause(OMPC_grainsize, StartLoc, EndLoc), OMPClauseWithPreInit(this),
|
||||||
Grainsize(Size) {}
|
LParenLoc(LParenLoc), Grainsize(Size) {
|
||||||
|
setPreInitStmt(HelperSize, CaptureRegion);
|
||||||
|
}
|
||||||
|
|
||||||
/// Build an empty clause.
|
/// Build an empty clause.
|
||||||
explicit OMPGrainsizeClause()
|
explicit OMPGrainsizeClause()
|
||||||
: OMPClause(OMPC_grainsize, SourceLocation(), SourceLocation()) {}
|
: OMPClause(OMPC_grainsize, SourceLocation(), SourceLocation()),
|
||||||
|
OMPClauseWithPreInit(this) {}
|
||||||
|
|
||||||
/// Sets the location of '('.
|
/// Sets the location of '('.
|
||||||
void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
|
void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; }
|
||||||
|
|
@ -5310,11 +5317,10 @@ public:
|
||||||
return const_child_range(&Grainsize, &Grainsize + 1);
|
return const_child_range(&Grainsize, &Grainsize + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
child_range used_children() {
|
child_range used_children();
|
||||||
return child_range(child_iterator(), child_iterator());
|
|
||||||
}
|
|
||||||
const_child_range used_children() const {
|
const_child_range used_children() const {
|
||||||
return const_child_range(const_child_iterator(), const_child_iterator());
|
auto Children = const_cast<OMPGrainsizeClause *>(this)->used_children();
|
||||||
|
return const_child_range(Children.begin(), Children.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool classof(const OMPClause *T) {
|
static bool classof(const OMPClause *T) {
|
||||||
|
|
|
||||||
|
|
@ -3275,6 +3275,7 @@ bool RecursiveASTVisitor<Derived>::VisitOMPPriorityClause(
|
||||||
template <typename Derived>
|
template <typename Derived>
|
||||||
bool RecursiveASTVisitor<Derived>::VisitOMPGrainsizeClause(
|
bool RecursiveASTVisitor<Derived>::VisitOMPGrainsizeClause(
|
||||||
OMPGrainsizeClause *C) {
|
OMPGrainsizeClause *C) {
|
||||||
|
TRY_TO(VisitOMPClauseWithPreInit(C));
|
||||||
TRY_TO(TraverseStmt(C->getGrainsize()));
|
TRY_TO(TraverseStmt(C->getGrainsize()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,8 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {
|
||||||
return static_cast<const OMPThreadLimitClause *>(C);
|
return static_cast<const OMPThreadLimitClause *>(C);
|
||||||
case OMPC_device:
|
case OMPC_device:
|
||||||
return static_cast<const OMPDeviceClause *>(C);
|
return static_cast<const OMPDeviceClause *>(C);
|
||||||
|
case OMPC_grainsize:
|
||||||
|
return static_cast<const OMPGrainsizeClause *>(C);
|
||||||
case OMPC_default:
|
case OMPC_default:
|
||||||
case OMPC_proc_bind:
|
case OMPC_proc_bind:
|
||||||
case OMPC_final:
|
case OMPC_final:
|
||||||
|
|
@ -113,7 +115,6 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) {
|
||||||
case OMPC_simd:
|
case OMPC_simd:
|
||||||
case OMPC_map:
|
case OMPC_map:
|
||||||
case OMPC_priority:
|
case OMPC_priority:
|
||||||
case OMPC_grainsize:
|
|
||||||
case OMPC_nogroup:
|
case OMPC_nogroup:
|
||||||
case OMPC_num_tasks:
|
case OMPC_num_tasks:
|
||||||
case OMPC_hint:
|
case OMPC_hint:
|
||||||
|
|
@ -234,6 +235,12 @@ OMPClause::child_range OMPIfClause::used_children() {
|
||||||
return child_range(&Condition, &Condition + 1);
|
return child_range(&Condition, &Condition + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OMPClause::child_range OMPGrainsizeClause::used_children() {
|
||||||
|
if (Stmt **C = getAddrOfExprAsWritten(getPreInitStmt()))
|
||||||
|
return child_range(C, C + 1);
|
||||||
|
return child_range(&Grainsize, &Grainsize + 1);
|
||||||
|
}
|
||||||
|
|
||||||
OMPOrderedClause *OMPOrderedClause::Create(const ASTContext &C, Expr *Num,
|
OMPOrderedClause *OMPOrderedClause::Create(const ASTContext &C, Expr *Num,
|
||||||
unsigned NumLoops,
|
unsigned NumLoops,
|
||||||
SourceLocation StartLoc,
|
SourceLocation StartLoc,
|
||||||
|
|
|
||||||
|
|
@ -740,6 +740,7 @@ void OMPClauseProfiler::VisitOMPPriorityClause(const OMPPriorityClause *C) {
|
||||||
Profiler->VisitStmt(C->getPriority());
|
Profiler->VisitStmt(C->getPriority());
|
||||||
}
|
}
|
||||||
void OMPClauseProfiler::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
|
void OMPClauseProfiler::VisitOMPGrainsizeClause(const OMPGrainsizeClause *C) {
|
||||||
|
VistOMPClauseWithPreInit(C);
|
||||||
if (C->getGrainsize())
|
if (C->getGrainsize())
|
||||||
Profiler->VisitStmt(C->getGrainsize());
|
Profiler->VisitStmt(C->getGrainsize());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4590,12 +4590,16 @@ StmtResult Sema::ActOnOpenMPExecutableDirective(
|
||||||
continue;
|
continue;
|
||||||
case OMPC_schedule:
|
case OMPC_schedule:
|
||||||
break;
|
break;
|
||||||
|
case OMPC_grainsize:
|
||||||
|
// Do not analyze if no parent parallel directive.
|
||||||
|
if (isOpenMPParallelDirective(DSAStack->getCurrentDirective()))
|
||||||
|
break;
|
||||||
|
continue;
|
||||||
case OMPC_ordered:
|
case OMPC_ordered:
|
||||||
case OMPC_device:
|
case OMPC_device:
|
||||||
case OMPC_num_teams:
|
case OMPC_num_teams:
|
||||||
case OMPC_thread_limit:
|
case OMPC_thread_limit:
|
||||||
case OMPC_priority:
|
case OMPC_priority:
|
||||||
case OMPC_grainsize:
|
|
||||||
case OMPC_num_tasks:
|
case OMPC_num_tasks:
|
||||||
case OMPC_hint:
|
case OMPC_hint:
|
||||||
case OMPC_collapse:
|
case OMPC_collapse:
|
||||||
|
|
@ -10773,6 +10777,74 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
llvm_unreachable("Unknown OpenMP directive");
|
llvm_unreachable("Unknown OpenMP directive");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case OMPC_grainsize:
|
||||||
|
switch (DKind) {
|
||||||
|
case OMPD_task:
|
||||||
|
case OMPD_taskloop:
|
||||||
|
case OMPD_taskloop_simd:
|
||||||
|
case OMPD_master_taskloop:
|
||||||
|
break;
|
||||||
|
case OMPD_parallel_master_taskloop:
|
||||||
|
CaptureRegion = OMPD_parallel;
|
||||||
|
break;
|
||||||
|
case OMPD_target_update:
|
||||||
|
case OMPD_target_enter_data:
|
||||||
|
case OMPD_target_exit_data:
|
||||||
|
case OMPD_target:
|
||||||
|
case OMPD_target_simd:
|
||||||
|
case OMPD_target_teams:
|
||||||
|
case OMPD_target_parallel:
|
||||||
|
case OMPD_target_teams_distribute:
|
||||||
|
case OMPD_target_teams_distribute_simd:
|
||||||
|
case OMPD_target_parallel_for:
|
||||||
|
case OMPD_target_parallel_for_simd:
|
||||||
|
case OMPD_target_teams_distribute_parallel_for:
|
||||||
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
||||||
|
case OMPD_target_data:
|
||||||
|
case OMPD_teams_distribute_parallel_for:
|
||||||
|
case OMPD_teams_distribute_parallel_for_simd:
|
||||||
|
case OMPD_teams:
|
||||||
|
case OMPD_teams_distribute:
|
||||||
|
case OMPD_teams_distribute_simd:
|
||||||
|
case OMPD_distribute_parallel_for:
|
||||||
|
case OMPD_distribute_parallel_for_simd:
|
||||||
|
case OMPD_cancel:
|
||||||
|
case OMPD_parallel:
|
||||||
|
case OMPD_parallel_sections:
|
||||||
|
case OMPD_parallel_for:
|
||||||
|
case OMPD_parallel_for_simd:
|
||||||
|
case OMPD_threadprivate:
|
||||||
|
case OMPD_allocate:
|
||||||
|
case OMPD_taskyield:
|
||||||
|
case OMPD_barrier:
|
||||||
|
case OMPD_taskwait:
|
||||||
|
case OMPD_cancellation_point:
|
||||||
|
case OMPD_flush:
|
||||||
|
case OMPD_declare_reduction:
|
||||||
|
case OMPD_declare_mapper:
|
||||||
|
case OMPD_declare_simd:
|
||||||
|
case OMPD_declare_variant:
|
||||||
|
case OMPD_declare_target:
|
||||||
|
case OMPD_end_declare_target:
|
||||||
|
case OMPD_simd:
|
||||||
|
case OMPD_for:
|
||||||
|
case OMPD_for_simd:
|
||||||
|
case OMPD_sections:
|
||||||
|
case OMPD_section:
|
||||||
|
case OMPD_single:
|
||||||
|
case OMPD_master:
|
||||||
|
case OMPD_critical:
|
||||||
|
case OMPD_taskgroup:
|
||||||
|
case OMPD_distribute:
|
||||||
|
case OMPD_ordered:
|
||||||
|
case OMPD_atomic:
|
||||||
|
case OMPD_distribute_simd:
|
||||||
|
case OMPD_requires:
|
||||||
|
llvm_unreachable("Unexpected OpenMP directive with grainsize-clause");
|
||||||
|
case OMPD_unknown:
|
||||||
|
llvm_unreachable("Unknown OpenMP directive");
|
||||||
|
}
|
||||||
|
break;
|
||||||
case OMPC_firstprivate:
|
case OMPC_firstprivate:
|
||||||
case OMPC_lastprivate:
|
case OMPC_lastprivate:
|
||||||
case OMPC_reduction:
|
case OMPC_reduction:
|
||||||
|
|
@ -10808,7 +10880,6 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
||||||
case OMPC_simd:
|
case OMPC_simd:
|
||||||
case OMPC_map:
|
case OMPC_map:
|
||||||
case OMPC_priority:
|
case OMPC_priority:
|
||||||
case OMPC_grainsize:
|
|
||||||
case OMPC_nogroup:
|
case OMPC_nogroup:
|
||||||
case OMPC_num_tasks:
|
case OMPC_num_tasks:
|
||||||
case OMPC_hint:
|
case OMPC_hint:
|
||||||
|
|
@ -10926,9 +10997,12 @@ ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc,
|
||||||
return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser);
|
return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isNonNegativeIntegerValue(Expr *&ValExpr, Sema &SemaRef,
|
static bool
|
||||||
OpenMPClauseKind CKind,
|
isNonNegativeIntegerValue(Expr *&ValExpr, Sema &SemaRef, OpenMPClauseKind CKind,
|
||||||
bool StrictlyPositive) {
|
bool StrictlyPositive, bool BuildCapture = false,
|
||||||
|
OpenMPDirectiveKind DKind = OMPD_unknown,
|
||||||
|
OpenMPDirectiveKind *CaptureRegion = nullptr,
|
||||||
|
Stmt **HelperValStmt = nullptr) {
|
||||||
if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() &&
|
if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() &&
|
||||||
!ValExpr->isInstantiationDependent()) {
|
!ValExpr->isInstantiationDependent()) {
|
||||||
SourceLocation Loc = ValExpr->getExprLoc();
|
SourceLocation Loc = ValExpr->getExprLoc();
|
||||||
|
|
@ -10949,6 +11023,16 @@ static bool isNonNegativeIntegerValue(Expr *&ValExpr, Sema &SemaRef,
|
||||||
<< ValExpr->getSourceRange();
|
<< ValExpr->getSourceRange();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!BuildCapture)
|
||||||
|
return true;
|
||||||
|
*CaptureRegion = getOpenMPCaptureRegionForClause(DKind, CKind);
|
||||||
|
if (*CaptureRegion != OMPD_unknown &&
|
||||||
|
!SemaRef.CurContext->isDependentContext()) {
|
||||||
|
ValExpr = SemaRef.MakeFullExpr(ValExpr).get();
|
||||||
|
llvm::MapVector<const Expr *, DeclRefExpr *> Captures;
|
||||||
|
ValExpr = tryBuildCapture(SemaRef, ValExpr, Captures).get();
|
||||||
|
*HelperValStmt = buildPreInits(SemaRef.Context, Captures);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -15847,15 +15931,20 @@ OMPClause *Sema::ActOnOpenMPGrainsizeClause(Expr *Grainsize,
|
||||||
SourceLocation LParenLoc,
|
SourceLocation LParenLoc,
|
||||||
SourceLocation EndLoc) {
|
SourceLocation EndLoc) {
|
||||||
Expr *ValExpr = Grainsize;
|
Expr *ValExpr = Grainsize;
|
||||||
|
Stmt *HelperValStmt = nullptr;
|
||||||
|
OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
|
||||||
|
|
||||||
// OpenMP [2.9.2, taskloop Constrcut]
|
// OpenMP [2.9.2, taskloop Constrcut]
|
||||||
// The parameter of the grainsize clause must be a positive integer
|
// The parameter of the grainsize clause must be a positive integer
|
||||||
// expression.
|
// expression.
|
||||||
if (!isNonNegativeIntegerValue(ValExpr, *this, OMPC_grainsize,
|
if (!isNonNegativeIntegerValue(
|
||||||
/*StrictlyPositive=*/true))
|
ValExpr, *this, OMPC_grainsize,
|
||||||
|
/*StrictlyPositive=*/true, /*BuildCapture=*/true,
|
||||||
|
DSAStack->getCurrentDirective(), &CaptureRegion, &HelperValStmt))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return new (Context) OMPGrainsizeClause(ValExpr, StartLoc, LParenLoc, EndLoc);
|
return new (Context) OMPGrainsizeClause(ValExpr, HelperValStmt, CaptureRegion,
|
||||||
|
StartLoc, LParenLoc, EndLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
OMPClause *Sema::ActOnOpenMPNumTasksClause(Expr *NumTasks,
|
OMPClause *Sema::ActOnOpenMPNumTasksClause(Expr *NumTasks,
|
||||||
|
|
|
||||||
|
|
@ -12934,6 +12934,7 @@ void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
|
void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
|
||||||
|
VisitOMPClauseWithPreInit(C);
|
||||||
C->setGrainsize(Record.readSubExpr());
|
C->setGrainsize(Record.readSubExpr());
|
||||||
C->setLParenLoc(Record.readSourceLocation());
|
C->setLParenLoc(Record.readSourceLocation());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6938,6 +6938,7 @@ void OMPClauseWriter::VisitOMPPriorityClause(OMPPriorityClause *C) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
|
void OMPClauseWriter::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) {
|
||||||
|
VisitOMPClauseWithPreInit(C);
|
||||||
Record.AddStmt(C->getGrainsize());
|
Record.AddStmt(C->getGrainsize());
|
||||||
Record.AddSourceLocation(C->getLParenLoc());
|
Record.AddSourceLocation(C->getLParenLoc());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEFLOC:@.+]])
|
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEFLOC:@.+]])
|
||||||
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEFLOC]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OMP_OUTLINED1:@.+]] to void (i32*, i32*, ...)*))
|
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEFLOC]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OMP_OUTLINED1:@.+]] to void (i32*, i32*, ...)*))
|
||||||
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEFLOC]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* [[OMP_OUTLINED2:@.+]] to void (i32*, i32*, ...)*))
|
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEFLOC]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i64)* [[OMP_OUTLINED2:@.+]] to void (i32*, i32*, ...)*), i64 [[GRAINSIZE:%.+]])
|
||||||
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEFLOC]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i8***, i64)* [[OMP_OUTLINED3:@.+]] to void (i32*, i32*, ...)*), i32* [[ARGC:%.+]], i8*** [[ARGV:%.+]], i64 [[COND:%.+]])
|
// CHECK: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* [[DEFLOC]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i8***, i64)* [[OMP_OUTLINED3:@.+]] to void (i32*, i32*, ...)*), i32* [[ARGC:%.+]], i8*** [[ARGV:%.+]], i64 [[COND:%.+]])
|
||||||
// CHECK: call void @__kmpc_serialized_parallel(%struct.ident_t* [[DEFLOC]], i32 [[GTID]])
|
// CHECK: call void @__kmpc_serialized_parallel(%struct.ident_t* [[DEFLOC]], i32 [[GTID]])
|
||||||
// CHECK: call void [[OMP_OUTLINED3]](i32* %{{.+}}, i32* %{{.+}}, i32* [[ARGC]], i8*** [[ARGV]], i64 [[COND]])
|
// CHECK: call void [[OMP_OUTLINED3]](i32* %{{.+}}, i32* %{{.+}}, i32* [[ARGC]], i8*** [[ARGV]], i64 [[COND]])
|
||||||
|
|
@ -77,7 +77,7 @@ int main(int argc, char **argv) {
|
||||||
#pragma omp parallel master taskloop priority(4)
|
#pragma omp parallel master taskloop priority(4)
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
;
|
;
|
||||||
// CHECK: define internal void [[OMP_OUTLINED2]](i32* noalias %{{.+}}, i32* noalias %{{.+}})
|
// CHECK: define internal void [[OMP_OUTLINED2]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i64 %{{.+}})
|
||||||
// CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID:%.+]])
|
// CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID:%.+]])
|
||||||
// CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0
|
// CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0
|
||||||
// CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
|
// CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]]
|
||||||
|
|
@ -92,7 +92,8 @@ int main(int argc, char **argv) {
|
||||||
// CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7
|
// CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7
|
||||||
// CHECK: store i64 1, i64* [[ST]],
|
// CHECK: store i64 1, i64* [[ST]],
|
||||||
// CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],
|
// CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]],
|
||||||
// CHECK: call void @__kmpc_taskloop(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 1, i64 4, i8* null)
|
// CHECK: [[GRAINSIZE:%.+]] = zext i32 %{{.+}} to i64
|
||||||
|
// CHECK: call void @__kmpc_taskloop(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 1, i64 [[GRAINSIZE]], i8* null)
|
||||||
// CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]])
|
// CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]])
|
||||||
// CHECK-NEXT: br label {{%?}}[[EXIT]]
|
// CHECK-NEXT: br label {{%?}}[[EXIT]]
|
||||||
// CHECK: [[EXIT]]
|
// CHECK: [[EXIT]]
|
||||||
|
|
@ -128,7 +129,7 @@ int main(int argc, char **argv) {
|
||||||
// CHECK: br label %
|
// CHECK: br label %
|
||||||
// CHECK: ret i32 0
|
// CHECK: ret i32 0
|
||||||
|
|
||||||
#pragma omp parallel master taskloop nogroup grainsize(4)
|
#pragma omp parallel master taskloop nogroup grainsize(argc)
|
||||||
for (int i = 0; i < 10; ++i)
|
for (int i = 0; i < 10; ++i)
|
||||||
;
|
;
|
||||||
// CHECK: define internal void [[OMP_OUTLINED3]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}}, i8*** dereferenceable(8) %{{.+}}, i64 %{{.+}})
|
// CHECK: define internal void [[OMP_OUTLINED3]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}}, i8*** dereferenceable(8) %{{.+}}, i64 %{{.+}})
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue