Merged to Clang 9 in r366705.
On Thu, Jul 18, 2019 at 10:48 AM Alexey Bataev via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: abataev > Date: Thu Jul 18 10:49:13 2019 > New Revision: 366474 > > URL: http://llvm.org/viewvc/llvm-project?rev=366474&view=rev > Log: > [OPENMP]Provide correct data sharing attributes for loop control > variables. > > Loop control variables are private in loop-based constructs and we shall > take this into account when generate the code for inner constructs. > Currently, those variables are reported as shared in many cases. Moved > the analysis of the data-sharing attributes of the loop control variable > to an early semantic stage to correctly handle their attributes. > > Modified: > cfe/trunk/lib/Sema/SemaOpenMP.cpp > cfe/trunk/test/OpenMP/distribute_parallel_for_firstprivate_messages.cpp > > cfe/trunk/test/OpenMP/distribute_parallel_for_simd_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/distribute_simd_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/distribute_simd_misc_messages.c > cfe/trunk/test/OpenMP/for_misc_messages.c > cfe/trunk/test/OpenMP/for_simd_misc_messages.c > cfe/trunk/test/OpenMP/parallel_for_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/parallel_for_misc_messages.c > cfe/trunk/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/simd_misc_messages.c > cfe/trunk/test/OpenMP/target_parallel_for_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/target_parallel_for_misc_messages.c > cfe/trunk/test/OpenMP/target_parallel_for_simd_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/target_parallel_for_simd_misc_messages.c > cfe/trunk/test/OpenMP/target_simd_firstprivate_messages.cpp > > cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_simd_misc_messages.c > cfe/trunk/test/OpenMP/target_teams_distribute_simd_misc_messages.c > cfe/trunk/test/OpenMP/task_codegen.c > cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp > cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp > > Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) > +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Thu Jul 18 10:49:13 2019 > @@ -139,6 +139,7 @@ private: > /// clause, false otherwise. > llvm::Optional<std::pair<const Expr *, OMPOrderedClause *>> > OrderedRegion; > unsigned AssociatedLoops = 1; > + bool HasMutipleLoops = false; > const Decl *PossiblyLoopCounter = nullptr; > bool NowaitRegion = false; > bool CancelRegion = false; > @@ -678,12 +679,19 @@ public: > /// Set collapse value for the region. > void setAssociatedLoops(unsigned Val) { > getTopOfStack().AssociatedLoops = Val; > + if (Val > 1) > + getTopOfStack().HasMutipleLoops = true; > } > /// Return collapse value for region. > unsigned getAssociatedLoops() const { > const SharingMapTy *Top = getTopOfStackOrNull(); > return Top ? Top->AssociatedLoops : 0; > } > + /// Returns true if the construct is associated with multiple loops. > + bool hasMutipleLoops() const { > + const SharingMapTy *Top = getTopOfStackOrNull(); > + return Top ? Top->HasMutipleLoops : false; > + } > > /// Marks current target region as one with closely nested teams > /// region. > @@ -5604,13 +5612,14 @@ void Sema::ActOnOpenMPLoopInitialization > if (!ISC.checkAndSetInit(Init, /*EmitDiags=*/false)) { > if (ValueDecl *D = ISC.getLoopDecl()) { > auto *VD = dyn_cast<VarDecl>(D); > + DeclRefExpr *PrivateRef = nullptr; > if (!VD) { > if (VarDecl *Private = isOpenMPCapturedDecl(D)) { > VD = Private; > } else { > - DeclRefExpr *Ref = buildCapture(*this, D, > ISC.getLoopDeclRefExpr(), > - /*WithInit=*/false); > - VD = cast<VarDecl>(Ref->getDecl()); > + PrivateRef = buildCapture(*this, D, ISC.getLoopDeclRefExpr(), > + /*WithInit=*/false); > + VD = cast<VarDecl>(PrivateRef->getDecl()); > } > } > DSAStack->addLoopControlVariable(D, VD); > @@ -5623,6 +5632,49 @@ void Sema::ActOnOpenMPLoopInitialization > > Var->getType().getNonLValueExprType(Context), > ForLoc, /*RefersToCapture=*/true)); > } > + OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective(); > + // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables > + // Referenced in a Construct, C/C++]. The loop iteration variable in > the > + // associated for-loop of a simd construct with just one associated > + // for-loop may be listed in a linear clause with a > constant-linear-step > + // that is the increment of the associated for-loop. The loop > iteration > + // variable(s) in the associated for-loop(s) of a for or parallel for > + // construct may be listed in a private or lastprivate clause. > + DSAStackTy::DSAVarData DVar = > + DSAStack->getTopDSA(D, /*FromParent=*/false); > + // If LoopVarRefExpr is nullptr it means the corresponding loop > variable > + // is declared in the loop and it is predetermined as a private. > + Expr *LoopDeclRefExpr = ISC.getLoopDeclRefExpr(); > + OpenMPClauseKind PredeterminedCKind = > + isOpenMPSimdDirective(DKind) > + ? (DSAStack->hasMutipleLoops() ? OMPC_lastprivate : > OMPC_linear) > + : OMPC_private; > + if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && > + DVar.CKind != PredeterminedCKind && DVar.RefExpr && > + (LangOpts.OpenMP <= 45 || (DVar.CKind != OMPC_lastprivate && > + DVar.CKind != OMPC_private))) || > + ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop > || > + isOpenMPDistributeDirective(DKind)) && > + !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && > + DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) > && > + (DVar.CKind != OMPC_private || DVar.RefExpr)) { > + Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa) > + << getOpenMPClauseName(DVar.CKind) > + << getOpenMPDirectiveName(DKind) > + << getOpenMPClauseName(PredeterminedCKind); > + if (DVar.RefExpr == nullptr) > + DVar.CKind = PredeterminedCKind; > + reportOriginalDsa(*this, DSAStack, D, DVar, > + /*IsLoopIterVar=*/true); > + } else if (LoopDeclRefExpr) { > + // Make the loop iteration variable private (for worksharing > + // constructs), linear (for simd directives with the only one > + // associated loop) or lastprivate (for simd directives with > several > + // collapsed or ordered loops). > + if (DVar.CKind == OMPC_unknown) > + DSAStack->addDSA(D, LoopDeclRefExpr, PredeterminedCKind, > + PrivateRef); > + } > } > } > DSAStack->setAssociatedLoops(AssociatedLoops - 1); > @@ -5677,8 +5729,6 @@ static bool checkOpenMPIterationSpace( > > // Check loop variable's type. > if (ValueDecl *LCDecl = ISC.getLoopDecl()) { > - Expr *LoopDeclRefExpr = ISC.getLoopDeclRefExpr(); > - > // OpenMP [2.6, Canonical Loop Form] > // Var is one of the following: > // A variable of signed or unsigned integer type. > @@ -5704,46 +5754,6 @@ static bool checkOpenMPIterationSpace( > // sharing attributes. > VarsWithImplicitDSA.erase(LCDecl); > > - // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables > Referenced > - // in a Construct, C/C++]. > - // The loop iteration variable in the associated for-loop of a simd > - // construct with just one associated for-loop may be listed in a linear > - // clause with a constant-linear-step that is the increment of the > - // associated for-loop. > - // The loop iteration variable(s) in the associated for-loop(s) of a for > or > - // parallel for construct may be listed in a private or lastprivate > clause. > - DSAStackTy::DSAVarData DVar = DSA.getTopDSA(LCDecl, false); > - // If LoopVarRefExpr is nullptr it means the corresponding loop variable > is > - // declared in the loop and it is predetermined as a private. > - OpenMPClauseKind PredeterminedCKind = > - isOpenMPSimdDirective(DKind) > - ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate) > - : OMPC_private; > - if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && > - DVar.CKind != PredeterminedCKind && DVar.RefExpr && > - (SemaRef.getLangOpts().OpenMP <= 45 || > - (DVar.CKind != OMPC_lastprivate && DVar.CKind != OMPC_private))) > || > - ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop || > - isOpenMPDistributeDirective(DKind)) && > - !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && > - DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) && > - (DVar.CKind != OMPC_private || DVar.RefExpr)) { > - SemaRef.Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa) > - << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind) > - << getOpenMPClauseName(PredeterminedCKind); > - if (DVar.RefExpr == nullptr) > - DVar.CKind = PredeterminedCKind; > - reportOriginalDsa(SemaRef, &DSA, LCDecl, DVar, /*IsLoopIterVar=*/true); > - HasErrors = true; > - } else if (LoopDeclRefExpr != nullptr) { > - // Make the loop iteration variable private (for worksharing > constructs), > - // linear (for simd directives with the only one associated loop) or > - // lastprivate (for simd directives with several collapsed or ordered > - // loops). > - if (DVar.CKind == OMPC_unknown) > - DSA.addDSA(LCDecl, LoopDeclRefExpr, PredeterminedCKind); > - } > - > assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars"); > > // Check test-expr. > > Modified: > cfe/trunk/test/OpenMP/distribute_parallel_for_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/distribute_parallel_for_firstprivate_messages.cpp > (original) > +++ cfe/trunk/test/OpenMP/distribute_parallel_for_firstprivate_messages.cpp > Thu Jul 18 10:49:13 2019 > @@ -162,14 +162,14 @@ int foomain(int argc, char **argv) { > #pragma omp parallel private(i) > #pragma omp target > #pragma omp teams > -#pragma omp distribute parallel for firstprivate(i) // expected-note > {{defined as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute parallel for' directive may not be > firstprivate, predetermined as private}} > +#pragma omp distribute parallel for firstprivate(i) // expected-note 2 > {{defined as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp distribute parallel for' directive may not be > firstprivate, predetermined as private}} > foo(); > #pragma omp parallel reduction(+ : i) > #pragma omp target > #pragma omp teams > -#pragma omp distribute parallel for firstprivate(i) // expected-note > {{defined as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute parallel for' directive may not be > firstprivate, predetermined as private}} > +#pragma omp distribute parallel for firstprivate(i) // expected-note 2 > {{defined as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp distribute parallel for' directive may not be > firstprivate, predetermined as private}} > foo(); > return 0; > } > > Modified: > cfe/trunk/test/OpenMP/distribute_parallel_for_simd_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_parallel_for_simd_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- > cfe/trunk/test/OpenMP/distribute_parallel_for_simd_firstprivate_messages.cpp > (original) > +++ > cfe/trunk/test/OpenMP/distribute_parallel_for_simd_firstprivate_messages.cpp > Thu Jul 18 10:49:13 2019 > @@ -162,14 +162,14 @@ int foomain(int argc, char **argv) { > #pragma omp parallel private(i) > #pragma omp target > #pragma omp teams > -#pragma omp distribute parallel for simd firstprivate(i) // expected-note > {{defined as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute parallel for simd' directive may not > be firstprivate, predetermined as linear}} > +#pragma omp distribute parallel for simd firstprivate(i) // expected-note 2 > {{defined as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp distribute parallel for simd' directive may > not be firstprivate, predetermined as linear}} > foo(); > #pragma omp parallel reduction(+ : i) > #pragma omp target > #pragma omp teams > -#pragma omp distribute parallel for simd firstprivate(i) // expected-note > {{defined as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute parallel for simd' directive may not > be firstprivate, predetermined as linear}} > +#pragma omp distribute parallel for simd firstprivate(i) // expected-note 2 > {{defined as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp distribute parallel for simd' directive may > not be firstprivate, predetermined as linear}} > foo(); > return 0; > } > > Modified: cfe/trunk/test/OpenMP/distribute_simd_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_simd_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/distribute_simd_firstprivate_messages.cpp (original) > +++ cfe/trunk/test/OpenMP/distribute_simd_firstprivate_messages.cpp Thu Jul > 18 10:49:13 2019 > @@ -162,14 +162,14 @@ int foomain(int argc, char **argv) { > #pragma omp parallel private(i) > #pragma omp target > #pragma omp teams > -#pragma omp distribute simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute simd' directive may not be > firstprivate, predetermined as linear}} > +#pragma omp distribute simd firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp distribute simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > #pragma omp parallel reduction(+ : i) > #pragma omp target > #pragma omp teams > -#pragma omp distribute simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute simd' directive may not be > firstprivate, predetermined as linear}} > +#pragma omp distribute simd firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp distribute simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > return 0; > } > > Modified: cfe/trunk/test/OpenMP/distribute_simd_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/distribute_simd_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/distribute_simd_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/distribute_simd_misc_messages.c Thu Jul 18 10:49:13 > 2019 > @@ -487,11 +487,11 @@ void test_collapse() { > #pragma omp distribute simd collapse(5 - 5) > for (i = 0; i < 16; ++i) > ; > -// expected-note@+3 {{defined as reduction}} > +// expected-note@+3 2 {{defined as reduction}} > #pragma omp target > #pragma omp teams > #pragma omp distribute simd collapse(2) reduction(+ : i) > - for (i = 0; i < 16; ++i) > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp distribute simd' directive may not be reduction, > predetermined as lastprivate}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for' directive > into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > // expected-error@+2 2 {{reduction variable must be shared}} > > Modified: cfe/trunk/test/OpenMP/for_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/for_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/for_misc_messages.c Thu Jul 18 10:49:13 2019 > @@ -214,10 +214,10 @@ void test_collapse() { > ; > #pragma omp parallel > #pragma omp for collapse(2) > - for (i = 0; i < 16; ++i) > + for (i = 0; i < 16; ++i) // expected-note {{defined as private}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for' directive > into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > -// expected-error@+2 {{reduction variable must be shared}} > +// expected-error@+2 2 {{reduction variable must be shared}} > // expected-error@+1 {{region cannot be closely nested inside 'for' region; > perhaps you forget to enclose 'omp for' directive into a parallel region?}} > #pragma omp for reduction(+ : i, j) > for (int k = 0; k < 16; ++k) > > Modified: cfe/trunk/test/OpenMP/for_simd_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/for_simd_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/for_simd_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/for_simd_misc_messages.c Thu Jul 18 10:49:13 2019 > @@ -381,10 +381,10 @@ void test_collapse() { > ; > #pragma omp parallel > #pragma omp for simd collapse(2) > - for (i = 0; i < 16; ++i) > + for (i = 0; i < 16; ++i) // expected-note {{defined as lastprivate}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for simd' > directive into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > -// expected-error@+2 {{reduction variable must be shared}} > +// expected-error@+2 2 {{reduction variable must be shared}} > // expected-error@+1 {{OpenMP constructs may not be nested inside a simd > region}} > #pragma omp for simd reduction(+ : i, j) > for (int k = 0; k < 16; ++k) > > Modified: cfe/trunk/test/OpenMP/parallel_for_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/parallel_for_firstprivate_messages.cpp (original) > +++ cfe/trunk/test/OpenMP/parallel_for_firstprivate_messages.cpp Thu Jul 18 > 10:49:13 2019 > @@ -127,12 +127,12 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp parallel for firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp parallel for' directive may not be firstprivate, > predetermined as private}} > +#pragma omp parallel for firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp parallel for' directive may not be > firstprivate, predetermined as private}} > foo(); > #pragma omp parallel reduction(+ : i) > -#pragma omp parallel for firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp parallel for' directive may not be firstprivate, > predetermined as private}} > +#pragma omp parallel for firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp parallel for' directive may not be > firstprivate, predetermined as private}} > foo(); > return 0; > } > > Modified: cfe/trunk/test/OpenMP/parallel_for_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/parallel_for_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/parallel_for_misc_messages.c Thu Jul 18 10:49:13 > 2019 > @@ -162,9 +162,9 @@ void test_collapse() { > #pragma omp parallel for collapse(5 - 5) > for (i = 0; i < 16; ++i) > ; > -// expected-note@+1 {{defined as firstprivate}} > +// expected-note@+1 2 {{defined as firstprivate}} > #pragma omp parallel for collapse(2) firstprivate(i) > - for (i = 0; i < 16; ++i) > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp parallel for' directive may not be firstprivate, > predetermined as private}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for' directive > into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > // expected-error@+2 2 {{reduction variable must be shared}} > > Modified: cfe/trunk/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp > (original) > +++ cfe/trunk/test/OpenMP/parallel_for_simd_firstprivate_messages.cpp Thu Jul > 18 10:49:13 2019 > @@ -129,12 +129,12 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp parallel for simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp parallel for simd' directive may not be > firstprivate, predetermined as linear}} > +#pragma omp parallel for simd firstprivate(i) // expected-note 2 {{defined > as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp parallel for simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > #pragma omp parallel reduction(+ : i) > -#pragma omp parallel for simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp parallel for simd' directive may not be > firstprivate, predetermined as linear}} > +#pragma omp parallel for simd firstprivate(i) // expected-note 2 {{defined > as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp parallel for simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > return 0; > } > > Modified: cfe/trunk/test/OpenMP/simd_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/simd_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/simd_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/simd_misc_messages.c Thu Jul 18 10:49:13 2019 > @@ -359,10 +359,10 @@ void test_collapse() { > #pragma omp simd collapse(5 - 5) > for (i = 0; i < 16; ++i) > ; > -// expected-note@+2 {{defined as reduction}} > +// expected-note@+2 2 {{defined as reduction}} > #pragma omp parallel > #pragma omp simd collapse(2) reduction(+ : i) > - for (i = 0; i < 16; ++i) > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp simd' directive may not be reduction, > predetermined as lastprivate}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for' directive > into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > // expected-error@+2 2 {{reduction variable must be shared}} > > Modified: cfe/trunk/test/OpenMP/target_parallel_for_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_parallel_for_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/target_parallel_for_firstprivate_messages.cpp > (original) > +++ cfe/trunk/test/OpenMP/target_parallel_for_firstprivate_messages.cpp Thu > Jul 18 10:49:13 2019 > @@ -136,12 +136,12 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp target parallel for firstprivate(i) // expected-note {{defined > as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target parallel for' directive may not be > firstprivate, predetermined as private}} > +#pragma omp target parallel for firstprivate(i) // expected-note 2 {{defined > as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp target parallel for' directive may not be > firstprivate, predetermined as private}} > foo(); > #pragma omp parallel reduction(+ : i) > -#pragma omp target parallel for firstprivate(i) // expected-note {{defined > as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target parallel for' directive may not be > firstprivate, predetermined as private}} > +#pragma omp target parallel for firstprivate(i) // expected-note 2 {{defined > as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp target parallel for' directive may not be > firstprivate, predetermined as private}} > foo(); > return 0; > } > > Modified: cfe/trunk/test/OpenMP/target_parallel_for_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_parallel_for_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/target_parallel_for_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/target_parallel_for_misc_messages.c Thu Jul 18 > 10:49:13 2019 > @@ -162,9 +162,9 @@ void test_collapse() { > #pragma omp target parallel for collapse(5 - 5) > for (i = 0; i < 16; ++i) > ; > -// expected-note@+1 {{defined as firstprivate}} > +// expected-note@+1 2 {{defined as firstprivate}} > #pragma omp target parallel for collapse(2) firstprivate(i) > - for (i = 0; i < 16; ++i) > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target parallel for' directive may not be > firstprivate, predetermined as private}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for' directive > into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > // expected-error@+2 2 {{reduction variable must be shared}} > > Modified: > cfe/trunk/test/OpenMP/target_parallel_for_simd_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_parallel_for_simd_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/target_parallel_for_simd_firstprivate_messages.cpp > (original) > +++ cfe/trunk/test/OpenMP/target_parallel_for_simd_firstprivate_messages.cpp > Thu Jul 18 10:49:13 2019 > @@ -136,12 +136,12 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp target parallel for simd firstprivate(i) // expected-note > {{defined as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target parallel for simd' directive may not be > firstprivate, predetermined as linear}} > +#pragma omp target parallel for simd firstprivate(i) // expected-note 2 > {{defined as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp target parallel for simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > #pragma omp parallel reduction(+ : i) > -#pragma omp target parallel for simd firstprivate(i) // expected-note > {{defined as firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target parallel for simd' directive may not be > firstprivate, predetermined as linear}} > +#pragma omp target parallel for simd firstprivate(i) // expected-note 2 > {{defined as firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp target parallel for simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > return 0; > } > > Modified: cfe/trunk/test/OpenMP/target_parallel_for_simd_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_parallel_for_simd_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/target_parallel_for_simd_misc_messages.c (original) > +++ cfe/trunk/test/OpenMP/target_parallel_for_simd_misc_messages.c Thu Jul 18 > 10:49:13 2019 > @@ -163,8 +163,8 @@ void test_collapse() { > for (i = 0; i < 16; ++i) > ; > // expected-note@+1 {{defined as firstprivate}} > -#pragma omp target parallel for simd collapse(2) firstprivate(i) > - for (i = 0; i < 16; ++i) > +#pragma omp target parallel for simd collapse(2) firstprivate(i) // > expected-note {{defined as firstprivate}} > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target parallel for simd' directive may not be > firstprivate, predetermined as lastprivate}} > // expected-note@+1 {{variable with automatic storage duration is > predetermined as private; perhaps you forget to enclose 'omp for' directive > into a parallel or another task region?}} > for (int j = 0; j < 16; ++j) > // expected-error@+2 2 {{reduction variable must be shared}} > > Modified: cfe/trunk/test/OpenMP/target_simd_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_simd_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/target_simd_firstprivate_messages.cpp (original) > +++ cfe/trunk/test/OpenMP/target_simd_firstprivate_messages.cpp Thu Jul 18 > 10:49:13 2019 > @@ -136,12 +136,12 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp target simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target simd' directive may not be firstprivate, > predetermined as linear}} > +#pragma omp target simd firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp target simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > #pragma omp parallel reduction(+ : i) > -#pragma omp target simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target simd' directive may not be firstprivate, > predetermined as linear}} > +#pragma omp target simd firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp target simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > return 0; > } > > Modified: > cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_simd_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_simd_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- > cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_simd_misc_messages.c > (original) > +++ > cfe/trunk/test/OpenMP/target_teams_distribute_parallel_for_simd_misc_messages.c > Thu Jul 18 10:49:13 2019 > @@ -164,8 +164,8 @@ void test_collapse() { > ; > > // expected-error@+4 {{OpenMP constructs may not be nested inside a simd > region}} > -#pragma omp target teams distribute parallel for simd collapse(2) > firstprivate(i) > - for (i = 0; i < 16; ++i) > +#pragma omp target teams distribute parallel for simd collapse(2) > firstprivate(i) // expected-note {{defined as firstprivate}} > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target teams distribute parallel for simd' > directive may not be firstprivate, predetermined as lastprivate}} > for (int j = 0; j < 16; ++j) > #pragma omp parallel for reduction(+ : i, j) > for (int k = 0; k < 16; ++k) > > Modified: cfe/trunk/test/OpenMP/target_teams_distribute_simd_misc_messages.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/target_teams_distribute_simd_misc_messages.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/target_teams_distribute_simd_misc_messages.c > (original) > +++ cfe/trunk/test/OpenMP/target_teams_distribute_simd_misc_messages.c Thu > Jul 18 10:49:13 2019 > @@ -164,8 +164,8 @@ void test_collapse() { > ; > > // expected-error@+4 {{OpenMP constructs may not be nested inside a simd > region}} > -#pragma omp target teams distribute simd collapse(2) firstprivate(i) > - for (i = 0; i < 16; ++i) > +#pragma omp target teams distribute simd collapse(2) firstprivate(i) // > expected-note {{defined as firstprivate}} > + for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp target teams distribute simd' directive may not > be firstprivate, predetermined as lastprivate}} > for (int j = 0; j < 16; ++j) > #pragma omp parallel for reduction(+ : i, j) > for (int k = 0; k < 16; ++k) > > Modified: cfe/trunk/test/OpenMP/task_codegen.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/task_codegen.c?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/task_codegen.c (original) > +++ cfe/trunk/test/OpenMP/task_codegen.c Thu Jul 18 10:49:13 2019 > @@ -32,4 +32,19 @@ int main() { > // CHECK: call i8* @__kmpc_omp_task_alloc( > // CHECK: call i32 @__kmpc_omp_task( > // CHECK: call void @__kmpc_end_taskgroup( > + > +// CHECK-LINE: @bar > +void bar() { > + // CHECK: call void @__kmpc_for_static_init_4( > +#pragma omp for > +for (int i = 0; i < 10; ++i) > + // CHECK: [[BUF:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* > @{{.+}}, i32 %{{.+}}, i32 1, i64 48, > + // CHECK: [[BC_BUF:%.+]] = bitcast i8* [[BUF]] to [[TT_WITH_PRIVS:%.+]]* > + // CHECK: [[PRIVS:%.+]] = getelementptr inbounds [[TT_WITH_PRIVS]], > [[TT_WITH_PRIVS]]* [[BC_BUF]], i32 0, i32 1 > + // CHECK: [[I_PRIV:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}} > [[PRIVS]], i32 0, i32 0 > + // CHECK: store i32 %{{.+}}, i32* [[I_PRIV]], > + // CHECK: = call i32 @__kmpc_omp_task(%struct.ident_t* @{{.+}}, i32 > %{{.+}}, i8* [[BUF]]) > +#pragma omp task > +++i; > +} > #endif > > Modified: cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp (original) > +++ cfe/trunk/test/OpenMP/taskloop_firstprivate_messages.cpp Thu Jul 18 > 10:49:13 2019 > @@ -150,11 +150,11 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp taskloop firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp taskloop' directive may not be firstprivate, > predetermined as private}} > +#pragma omp taskloop firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp taskloop' directive may not be firstprivate, > predetermined as private}} > foo(); > -#pragma omp parallel reduction(+ : i) > -#pragma omp taskloop firstprivate(i) // expected-note {{defined as > firstprivate}} > +#pragma omp parallel reduction(+ : i) // expected-note {{defined as > reduction}} > +#pragma omp taskloop firstprivate(i) // expected-note {{defined as > firstprivate}} expected-error {{argument of a reduction clause of a parallel > construct must not appear in a firstprivate clause on a task construct}} > for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp taskloop' directive may not be firstprivate, > predetermined as private}} > foo(); > return 0; > > Modified: cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp?rev=366474&r1=366473&r2=366474&view=diff > ============================================================================== > --- cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp (original) > +++ cfe/trunk/test/OpenMP/taskloop_simd_firstprivate_messages.cpp Thu Jul 18 > 10:49:13 2019 > @@ -150,11 +150,11 @@ int foomain(int argc, char **argv) { > for (i = 0; i < argc; ++i) > foo(); > #pragma omp parallel private(i) > -#pragma omp taskloop simd firstprivate(i) // expected-note {{defined as > firstprivate}} > - for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp taskloop simd' directive may not be firstprivate, > predetermined as linear}} > +#pragma omp taskloop simd firstprivate(i) // expected-note 2 {{defined as > firstprivate}} > + for (i = 0; i < argc; ++i) // expected-error 2 {{loop iteration variable > in the associated loop of 'omp taskloop simd' directive may not be > firstprivate, predetermined as linear}} > foo(); > -#pragma omp parallel reduction(+ : i) > -#pragma omp taskloop simd firstprivate(i) // expected-note {{defined as > firstprivate}} > +#pragma omp parallel reduction(+ : i) // expected-note {{defined as > reduction}} > +#pragma omp taskloop simd firstprivate(i) // expected-note {{defined as > firstprivate}} expected-error {{argument of a reduction clause of a parallel > construct must not appear in a firstprivate clause on a task construct}} > for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp taskloop simd' directive may not be firstprivate, > predetermined as linear}} > foo(); > return 0; > @@ -307,9 +307,9 @@ int main(int argc, char **argv) { > #pragma omp taskloop simd firstprivate(i) // expected-note {{defined as > firstprivate}} > for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp taskloop simd' directive may not be firstprivate, > predetermined as linear}} > foo(); > -#pragma omp parallel reduction(+ : i) // expected-note 2 {{defined as > reduction}} > +#pragma omp parallel reduction(+ : i) // expected-note {{defined as > reduction}} > #pragma omp taskloop simd firstprivate(i) // expected-error {{argument of a > reduction clause of a parallel construct must not appear in a firstprivate > clause on a task construct}} > - for (i = 0; i < argc; ++i) // expected-error {{reduction variables may not > be accessed in an explicit task}} > + for (i = 0; i < argc; ++i) > foo(); > #pragma omp taskloop simd firstprivate(i) //expected-note {{defined as > firstprivate}} > for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in > the associated loop of 'omp taskloop simd' directive may not be firstprivate, > predetermined as linear}} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits