diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2019-06-27 18:53:07 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2019-06-27 18:53:07 +0000 |
commit | f288cf9dfa169f4212b4bbab691bc3c6baf88017 (patch) | |
tree | 982bd277f19951c841f5d463365aff25052b05dc /clang/lib/CodeGen/CGOpenMPRuntime.cpp | |
parent | 954014a0fac4feb14e77eaa0b95d96f8095383b2 (diff) | |
download | bcm5719-llvm-f288cf9dfa169f4212b4bbab691bc3c6baf88017.tar.gz bcm5719-llvm-f288cf9dfa169f4212b4bbab691bc3c6baf88017.zip |
[OPENMP]Generate correctly implicit flags for mapped data.
Implicit flag must not be emitted for explicitly specified firstprivate
variables, but for implicitly captured sizes of the VLAs.
llvm-svn: 364575
Diffstat (limited to 'clang/lib/CodeGen/CGOpenMPRuntime.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 6b9824b0103..1eb2f3a7227 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -7155,7 +7155,9 @@ private: CodeGenFunction &CGF; /// Set of all first private variables in the current directive. - llvm::SmallPtrSet<const VarDecl *, 8> FirstPrivateDecls; + /// bool data is set to true if the variable is implicitly marked as + /// firstprivate, false otherwise. + llvm::DenseMap<CanonicalDeclPtr<const VarDecl>, bool> FirstPrivateDecls; /// Map between device pointer declarations and their expression components. /// The key value for declarations in 'this' is null. @@ -7836,8 +7838,8 @@ public: // Extract firstprivate clause information. for (const auto *C : Dir.getClausesOfKind<OMPFirstprivateClause>()) for (const auto *D : C->varlists()) - FirstPrivateDecls.insert( - cast<VarDecl>(cast<DeclRefExpr>(D)->getDecl())->getCanonicalDecl()); + FirstPrivateDecls.try_emplace( + cast<VarDecl>(cast<DeclRefExpr>(D)->getDecl()), C->isImplicit()); // Extract device pointer clause information. for (const auto *C : Dir.getClausesOfKind<OMPIsDevicePtrClause>()) for (auto L : C->component_lists()) @@ -8354,6 +8356,7 @@ public: MapValuesArrayTy &CurPointers, MapValuesArrayTy &CurSizes, MapFlagsArrayTy &CurMapTypes) const { + bool IsImplicit = true; // Do the default mapping. if (CI.capturesThis()) { CurBasePointers.push_back(CV); @@ -8379,6 +8382,10 @@ public: CurMapTypes.push_back(OMP_MAP_NONE); CurSizes.push_back(llvm::Constant::getNullValue(CGF.Int64Ty)); } + const VarDecl *VD = CI.getCapturedVar(); + auto I = FirstPrivateDecls.find(VD); + if (I != FirstPrivateDecls.end()) + IsImplicit = I->getSecond(); } else { assert(CI.capturesVariable() && "Expected captured reference."); const auto *PtrTy = cast<ReferenceType>(RI.getType().getTypePtr()); @@ -8390,7 +8397,8 @@ public: // type, the default is 'tofrom'. CurMapTypes.push_back(getMapModifiersForPrivateClauses(CI)); const VarDecl *VD = CI.getCapturedVar(); - if (FirstPrivateDecls.count(VD) && + auto I = FirstPrivateDecls.find(VD); + if (I != FirstPrivateDecls.end() && VD->getType().isConstant(CGF.getContext())) { llvm::Constant *Addr = CGF.CGM.getOpenMPRuntime().registerTargetFirstprivateCopy(CGF, VD); @@ -8404,7 +8412,7 @@ public: CurPointers.push_back(Addr); } else { CurBasePointers.push_back(CV); - if (FirstPrivateDecls.count(VD) && ElementType->isAnyPointerType()) { + if (I != FirstPrivateDecls.end() && ElementType->isAnyPointerType()) { Address PtrAddr = CGF.EmitLoadOfReference(CGF.MakeAddrLValue( CV, ElementType, CGF.getContext().getDeclAlign(VD), AlignmentSource::Decl)); @@ -8413,12 +8421,15 @@ public: CurPointers.push_back(CV); } } + if (I != FirstPrivateDecls.end()) + IsImplicit = I->getSecond(); } // Every default map produces a single argument which is a target parameter. CurMapTypes.back() |= OMP_MAP_TARGET_PARAM; // Add flag stating this is an implicit map. - CurMapTypes.back() |= OMP_MAP_IMPLICIT; + if (IsImplicit) + CurMapTypes.back() |= OMP_MAP_IMPLICIT; } }; } // anonymous namespace @@ -8884,7 +8895,8 @@ void CGOpenMPRuntime::emitTargetCall(CodeGenFunction &CGF, CGF.getTypeSize(RI->getType()), CGF.Int64Ty, /*isSigned=*/true)); // Copy to the device as an argument. No need to retrieve it. CurMapTypes.push_back(MappableExprsHandler::OMP_MAP_LITERAL | - MappableExprsHandler::OMP_MAP_TARGET_PARAM); + MappableExprsHandler::OMP_MAP_TARGET_PARAM | + MappableExprsHandler::OMP_MAP_IMPLICIT); } else { // If we have any information in the map clause, we use it, otherwise we // just do a default mapping. |