tianshilei1992 created this revision. tianshilei1992 added reviewers: jdoerfert, grokos, ye-luo. Herald added subscribers: cfe-commits, guansong, yaxunl. Herald added a project: clang. tianshilei1992 requested review of this revision. Herald added a subscriber: sstefan1.
The implementation of target nowait just wraps the target region into a task. The essential four parameters (base ptr, ptr, size, mapper) are taken as firstprivate such that they will be copied to the private location. When there is no user-defined mapper, the mapper variable will be nullptr. However, it will be still copied to the corresponding place. Therefore, a memcpy will be generated and the source pointer will be nullptr, causing a segmentation fault. In this patch, it will first checks whether the mapper is a constant nullptr. If so, the firstprivate field and corresponding copy will not be generated. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D89844 Files: clang/lib/CodeGen/CGStmtOpenMP.cpp Index: clang/lib/CodeGen/CGStmtOpenMP.cpp =================================================================== --- clang/lib/CodeGen/CGStmtOpenMP.cpp +++ clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -4210,16 +4210,24 @@ /*IndexTypeQuals=*/0); SVD = createImplicitFirstprivateForType(getContext(), Data, SizesType, CD, S.getBeginLoc()); - MVD = createImplicitFirstprivateForType( - getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc()); TargetScope.addPrivate( BPVD, [&InputInfo]() { return InputInfo.BasePointersArray; }); TargetScope.addPrivate(PVD, [&InputInfo]() { return InputInfo.PointersArray; }); TargetScope.addPrivate(SVD, [&InputInfo]() { return InputInfo.SizesArray; }); - TargetScope.addPrivate(MVD, - [&InputInfo]() { return InputInfo.MappersArray; }); + // Mapper can be nullptr if user doesn't provide any. We will not take it + // into account in this case. + if (auto *Ptr = dyn_cast_or_null<llvm::Constant>( + InputInfo.MappersArray.getPointer())) { + if (!Ptr->isNullValue()) { + MVD = createImplicitFirstprivateForType(getContext(), Data, + BaseAndPointerAndMapperType, CD, + S.getBeginLoc()); + TargetScope.addPrivate( + MVD, [&InputInfo]() { return InputInfo.MappersArray; }); + } + } } (void)TargetScope.Privatize(); // Build list of dependences. @@ -4269,8 +4277,10 @@ CGF.GetAddrOfLocalVar(PVD), /*Index=*/0); InputInfo.SizesArray = CGF.Builder.CreateConstArrayGEP( CGF.GetAddrOfLocalVar(SVD), /*Index=*/0); - InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP( - CGF.GetAddrOfLocalVar(MVD), /*Index=*/0); + // MVD can be nullptr if there is no user-defined mapper + if (MVD) + InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP( + CGF.GetAddrOfLocalVar(MVD), /*Index=*/0); } Action.Enter(CGF);
Index: clang/lib/CodeGen/CGStmtOpenMP.cpp =================================================================== --- clang/lib/CodeGen/CGStmtOpenMP.cpp +++ clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -4210,16 +4210,24 @@ /*IndexTypeQuals=*/0); SVD = createImplicitFirstprivateForType(getContext(), Data, SizesType, CD, S.getBeginLoc()); - MVD = createImplicitFirstprivateForType( - getContext(), Data, BaseAndPointerAndMapperType, CD, S.getBeginLoc()); TargetScope.addPrivate( BPVD, [&InputInfo]() { return InputInfo.BasePointersArray; }); TargetScope.addPrivate(PVD, [&InputInfo]() { return InputInfo.PointersArray; }); TargetScope.addPrivate(SVD, [&InputInfo]() { return InputInfo.SizesArray; }); - TargetScope.addPrivate(MVD, - [&InputInfo]() { return InputInfo.MappersArray; }); + // Mapper can be nullptr if user doesn't provide any. We will not take it + // into account in this case. + if (auto *Ptr = dyn_cast_or_null<llvm::Constant>( + InputInfo.MappersArray.getPointer())) { + if (!Ptr->isNullValue()) { + MVD = createImplicitFirstprivateForType(getContext(), Data, + BaseAndPointerAndMapperType, CD, + S.getBeginLoc()); + TargetScope.addPrivate( + MVD, [&InputInfo]() { return InputInfo.MappersArray; }); + } + } } (void)TargetScope.Privatize(); // Build list of dependences. @@ -4269,8 +4277,10 @@ CGF.GetAddrOfLocalVar(PVD), /*Index=*/0); InputInfo.SizesArray = CGF.Builder.CreateConstArrayGEP( CGF.GetAddrOfLocalVar(SVD), /*Index=*/0); - InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP( - CGF.GetAddrOfLocalVar(MVD), /*Index=*/0); + // MVD can be nullptr if there is no user-defined mapper + if (MVD) + InputInfo.MappersArray = CGF.Builder.CreateConstArrayGEP( + CGF.GetAddrOfLocalVar(MVD), /*Index=*/0); } Action.Enter(CGF);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits