Unverified Commit 7b62dd1a authored by Sergio Afonso's avatar Sergio Afonso Committed by GitHub
Browse files

[OpenMP][OMPIRBuilder] Add device shared memory allocation support (#150923)

This patch adds the `__kmpc_alloc_shared` and `__kmpc_free_shared`
DeviceRTL functions to the list of those the OMPIRBuilder is able to
create.
parent aafba1db
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -3237,6 +3237,29 @@ public:
  LLVM_ABI CallInst *createOMPFree(const LocationDescription &Loc, Value *Addr,
                                   Value *Allocator, std::string Name = "");

  /// Create a runtime call for kmpc_alloc_shared.
  ///
  /// \param Loc The insert and source location description.
  /// \param VarType Type of variable to be allocated.
  /// \param Name Name of call Instruction.
  ///
  /// \returns CallInst to the kmpc_alloc_shared call.
  LLVM_ABI CallInst *createOMPAllocShared(const LocationDescription &Loc,
                                          Type *VarType,
                                          const Twine &Name = Twine(""));

  /// Create a runtime call for kmpc_free_shared.
  ///
  /// \param Loc The insert and source location description.
  /// \param Addr Value obtained from the corresponding kmpc_alloc_shared call.
  /// \param VarType Type of variable to be freed.
  /// \param Name Name of call Instruction.
  ///
  /// \returns CallInst to the kmpc_free_shared call.
  LLVM_ABI CallInst *createOMPFreeShared(const LocationDescription &Loc,
                                         Value *Addr, Type *VarType,
                                         const Twine &Name = Twine(""));

  /// Create a runtime call for kmpc_threadprivate_cached
  ///
  /// \param Loc The insert and source location description.
+27 −0
Original line number Diff line number Diff line
@@ -7726,6 +7726,33 @@ CallInst *OpenMPIRBuilder::createOMPFree(const LocationDescription &Loc,
  return createRuntimeFunctionCall(Fn, Args, Name);
}

CallInst *OpenMPIRBuilder::createOMPAllocShared(const LocationDescription &Loc,
                                                Type *VarType,
                                                const Twine &Name) {
  IRBuilder<>::InsertPointGuard IPG(Builder);
  updateToLocation(Loc);

  const DataLayout &DL = M.getDataLayout();
  Value *Args[] = {Builder.getInt64(DL.getTypeAllocSize(VarType))};
  Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_alloc_shared);
  CallInst *Call = Builder.CreateCall(Fn, Args, Name);
  Call->addRetAttr(
      Attribute::getWithAlignment(M.getContext(), DL.getPrefTypeAlign(Int64)));
  return Call;
}

CallInst *OpenMPIRBuilder::createOMPFreeShared(const LocationDescription &Loc,
                                               Value *Addr, Type *VarType,
                                               const Twine &Name) {
  IRBuilder<>::InsertPointGuard IPG(Builder);
  updateToLocation(Loc);

  Value *Args[] = {
      Addr, Builder.getInt64(M.getDataLayout().getTypeAllocSize(VarType))};
  Function *Fn = getOrCreateRuntimeFunctionPtr(OMPRTL___kmpc_free_shared);
  return Builder.CreateCall(Fn, Args, Name);
}

CallInst *OpenMPIRBuilder::createOMPInteropInit(
    const LocationDescription &Loc, Value *InteropVar,
    omp::OMPInteropType InteropType, Value *Device, Value *NumDependences,