Skip to content

Commit 6bba19e

Browse files
committed
[MLIR][OpenMP] Add LLVM translation support for OpenMP UserDefinedMappers
This patch adds OpenMPToLLVMIRTranslation support for the OpenMP Declare Mapper directive. Since both MLIR and Clang now support custom mappers, I've made the relative params required instead of optional as well. Depends on #121005
1 parent 8a90d20 commit 6bba19e

File tree

7 files changed

+443
-121
lines changed

7 files changed

+443
-121
lines changed

clang/lib/CodeGen/CGOpenMPRuntime.cpp

+12-8
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,12 @@
3232
#include "llvm/Bitcode/BitcodeReader.h"
3333
#include "llvm/IR/Constants.h"
3434
#include "llvm/IR/DerivedTypes.h"
35+
#include "llvm/IR/Function.h"
3536
#include "llvm/IR/GlobalValue.h"
3637
#include "llvm/IR/InstrTypes.h"
3738
#include "llvm/IR/Value.h"
3839
#include "llvm/Support/AtomicOrdering.h"
40+
#include "llvm/Support/Error.h"
3941
#include "llvm/Support/raw_ostream.h"
4042
#include <cassert>
4143
#include <cstdint>
@@ -8888,8 +8890,8 @@ static void emitOffloadingArraysAndArgs(
88888890
return MFunc;
88898891
};
88908892
OMPBuilder.emitOffloadingArraysAndArgs(
8891-
AllocaIP, CodeGenIP, Info, Info.RTArgs, CombinedInfo, IsNonContiguous,
8892-
ForEndCall, DeviceAddrCB, CustomMapperCB);
8893+
AllocaIP, CodeGenIP, Info, Info.RTArgs, CombinedInfo, CustomMapperCB,
8894+
IsNonContiguous, ForEndCall, DeviceAddrCB);
88938895
}
88948896

88958897
/// Check for inner distribute directive.
@@ -9098,9 +9100,10 @@ void CGOpenMPRuntime::emitUserDefinedMapper(const OMPDeclareMapperDecl *D,
90989100
CGM.getCXXABI().getMangleContext().mangleCanonicalTypeName(Ty, Out);
90999101
std::string Name = getName({"omp_mapper", TyStr, D->getName()});
91009102

9101-
auto *NewFn = OMPBuilder.emitUserDefinedMapper(PrivatizeAndGenMapInfoCB,
9102-
ElemTy, Name, CustomMapperCB);
9103-
UDMMap.try_emplace(D, NewFn);
9103+
llvm::Expected<llvm::Function *> NewFn = OMPBuilder.emitUserDefinedMapper(
9104+
PrivatizeAndGenMapInfoCB, ElemTy, Name, CustomMapperCB);
9105+
assert(NewFn && "Unexpected error in emitUserDefinedMapper");
9106+
UDMMap.try_emplace(D, *NewFn);
91049107
if (CGF)
91059108
FunctionUDMMap[CGF->CurFn].push_back(D);
91069109
}
@@ -10092,9 +10095,10 @@ void CGOpenMPRuntime::emitTargetDataCalls(
1009210095
CGF.Builder.GetInsertPoint());
1009310096
llvm::OpenMPIRBuilder::LocationDescription OmpLoc(CodeGenIP);
1009410097
llvm::OpenMPIRBuilder::InsertPointOrErrorTy AfterIP =
10095-
OMPBuilder.createTargetData(
10096-
OmpLoc, AllocaIP, CodeGenIP, DeviceID, IfCondVal, Info, GenMapInfoCB,
10097-
/*MapperFunc=*/nullptr, BodyCB, DeviceAddrCB, CustomMapperCB, RTLoc);
10098+
OMPBuilder.createTargetData(OmpLoc, AllocaIP, CodeGenIP, DeviceID,
10099+
IfCondVal, Info, GenMapInfoCB, CustomMapperCB,
10100+
/*MapperFunc=*/nullptr, BodyCB, DeviceAddrCB,
10101+
RTLoc);
1009810102
assert(AfterIP && "unexpected error creating target data");
1009910103
CGF.Builder.restoreIP(*AfterIP);
1010010104
}

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

+28-21
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "llvm/IR/IRBuilder.h"
2323
#include "llvm/IR/Module.h"
2424
#include "llvm/Support/Allocator.h"
25+
#include "llvm/Support/Error.h"
2526
#include "llvm/TargetParser/Triple.h"
2627
#include <forward_list>
2728
#include <map>
@@ -2355,6 +2356,7 @@ class OpenMPIRBuilder {
23552356
CurInfo.NonContigInfo.Strides.end());
23562357
}
23572358
};
2359+
using MapInfosOrErrorTy = Expected<MapInfosTy &>;
23582360

23592361
/// Callback function type for functions emitting the host fallback code that
23602362
/// is executed when the kernel launch fails. It takes an insertion point as
@@ -2431,9 +2433,9 @@ class OpenMPIRBuilder {
24312433
/// including base pointers, pointers, sizes, map types, user-defined mappers.
24322434
void emitOffloadingArrays(
24332435
InsertPointTy AllocaIP, InsertPointTy CodeGenIP, MapInfosTy &CombinedInfo,
2434-
TargetDataInfo &Info, bool IsNonContiguous = false,
2435-
function_ref<void(unsigned int, Value *)> DeviceAddrCB = nullptr,
2436-
function_ref<Value *(unsigned int)> CustomMapperCB = nullptr);
2436+
TargetDataInfo &Info, function_ref<Value *(unsigned int)> CustomMapperCB,
2437+
bool IsNonContiguous = false,
2438+
function_ref<void(unsigned int, Value *)> DeviceAddrCB = nullptr);
24372439

24382440
/// Allocates memory for and populates the arrays required for offloading
24392441
/// (offload_{baseptrs|ptrs|mappers|sizes|maptypes|mapnames}). Then, it
@@ -2444,9 +2446,9 @@ class OpenMPIRBuilder {
24442446
void emitOffloadingArraysAndArgs(
24452447
InsertPointTy AllocaIP, InsertPointTy CodeGenIP, TargetDataInfo &Info,
24462448
TargetDataRTArgs &RTArgs, MapInfosTy &CombinedInfo,
2449+
function_ref<Value *(unsigned int)> CustomMapperCB,
24472450
bool IsNonContiguous = false, bool ForEndCall = false,
2448-
function_ref<void(unsigned int, Value *)> DeviceAddrCB = nullptr,
2449-
function_ref<Value *(unsigned int)> CustomMapperCB = nullptr);
2451+
function_ref<void(unsigned int, Value *)> DeviceAddrCB = nullptr);
24502452

24512453
/// Creates offloading entry for the provided entry ID \a ID, address \a
24522454
/// Addr, size \a Size, and flags \a Flags.
@@ -2911,12 +2913,12 @@ class OpenMPIRBuilder {
29112913
/// \param FuncName Optional param to specify mapper function name.
29122914
/// \param CustomMapperCB Optional callback to generate code related to
29132915
/// custom mappers.
2914-
Function *emitUserDefinedMapper(
2915-
function_ref<MapInfosTy &(InsertPointTy CodeGenIP, llvm::Value *PtrPHI,
2916-
llvm::Value *BeginArg)>
2916+
Expected<Function *> emitUserDefinedMapper(
2917+
function_ref<MapInfosOrErrorTy(
2918+
InsertPointTy CodeGenIP, llvm::Value *PtrPHI, llvm::Value *BeginArg)>
29172919
PrivAndGenMapInfoCB,
29182920
llvm::Type *ElemTy, StringRef FuncName,
2919-
function_ref<bool(unsigned int, Function **)> CustomMapperCB = nullptr);
2921+
function_ref<bool(unsigned int, Function **)> CustomMapperCB);
29202922

29212923
/// Generator for '#omp target data'
29222924
///
@@ -2930,21 +2932,21 @@ class OpenMPIRBuilder {
29302932
/// \param IfCond Value which corresponds to the if clause condition.
29312933
/// \param Info Stores all information realted to the Target Data directive.
29322934
/// \param GenMapInfoCB Callback that populates the MapInfos and returns.
2935+
/// \param CustomMapperCB Callback to generate code related to
2936+
/// custom mappers.
29332937
/// \param BodyGenCB Optional Callback to generate the region code.
29342938
/// \param DeviceAddrCB Optional callback to generate code related to
29352939
/// use_device_ptr and use_device_addr.
2936-
/// \param CustomMapperCB Optional callback to generate code related to
2937-
/// custom mappers.
29382940
InsertPointOrErrorTy createTargetData(
29392941
const LocationDescription &Loc, InsertPointTy AllocaIP,
29402942
InsertPointTy CodeGenIP, Value *DeviceID, Value *IfCond,
29412943
TargetDataInfo &Info, GenMapInfoCallbackTy GenMapInfoCB,
2944+
function_ref<Value *(unsigned int)> CustomMapperCB,
29422945
omp::RuntimeFunction *MapperFunc = nullptr,
29432946
function_ref<InsertPointOrErrorTy(InsertPointTy CodeGenIP,
29442947
BodyGenTy BodyGenType)>
29452948
BodyGenCB = nullptr,
29462949
function_ref<void(unsigned int, Value *)> DeviceAddrCB = nullptr,
2947-
function_ref<Value *(unsigned int)> CustomMapperCB = nullptr,
29482950
Value *SrcLocInfo = nullptr);
29492951

29502952
using TargetBodyGenCallbackTy = function_ref<InsertPointOrErrorTy(
@@ -2960,6 +2962,7 @@ class OpenMPIRBuilder {
29602962
/// \param IsOffloadEntry whether it is an offload entry.
29612963
/// \param CodeGenIP The insertion point where the call to the outlined
29622964
/// function should be emitted.
2965+
/// \param Info Stores all information realted to the Target directive.
29632966
/// \param EntryInfo The entry information about the function.
29642967
/// \param NumTeams Number of teams specified in the num_teams clause.
29652968
/// \param NumThreads Number of teams specified in the thread_limit clause.
@@ -2968,18 +2971,22 @@ class OpenMPIRBuilder {
29682971
/// \param BodyGenCB Callback that will generate the region code.
29692972
/// \param ArgAccessorFuncCB Callback that will generate accessors
29702973
/// instructions for passed in target arguments where neccessary
2974+
/// \param CustomMapperCB Callback to generate code related to
2975+
/// custom mappers.
29712976
/// \param Dependencies A vector of DependData objects that carry
29722977
// dependency information as passed in the depend clause
29732978
// \param HasNowait Whether the target construct has a `nowait` clause or not.
2974-
InsertPointOrErrorTy createTarget(
2975-
const LocationDescription &Loc, bool IsOffloadEntry,
2976-
OpenMPIRBuilder::InsertPointTy AllocaIP,
2977-
OpenMPIRBuilder::InsertPointTy CodeGenIP,
2978-
TargetRegionEntryInfo &EntryInfo, ArrayRef<int32_t> NumTeams,
2979-
ArrayRef<int32_t> NumThreads, SmallVectorImpl<Value *> &Inputs,
2980-
GenMapInfoCallbackTy GenMapInfoCB, TargetBodyGenCallbackTy BodyGenCB,
2981-
TargetGenArgAccessorsCallbackTy ArgAccessorFuncCB,
2982-
SmallVector<DependData> Dependencies = {}, bool HasNowait = false);
2979+
InsertPointOrErrorTy
2980+
createTarget(const LocationDescription &Loc, bool IsOffloadEntry,
2981+
OpenMPIRBuilder::InsertPointTy AllocaIP,
2982+
OpenMPIRBuilder::InsertPointTy CodeGenIP, TargetDataInfo &Info,
2983+
TargetRegionEntryInfo &EntryInfo, ArrayRef<int32_t> NumTeams,
2984+
ArrayRef<int32_t> NumThreads, SmallVectorImpl<Value *> &Inputs,
2985+
GenMapInfoCallbackTy GenMapInfoCB,
2986+
TargetBodyGenCallbackTy BodyGenCB,
2987+
TargetGenArgAccessorsCallbackTy ArgAccessorFuncCB,
2988+
function_ref<Value *(unsigned int)> CustomMapperCB,
2989+
SmallVector<DependData> Dependencies, bool HasNowait);
29832990

29842991
/// Returns __kmpc_for_static_init_* runtime function for the specified
29852992
/// size \a IVSize and sign \a IVSigned. Will create a distribute call

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

+41-37
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "llvm/IR/Value.h"
4848
#include "llvm/MC/TargetRegistry.h"
4949
#include "llvm/Support/CommandLine.h"
50+
#include "llvm/Support/Error.h"
5051
#include "llvm/Support/ErrorHandling.h"
5152
#include "llvm/Support/FileSystem.h"
5253
#include "llvm/Target/TargetMachine.h"
@@ -6480,12 +6481,12 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTargetData(
64806481
const LocationDescription &Loc, InsertPointTy AllocaIP,
64816482
InsertPointTy CodeGenIP, Value *DeviceID, Value *IfCond,
64826483
TargetDataInfo &Info, GenMapInfoCallbackTy GenMapInfoCB,
6484+
function_ref<Value *(unsigned int)> CustomMapperCB,
64836485
omp::RuntimeFunction *MapperFunc,
64846486
function_ref<InsertPointOrErrorTy(InsertPointTy CodeGenIP,
64856487
BodyGenTy BodyGenType)>
64866488
BodyGenCB,
6487-
function_ref<void(unsigned int, Value *)> DeviceAddrCB,
6488-
function_ref<Value *(unsigned int)> CustomMapperCB, Value *SrcLocInfo) {
6489+
function_ref<void(unsigned int, Value *)> DeviceAddrCB, Value *SrcLocInfo) {
64896490
if (!updateToLocation(Loc))
64906491
return InsertPointTy();
64916492

@@ -6511,8 +6512,8 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTargetData(
65116512
InsertPointTy CodeGenIP) -> Error {
65126513
MapInfo = &GenMapInfoCB(Builder.saveIP());
65136514
emitOffloadingArrays(AllocaIP, Builder.saveIP(), *MapInfo, Info,
6514-
/*IsNonContiguous=*/true, DeviceAddrCB,
6515-
CustomMapperCB);
6515+
CustomMapperCB,
6516+
/*IsNonContiguous=*/true, DeviceAddrCB);
65166517

65176518
TargetDataRTArgs RTArgs;
65186519
emitOffloadingArraysArgument(Builder, RTArgs, Info);
@@ -7304,22 +7305,24 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitTargetTask(
73047305

73057306
void OpenMPIRBuilder::emitOffloadingArraysAndArgs(
73067307
InsertPointTy AllocaIP, InsertPointTy CodeGenIP, TargetDataInfo &Info,
7307-
TargetDataRTArgs &RTArgs, MapInfosTy &CombinedInfo, bool IsNonContiguous,
7308-
bool ForEndCall, function_ref<void(unsigned int, Value *)> DeviceAddrCB,
7309-
function_ref<Value *(unsigned int)> CustomMapperCB) {
7310-
emitOffloadingArrays(AllocaIP, CodeGenIP, CombinedInfo, Info, IsNonContiguous,
7311-
DeviceAddrCB, CustomMapperCB);
7308+
TargetDataRTArgs &RTArgs, MapInfosTy &CombinedInfo,
7309+
function_ref<Value *(unsigned int)> CustomMapperCB, bool IsNonContiguous,
7310+
bool ForEndCall, function_ref<void(unsigned int, Value *)> DeviceAddrCB) {
7311+
emitOffloadingArrays(AllocaIP, CodeGenIP, CombinedInfo, Info, CustomMapperCB,
7312+
IsNonContiguous, DeviceAddrCB);
73127313
emitOffloadingArraysArgument(Builder, RTArgs, Info, ForEndCall);
73137314
}
73147315

73157316
static void
73167317
emitTargetCall(OpenMPIRBuilder &OMPBuilder, IRBuilderBase &Builder,
7317-
OpenMPIRBuilder::InsertPointTy AllocaIP, Function *OutlinedFn,
7318+
OpenMPIRBuilder::InsertPointTy AllocaIP,
7319+
OpenMPIRBuilder::TargetDataInfo &Info, Function *OutlinedFn,
73187320
Constant *OutlinedFnID, ArrayRef<int32_t> NumTeams,
73197321
ArrayRef<int32_t> NumThreads, SmallVectorImpl<Value *> &Args,
73207322
OpenMPIRBuilder::GenMapInfoCallbackTy GenMapInfoCB,
7321-
SmallVector<llvm::OpenMPIRBuilder::DependData> Dependencies = {},
7322-
bool HasNoWait = false) {
7323+
function_ref<Value *(unsigned int)> CustomMapperCB,
7324+
SmallVector<llvm::OpenMPIRBuilder::DependData> Dependencies,
7325+
bool HasNoWait) {
73237326
// Generate a function call to the host fallback implementation of the target
73247327
// region. This is called by the host when no offload entry was generated for
73257328
// the target region and when the offloading call fails at runtime.
@@ -7384,14 +7387,10 @@ emitTargetCall(OpenMPIRBuilder &OMPBuilder, IRBuilderBase &Builder,
73847387
return;
73857388
}
73867389

7387-
OpenMPIRBuilder::TargetDataInfo Info(
7388-
/*RequiresDevicePointerInfo=*/false,
7389-
/*SeparateBeginEndCalls=*/true);
7390-
73917390
OpenMPIRBuilder::MapInfosTy &MapInfo = GenMapInfoCB(Builder.saveIP());
73927391
OpenMPIRBuilder::TargetDataRTArgs RTArgs;
73937392
OMPBuilder.emitOffloadingArraysAndArgs(AllocaIP, Builder.saveIP(), Info,
7394-
RTArgs, MapInfo,
7393+
RTArgs, MapInfo, CustomMapperCB,
73957394
/*IsNonContiguous=*/true,
73967395
/*ForEndCall=*/false);
73977396

@@ -7439,11 +7438,13 @@ emitTargetCall(OpenMPIRBuilder &OMPBuilder, IRBuilderBase &Builder,
74397438

74407439
OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTarget(
74417440
const LocationDescription &Loc, bool IsOffloadEntry, InsertPointTy AllocaIP,
7442-
InsertPointTy CodeGenIP, TargetRegionEntryInfo &EntryInfo,
7443-
ArrayRef<int32_t> NumTeams, ArrayRef<int32_t> NumThreads,
7444-
SmallVectorImpl<Value *> &Args, GenMapInfoCallbackTy GenMapInfoCB,
7441+
InsertPointTy CodeGenIP, TargetDataInfo &Info,
7442+
TargetRegionEntryInfo &EntryInfo, ArrayRef<int32_t> NumTeams,
7443+
ArrayRef<int32_t> NumThreads, SmallVectorImpl<Value *> &Inputs,
7444+
GenMapInfoCallbackTy GenMapInfoCB,
74457445
OpenMPIRBuilder::TargetBodyGenCallbackTy CBFunc,
74467446
OpenMPIRBuilder::TargetGenArgAccessorsCallbackTy ArgAccessorFuncCB,
7447+
function_ref<Value *(unsigned int)> CustomMapperCB,
74477448
SmallVector<DependData> Dependencies, bool HasNowait) {
74487449

74497450
if (!updateToLocation(Loc))
@@ -7458,15 +7459,16 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::createTarget(
74587459
// and ArgAccessorFuncCB
74597460
if (Error Err = emitTargetOutlinedFunction(
74607461
*this, Builder, IsOffloadEntry, EntryInfo, OutlinedFn, OutlinedFnID,
7461-
Args, CBFunc, ArgAccessorFuncCB))
7462+
Inputs, CBFunc, ArgAccessorFuncCB))
74627463
return Err;
74637464

74647465
// If we are not on the target device, then we need to generate code
74657466
// to make a remote call (offload) to the previously outlined function
74667467
// that represents the target region. Do that now.
74677468
if (!Config.isTargetDevice())
7468-
emitTargetCall(*this, Builder, AllocaIP, OutlinedFn, OutlinedFnID, NumTeams,
7469-
NumThreads, Args, GenMapInfoCB, Dependencies, HasNowait);
7469+
emitTargetCall(*this, Builder, AllocaIP, Info, OutlinedFn, OutlinedFnID,
7470+
NumTeams, NumThreads, Inputs, GenMapInfoCB, CustomMapperCB,
7471+
Dependencies, HasNowait);
74707472
return Builder.saveIP();
74717473
}
74727474

@@ -7791,9 +7793,9 @@ void OpenMPIRBuilder::emitUDMapperArrayInitOrDel(
77917793
OffloadingArgs);
77927794
}
77937795

7794-
Function *OpenMPIRBuilder::emitUserDefinedMapper(
7795-
function_ref<MapInfosTy &(InsertPointTy CodeGenIP, llvm::Value *PtrPHI,
7796-
llvm::Value *BeginArg)>
7796+
Expected<Function *> OpenMPIRBuilder::emitUserDefinedMapper(
7797+
function_ref<MapInfosOrErrorTy(InsertPointTy CodeGenIP, llvm::Value *PtrPHI,
7798+
llvm::Value *BeginArg)>
77977799
GenMapInfoCB,
77987800
Type *ElemTy, StringRef FuncName,
77997801
function_ref<bool(unsigned int, Function **)> CustomMapperCB) {
@@ -7867,7 +7869,9 @@ Function *OpenMPIRBuilder::emitUserDefinedMapper(
78677869
PtrPHI->addIncoming(PtrBegin, HeadBB);
78687870

78697871
// Get map clause information. Fill up the arrays with all mapped variables.
7870-
MapInfosTy &Info = GenMapInfoCB(Builder.saveIP(), PtrPHI, BeginIn);
7872+
MapInfosOrErrorTy Info = GenMapInfoCB(Builder.saveIP(), PtrPHI, BeginIn);
7873+
if (!Info)
7874+
return Info.takeError();
78717875

78727876
// Call the runtime API __tgt_mapper_num_components to get the number of
78737877
// pre-existing components.
@@ -7879,20 +7883,20 @@ Function *OpenMPIRBuilder::emitUserDefinedMapper(
78797883
Builder.CreateShl(PreviousSize, Builder.getInt64(getFlagMemberOffset()));
78807884

78817885
// Fill up the runtime mapper handle for all components.
7882-
for (unsigned I = 0; I < Info.BasePointers.size(); ++I) {
7886+
for (unsigned I = 0; I < Info->BasePointers.size(); ++I) {
78837887
Value *CurBaseArg =
7884-
Builder.CreateBitCast(Info.BasePointers[I], Builder.getPtrTy());
7888+
Builder.CreateBitCast(Info->BasePointers[I], Builder.getPtrTy());
78857889
Value *CurBeginArg =
7886-
Builder.CreateBitCast(Info.Pointers[I], Builder.getPtrTy());
7887-
Value *CurSizeArg = Info.Sizes[I];
7888-
Value *CurNameArg = Info.Names.size()
7889-
? Info.Names[I]
7890+
Builder.CreateBitCast(Info->Pointers[I], Builder.getPtrTy());
7891+
Value *CurSizeArg = Info->Sizes[I];
7892+
Value *CurNameArg = Info->Names.size()
7893+
? Info->Names[I]
78907894
: Constant::getNullValue(Builder.getPtrTy());
78917895

78927896
// Extract the MEMBER_OF field from the map type.
78937897
Value *OriMapType = Builder.getInt64(
78947898
static_cast<std::underlying_type_t<OpenMPOffloadMappingFlags>>(
7895-
Info.Types[I]));
7899+
Info->Types[I]));
78967900
Value *MemberMapType =
78977901
Builder.CreateNUWAdd(OriMapType, ShiftedPreviousSize);
78987902

@@ -8013,9 +8017,9 @@ Function *OpenMPIRBuilder::emitUserDefinedMapper(
80138017

80148018
void OpenMPIRBuilder::emitOffloadingArrays(
80158019
InsertPointTy AllocaIP, InsertPointTy CodeGenIP, MapInfosTy &CombinedInfo,
8016-
TargetDataInfo &Info, bool IsNonContiguous,
8017-
function_ref<void(unsigned int, Value *)> DeviceAddrCB,
8018-
function_ref<Value *(unsigned int)> CustomMapperCB) {
8020+
TargetDataInfo &Info, function_ref<Value *(unsigned int)> CustomMapperCB,
8021+
bool IsNonContiguous,
8022+
function_ref<void(unsigned int, Value *)> DeviceAddrCB) {
80198023

80208024
// Reset the array information.
80218025
Info.clearArrayInfo();

0 commit comments

Comments
 (0)