Author: Giorgis Georgakoudis Date: 2021-05-03T10:34:38-07:00 New Revision: a27ca15dd08342b199e2feb5ae896475fd90a518
URL: https://github.com/llvm/llvm-project/commit/a27ca15dd08342b199e2feb5ae896475fd90a518 DIFF: https://github.com/llvm/llvm-project/commit/a27ca15dd08342b199e2feb5ae896475fd90a518.diff LOG: [OpenMP] Fix non-determinism in clang task codegen Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D101739 Added: Modified: clang/lib/CodeGen/CGOpenMPRuntime.cpp clang/lib/CodeGen/CGOpenMPRuntime.h clang/lib/CodeGen/CGStmtOpenMP.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index fce6efe9fee0..1980c5c91af2 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -12107,8 +12107,8 @@ CGOpenMPRuntime::NontemporalDeclsRAII::~NontemporalDeclsRAII() { CGOpenMPRuntime::UntiedTaskLocalDeclsRAII::UntiedTaskLocalDeclsRAII( CodeGenFunction &CGF, - const llvm::DenseMap<CanonicalDeclPtr<const VarDecl>, - std::pair<Address, Address>> &LocalVars) + const llvm::MapVector<CanonicalDeclPtr<const VarDecl>, + std::pair<Address, Address>> &LocalVars) : CGM(CGF.CGM), NeedToPush(!LocalVars.empty()) { if (!NeedToPush) return; diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h index 7be9c3b1da22..5155370f46cf 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -253,8 +253,8 @@ class CGOpenMPRuntime { public: UntiedTaskLocalDeclsRAII( CodeGenFunction &CGF, - const llvm::DenseMap<CanonicalDeclPtr<const VarDecl>, - std::pair<Address, Address>> &LocalVars); + const llvm::MapVector<CanonicalDeclPtr<const VarDecl>, + std::pair<Address, Address>> &LocalVars); ~UntiedTaskLocalDeclsRAII(); }; @@ -723,8 +723,8 @@ class CGOpenMPRuntime { llvm::SmallVector<NontemporalDeclsSet, 4> NontemporalDeclsStack; using UntiedLocalVarsAddressesMap = - llvm::DenseMap<CanonicalDeclPtr<const VarDecl>, - std::pair<Address, Address>>; + llvm::MapVector<CanonicalDeclPtr<const VarDecl>, + std::pair<Address, Address>>; llvm::SmallVector<UntiedLocalVarsAddressesMap, 4> UntiedLocalVarsStack; /// Stack for list of addresses of declarations in current context marked as diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 83d3dd0fc813..e7ddc0aa4c8d 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -4339,7 +4339,8 @@ void CodeGenFunction::EmitOMPTaskBasedDirective( auto &&CodeGen = [&Data, &S, CS, &BodyGen, &LastprivateDstsOrigs, CapturedRegion](CodeGenFunction &CGF, PrePostActionTy &Action) { - llvm::DenseMap<CanonicalDeclPtr<const VarDecl>, std::pair<Address, Address>> + llvm::MapVector<CanonicalDeclPtr<const VarDecl>, + std::pair<Address, Address>> UntiedLocalVars; // Set proper addresses for generated private copies. OMPPrivateScope Scope(CGF); @@ -4392,7 +4393,12 @@ void CodeGenFunction::EmitOMPTaskBasedDirective( Ty = CGF.getContext().getPointerType(Ty); Address PrivatePtr = CGF.CreateMemTemp( CGF.getContext().getPointerType(Ty), ".local.ptr.addr"); - UntiedLocalVars.try_emplace(VD, PrivatePtr, Address::invalid()); + auto Result = UntiedLocalVars.insert( + std::make_pair(VD, std::make_pair(PrivatePtr, Address::invalid()))); + // If key exists update in place. + if (Result.second == false) + *Result.first = std::make_pair( + VD, std::make_pair(PrivatePtr, Address::invalid())); CallArgs.push_back(PrivatePtr.getPointer()); ParamTypes.push_back(PrivatePtr.getType()); } @@ -4424,14 +4430,14 @@ void CodeGenFunction::EmitOMPTaskBasedDirective( if (isAllocatableDecl(Pair.first)) { llvm::Value *Ptr = CGF.Builder.CreateLoad(Pair.second.first); Address Replacement(Ptr, CGF.getPointerAlign()); - Pair.getSecond().first = Replacement; + Pair.second.first = Replacement; Ptr = CGF.Builder.CreateLoad(Replacement); Replacement = Address(Ptr, CGF.getContext().getDeclAlign(Pair.first)); - Pair.getSecond().second = Replacement; + Pair.second.second = Replacement; } else { llvm::Value *Ptr = CGF.Builder.CreateLoad(Pair.second.first); Address Replacement(Ptr, CGF.getContext().getDeclAlign(Pair.first)); - Pair.getSecond().first = Replacement; + Pair.second.first = Replacement; } } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits