================
@@ -1168,11 +1154,43 @@ bool CodeGenFunction::EmitOMPFirstprivateClause(const
OMPExecutableDirective &D,
const auto *IRef = C->varlist_begin();
const auto *InitsRef = C->inits().begin();
for (const Expr *IInit : C->private_copies()) {
- const auto *OrigVD = cast<VarDecl>(cast<DeclRefExpr>(*IRef)->getDecl());
+ const auto *OrigDecl = cast<DeclRefExpr>(*IRef)->getDecl();
+ const VarDecl *OrigVD = dyn_cast<VarDecl>(OrigDecl);
+ const auto *VD = cast<VarDecl>(cast<DeclRefExpr>(IInit)->getDecl());
+
+ if (const auto *BD = dyn_cast<BindingDecl>(OrigDecl)) {
+ // Check if this binding is also lastprivate.
+ bool ThisFirstprivateIsLastprivate =
+ Lastprivates.count(BD->getCanonicalDecl()) > 0;
+ const auto *VDInit =
+ cast<VarDecl>(cast<DeclRefExpr>(*InitsRef)->getDecl());
+ DeclRefExpr DRE(getContext(), const_cast<BindingDecl *>(BD),
+ /*RefersToEnclosingVariableOrCapture=*/true,
+ BD->getType(), VK_LValue, (*IRef)->getExprLoc());
+ LValue OriginalLVal = EmitLValue(&DRE);
+ Address OriginalAddr = OriginalLVal.getAddress();
+ // Emit private VarDecl with copy init. Remap VDInit to point to the
+ // original binding so EmitDecl properly initializes VD.
+ setAddrOfLocalVar(VDInit, OriginalAddr);
+ EmitDecl(*VD);
+ LocalDeclMap.erase(VDInit);
+ Address VDAddr = GetAddrOfLocalVar(VD);
+ bool IsRegistered = PrivateScope.addPrivate(BD, VDAddr);
+ assert(IsRegistered &&
+ "firstprivate var already registered as firstprivate");
+ (void)IsRegistered;
+ FirstprivateIsLastprivate =
+ FirstprivateIsLastprivate || ThisFirstprivateIsLastprivate;
----------------
zahiraam wrote:
For `BindingDecls`, the feature is currently blocked by a Sema crash in
`ActOnOpenMPLastprivateClause` when a `BindingDecl` is in both clauses. I've
kept it as defensive programming for when that's fixed in a subsequent PR.
https://github.com/llvm/llvm-project/pull/190832
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits