Author: abataev Date: Wed Jun 15 06:20:48 2016 New Revision: 272775 URL: http://llvm.org/viewvc/llvm-project?rev=272775&view=rev Log: [OPENMP] Fix crash for 'schedule|dist_schedule' clauses during instantiation.
Added checks for non-dependent context when trygin to capture non-constant schedule chunk expression for proper codegen of outlined functions. Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/test/OpenMP/distribute_codegen.cpp cfe/trunk/test/OpenMP/for_codegen.cpp Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=272775&r1=272774&r2=272775&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Wed Jun 15 06:20:48 2016 @@ -7341,7 +7341,8 @@ OMPClause *Sema::ActOnOpenMPScheduleClau << "schedule" << 1 << ChunkSize->getSourceRange(); return nullptr; } - } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) { + } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective()) && + !CurContext->isDependentContext()) { llvm::MapVector<Expr *, DeclRefExpr *> Captures; ValExpr = tryBuildCapture(*this, ValExpr, Captures).get(); HelperValStmt = buildPreInits(Context, Captures); @@ -10877,7 +10878,8 @@ OMPClause *Sema::ActOnOpenMPDistSchedule << "dist_schedule" << ChunkSize->getSourceRange(); return nullptr; } - } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) { + } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective()) && + !CurContext->isDependentContext()) { llvm::MapVector<Expr *, DeclRefExpr *> Captures; ValExpr = tryBuildCapture(*this, ValExpr, Captures).get(); HelperValStmt = buildPreInits(Context, Captures); Modified: cfe/trunk/test/OpenMP/distribute_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_codegen.cpp?rev=272775&r1=272774&r2=272775&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/distribute_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/distribute_codegen.cpp Wed Jun 15 06:20:48 2016 @@ -238,4 +238,26 @@ void test_precond() { // no templates for now, as these require special handling in target regions and/or declare target +// HCHECK-LABEL: fint +// HCHECK: call {{.*}}i32 {{.+}}ftemplate +// HCHECK: ret i32 + +// HCHECK: load i16, i16* +// HCHECK: store i16 % +// HCHECK: call i32 @__tgt_target_teams( +// HCHECK: call void @__kmpc_for_static_init_4( +template <typename T> +T ftemplate() { + short aa = 0; + +#pragma omp target +#pragma omp teams +#pragma omp distribute dist_schedule(static, aa) + for (int i = 0; i < 100; i++) { + } + return T(); +} + +int fint(void) { return ftemplate<int>(); } + #endif Modified: cfe/trunk/test/OpenMP/for_codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_codegen.cpp?rev=272775&r1=272774&r2=272775&view=diff ============================================================================== --- cfe/trunk/test/OpenMP/for_codegen.cpp (original) +++ cfe/trunk/test/OpenMP/for_codegen.cpp Wed Jun 15 06:20:48 2016 @@ -492,4 +492,25 @@ void loop_with_stmt_expr() { // CHECK: call void @__kmpc_for_static_init_4( // CHECK: call void @__kmpc_for_static_fini( + +// CHECK-LABEL: fint +// CHECK: call {{.*}}i32 {{.*}}ftemplate +// CHECK: ret i32 + +// CHECK: load i16, i16* +// CHECK: store i16 % +// CHECK: call void {{.+}}@__kmpc_fork_call( +// CHECK: call void @__kmpc_for_static_init_4( +template <typename T> +T ftemplate() { + short aa = 0; + +#pragma omp parallel for schedule(static, aa) + for (int i = 0; i < 100; i++) { + } + return T(); +} + +int fint(void) { return ftemplate<int>(); } + #endif // HEADER _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits