================ @@ -1102,12 +1102,64 @@ struct DeferredStore { }; } // namespace +/// Check whether allocations for the given operation might potentially have to +/// be done in device shared memory. That means we're compiling for a offloading +/// target, the operation is an `omp::TargetOp` or nested inside of one and that +/// target region represents a Generic (non-SPMD) kernel. +/// +/// This represents a necessary but not sufficient set of conditions to use +/// device shared memory in place of regular allocas. Depending on the variable, +/// its uses or the associated OpenMP construct might also need to be taken into +/// account. +static bool +mightAllocInDeviceSharedMemory(Operation &op, + const llvm::OpenMPIRBuilder &ompBuilder) { + if (!ompBuilder.Config.isTargetDevice()) + return false; + + auto targetOp = dyn_cast<omp::TargetOp>(op); + if (!targetOp) + targetOp = op.getParentOfType<omp::TargetOp>(); + + return targetOp && + !bitEnumContainsAny( + targetOp.getKernelExecFlags(targetOp.getInnermostCapturedOmpOp()), + omp::TargetRegionFlags::spmd); +} + +/// Check whether the entry block argument representing the private copy of a +/// variable in an OpenMP construct must be allocated in device shared memory, +/// based on what the uses of that copy are. +/// +/// This must only be called if a previous call to +/// \c mightAllocInDeviceSharedMemory has already returned \c true for the +/// operation that owns the specified block argument. +static bool mustAllocPrivateVarInDeviceSharedMemory(BlockArgument value) { + Operation *parentOp = value.getOwner()->getParentOp(); + auto targetOp = dyn_cast<omp::TargetOp>(parentOp); ---------------- Meinersbur wrote:
```suggestion auto *targetOp = dyn_cast<omp::TargetOp>(parentOp); ``` https://github.com/llvm/llvm-project/pull/150924 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits