forked from OSchip/llvm-project
[OPENMP]Do no privatize const firstprivates in target regions.
No need to emit private copyfor firstprivate constants in target regions, we can use the original copy instead. Differential Revision: https://reviews.llvm.org/D105647
This commit is contained in:
parent
0d74fd3fdf
commit
f57d396dca
|
@ -786,6 +786,9 @@ bool CodeGenFunction::EmitOMPFirstprivateClause(const OMPExecutableDirective &D,
|
|||
OMPPrivateScope &PrivateScope) {
|
||||
if (!HaveInsertPoint())
|
||||
return false;
|
||||
bool DeviceConstTarget =
|
||||
getLangOpts().OpenMPIsDevice &&
|
||||
isOpenMPTargetExecutionDirective(D.getDirectiveKind());
|
||||
bool FirstprivateIsLastprivate = false;
|
||||
llvm::DenseMap<const VarDecl *, OpenMPLastprivateModifier> Lastprivates;
|
||||
for (const auto *C : D.getClausesOfKind<OMPLastprivateClause>()) {
|
||||
|
@ -818,6 +821,16 @@ bool CodeGenFunction::EmitOMPFirstprivateClause(const OMPExecutableDirective &D,
|
|||
++InitsRef;
|
||||
continue;
|
||||
}
|
||||
// Do not emit copy for firstprivate constant variables in target regions,
|
||||
// captured by reference.
|
||||
if (DeviceConstTarget && OrigVD->getType().isConstant(getContext()) &&
|
||||
FD && FD->getType()->isReferenceType() &&
|
||||
(!VD || !VD->hasAttr<OMPAllocateDeclAttr>())) {
|
||||
EmittedAsFirstprivate.insert(OrigVD->getCanonicalDecl());
|
||||
++IRef;
|
||||
++InitsRef;
|
||||
continue;
|
||||
}
|
||||
FirstprivateIsLastprivate =
|
||||
FirstprivateIsLastprivate || ThisFirstprivateIsLastprivate;
|
||||
if (EmittedAsFirstprivate.insert(OrigVD->getCanonicalDecl()).second) {
|
||||
|
|
|
@ -35,7 +35,7 @@ int foo(int n, double *ptr) {
|
|||
|
||||
// TCHECK: define {{.*}}void @__omp_offloading_{{.+}}([10 x float] addrspace(1)* noalias [[B_IN:%.+]], i{{[0-9]+}} [[A_IN:%.+]], [[TTII]]* noalias [[E_IN:%.+]])
|
||||
// TCHECK: [[A_ADDR:%.+]] = alloca i{{[0-9]+}},
|
||||
// TCHECK: alloca [[TTII]],
|
||||
// TCHECK-NOT: alloca [[TTII]],
|
||||
// TCHECK: alloca i{{[0-9]+}},
|
||||
// TCHECK: store i{{[0-9]+}} [[A_IN]], i{{[0-9]+}}* [[A_ADDR]],
|
||||
// TCHECK: ret void
|
||||
|
|
|
@ -366,7 +366,7 @@ int foo(int n, double *ptr) {
|
|||
|
||||
// TCHECK: define weak void @__omp_offloading_{{.+}}(double* [[PTR_IN:%.+]], [[TTII]]* nonnull align {{[0-9]+}} dereferenceable({{[0-9]+}}) [[E:%.+]])
|
||||
// TCHECK: [[PTR_ADDR:%.+]] = alloca double*,
|
||||
// TCHECK: alloca [[TTII]],
|
||||
// TCHECK-NOT: alloca [[TTII]],
|
||||
// TCHECK-NOT: alloca double*,
|
||||
// TCHECK: store double* [[PTR_IN]], double** [[PTR_ADDR]],
|
||||
// TCHECK-NOT: store double* %
|
||||
|
|
Loading…
Reference in New Issue