diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2020-03-09 08:55:57 -0400 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2020-03-13 18:04:16 -0400 |
commit | b3998a0edb9ae154a69964a94b5c53decf27f210 (patch) | |
tree | 25319381ffe9bdf3f3f3e46978cecf77826f08d5 /clang/lib/CodeGen/CGOpenMPRuntime.cpp | |
parent | Add Builder::getI64VectorAttr. (diff) | |
download | llvm-project-b3998a0edb9ae154a69964a94b5c53decf27f210.tar.gz llvm-project-b3998a0edb9ae154a69964a94b5c53decf27f210.tar.bz2 llvm-project-b3998a0edb9ae154a69964a94b5c53decf27f210.zip |
[OPENMP]Fix PR45047: Do not copy firstprivates in tasks twice.
Avoid copying of the orignal variable if it is going to be marked as
firstprivate in task regions. For taskloops, still need to copy the
non-trvially copyable variables to correctly construct them upon task
creation.
Diffstat (limited to 'clang/lib/CodeGen/CGOpenMPRuntime.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.cpp | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 9e88b6ef9315..fde42b1fe242 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -4389,13 +4389,14 @@ QualType CGOpenMPRuntime::getTgtOffloadEntryQTy() { namespace { struct PrivateHelpersTy { - PrivateHelpersTy(const VarDecl *Original, const VarDecl *PrivateCopy, - const VarDecl *PrivateElemInit) - : Original(Original), PrivateCopy(PrivateCopy), + PrivateHelpersTy(const Expr *OriginalRef, const VarDecl *Original, + const VarDecl *PrivateCopy, const VarDecl *PrivateElemInit) + : OriginalRef(OriginalRef), Original(Original), PrivateCopy(PrivateCopy), PrivateElemInit(PrivateElemInit) {} - const VarDecl *Original; - const VarDecl *PrivateCopy; - const VarDecl *PrivateElemInit; + const Expr *OriginalRef = nullptr; + const VarDecl *Original = nullptr; + const VarDecl *PrivateCopy = nullptr; + const VarDecl *PrivateElemInit = nullptr; }; typedef std::pair<CharUnits /*Align*/, PrivateHelpersTy> PrivateDataTy; } // anonymous namespace @@ -4775,7 +4776,7 @@ static void emitPrivatesInit(CodeGenFunction &CGF, // For target-based directives skip 3 firstprivate arrays BasePointersArray, // PointersArray and SizesArray. The original variables for these arrays are // not captured and we get their addresses explicitly. - if ((!IsTargetTask && !Data.FirstprivateVars.empty()) || + if ((!IsTargetTask && !Data.FirstprivateVars.empty() && ForDup) || (IsTargetTask && KmpTaskSharedsPtr.isValid())) { SrcBase = CGF.MakeAddrLValue( CGF.Builder.CreatePointerBitCastOrAddrSpaceCast( @@ -4807,13 +4808,18 @@ static void emitPrivatesInit(CodeGenFunction &CGF, "Expected artificial target data variable."); SharedRefLValue = CGF.MakeAddrLValue(CGF.GetAddrOfLocalVar(OriginalVD), Type); - } else { + } else if (ForDup) { SharedRefLValue = CGF.EmitLValueForField(SrcBase, SharedField); SharedRefLValue = CGF.MakeAddrLValue( Address(SharedRefLValue.getPointer(CGF), C.getDeclAlign(OriginalVD)), SharedRefLValue.getType(), LValueBaseInfo(AlignmentSource::Decl), SharedRefLValue.getTBAAInfo()); + } else { + InlinedOpenMPRegionRAII Region( + CGF, [](CodeGenFunction &, PrePostActionTy &) {}, OMPD_unknown, + /*HasCancel=*/false); + SharedRefLValue = CGF.EmitLValue(Pair.second.OriginalRef); } if (Type->isArrayType()) { // Initialize firstprivate array. @@ -4977,23 +4983,23 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc, ASTContext &C = CGM.getContext(); llvm::SmallVector<PrivateDataTy, 4> Privates; // Aggregate privates and sort them by the alignment. - auto I = Data.PrivateCopies.begin(); + const auto *I = Data.PrivateCopies.begin(); for (const Expr *E : Data.PrivateVars) { const auto *VD = cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl()); Privates.emplace_back( C.getDeclAlign(VD), - PrivateHelpersTy(VD, cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()), + PrivateHelpersTy(E, VD, cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()), /*PrivateElemInit=*/nullptr)); ++I; } I = Data.FirstprivateCopies.begin(); - auto IElemInitRef = Data.FirstprivateInits.begin(); + const auto *IElemInitRef = Data.FirstprivateInits.begin(); for (const Expr *E : Data.FirstprivateVars) { const auto *VD = cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl()); Privates.emplace_back( C.getDeclAlign(VD), PrivateHelpersTy( - VD, cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()), + E, VD, cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()), cast<VarDecl>(cast<DeclRefExpr>(*IElemInitRef)->getDecl()))); ++I; ++IElemInitRef; @@ -5003,7 +5009,7 @@ CGOpenMPRuntime::emitTaskInit(CodeGenFunction &CGF, SourceLocation Loc, const auto *VD = cast<VarDecl>(cast<DeclRefExpr>(E)->getDecl()); Privates.emplace_back( C.getDeclAlign(VD), - PrivateHelpersTy(VD, cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()), + PrivateHelpersTy(E, VD, cast<VarDecl>(cast<DeclRefExpr>(*I)->getDecl()), /*PrivateElemInit=*/nullptr)); ++I; } |