[OPENMP] Rename methods of OpenMPRuntime class. NFC.
llvm-svn: 230470
This commit is contained in:
parent
3f02403b3a
commit
3eff5f46d7
|
@ -141,7 +141,7 @@ void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl &D,
|
|||
|
||||
if (!T->isReferenceType()) {
|
||||
if (getLangOpts().OpenMP && D.hasAttr<OMPThreadPrivateDeclAttr>())
|
||||
(void)CGM.getOpenMPRuntime().EmitOMPThreadPrivateVarDefinition(
|
||||
(void)CGM.getOpenMPRuntime().emitThreadPrivateVarDefinition(
|
||||
&D, DeclPtr, D.getAttr<OMPThreadPrivateDeclAttr>()->getLocation(),
|
||||
PerformInit, this);
|
||||
if (PerformInit)
|
||||
|
|
|
@ -1813,7 +1813,7 @@ EmitBitCastOfLValueToProperType(CodeGenFunction &CGF,
|
|||
static LValue EmitThreadPrivateVarDeclLValue(
|
||||
CodeGenFunction &CGF, const VarDecl *VD, QualType T, llvm::Value *V,
|
||||
llvm::Type *RealVarTy, CharUnits Alignment, SourceLocation Loc) {
|
||||
V = CGF.CGM.getOpenMPRuntime().getOMPAddrOfThreadPrivate(CGF, VD, V, Loc);
|
||||
V = CGF.CGM.getOpenMPRuntime().getAddrOfThreadPrivate(CGF, VD, V, Loc);
|
||||
V = EmitBitCastOfLValueToProperType(CGF, V, RealVarTy);
|
||||
return CGF.MakeAddrLValue(V, T, Alignment);
|
||||
}
|
||||
|
|
|
@ -75,8 +75,8 @@ void CGOpenMPRegionInfo::EmitBody(CodeGenFunction &CGF, Stmt *S) {
|
|||
CGF.EmitOMPFirstprivateClause(Directive, PrivateScope);
|
||||
if (PrivateScope.Privatize())
|
||||
// Emit implicit barrier to synchronize threads and avoid data races.
|
||||
CGF.CGM.getOpenMPRuntime().EmitOMPBarrierCall(CGF, Directive.getLocStart(),
|
||||
/*IsExplicit=*/false);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(CGF, Directive.getLocStart(),
|
||||
/*IsExplicit=*/false);
|
||||
CGCapturedStmtInfo::EmitBody(CGF, S);
|
||||
}
|
||||
|
||||
|
@ -94,8 +94,8 @@ CGOpenMPRuntime::CGOpenMPRuntime(CodeGenModule &CGM)
|
|||
}
|
||||
|
||||
llvm::Value *
|
||||
CGOpenMPRuntime::EmitOpenMPOutlinedFunction(const OMPExecutableDirective &D,
|
||||
const VarDecl *ThreadIDVar) {
|
||||
CGOpenMPRuntime::emitOutlinedFunction(const OMPExecutableDirective &D,
|
||||
const VarDecl *ThreadIDVar) {
|
||||
const CapturedStmt *CS = cast<CapturedStmt>(D.getAssociatedStmt());
|
||||
CodeGenFunction CGF(CGM, true);
|
||||
CGOpenMPRegionInfo CGInfo(D, *CS, ThreadIDVar);
|
||||
|
@ -104,7 +104,7 @@ CGOpenMPRuntime::EmitOpenMPOutlinedFunction(const OMPExecutableDirective &D,
|
|||
}
|
||||
|
||||
llvm::Value *
|
||||
CGOpenMPRuntime::GetOrCreateDefaultOpenMPLocation(OpenMPLocationFlags Flags) {
|
||||
CGOpenMPRuntime::getOrCreateDefaultLocation(OpenMPLocationFlags Flags) {
|
||||
llvm::Value *Entry = OpenMPDefaultLocMap.lookup(Flags);
|
||||
if (!Entry) {
|
||||
if (!DefaultOpenMPPSource) {
|
||||
|
@ -134,12 +134,13 @@ CGOpenMPRuntime::GetOrCreateDefaultOpenMPLocation(OpenMPLocationFlags Flags) {
|
|||
return Entry;
|
||||
}
|
||||
|
||||
llvm::Value *CGOpenMPRuntime::EmitOpenMPUpdateLocation(
|
||||
CodeGenFunction &CGF, SourceLocation Loc, OpenMPLocationFlags Flags) {
|
||||
llvm::Value *CGOpenMPRuntime::emitUpdateLocation(CodeGenFunction &CGF,
|
||||
SourceLocation Loc,
|
||||
OpenMPLocationFlags Flags) {
|
||||
// If no debug info is generated - return global default location.
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() == CodeGenOptions::NoDebugInfo ||
|
||||
Loc.isInvalid())
|
||||
return GetOrCreateDefaultOpenMPLocation(Flags);
|
||||
return getOrCreateDefaultLocation(Flags);
|
||||
|
||||
assert(CGF.CurFn && "No function in current CodeGenFunction.");
|
||||
|
||||
|
@ -159,7 +160,7 @@ llvm::Value *CGOpenMPRuntime::EmitOpenMPUpdateLocation(
|
|||
|
||||
CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
|
||||
CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt);
|
||||
CGF.Builder.CreateMemCpy(LocValue, GetOrCreateDefaultOpenMPLocation(Flags),
|
||||
CGF.Builder.CreateMemCpy(LocValue, getOrCreateDefaultLocation(Flags),
|
||||
llvm::ConstantExpr::getSizeOf(IdentTy),
|
||||
CGM.PointerAlignInBytes);
|
||||
}
|
||||
|
@ -189,8 +190,8 @@ llvm::Value *CGOpenMPRuntime::EmitOpenMPUpdateLocation(
|
|||
return LocValue;
|
||||
}
|
||||
|
||||
llvm::Value *CGOpenMPRuntime::GetOpenMPThreadID(CodeGenFunction &CGF,
|
||||
SourceLocation Loc) {
|
||||
llvm::Value *CGOpenMPRuntime::getThreadID(CodeGenFunction &CGF,
|
||||
SourceLocation Loc) {
|
||||
assert(CGF.CurFn && "No function in current CodeGenFunction.");
|
||||
|
||||
llvm::Value *ThreadID = nullptr;
|
||||
|
@ -224,16 +225,16 @@ llvm::Value *CGOpenMPRuntime::GetOpenMPThreadID(CodeGenFunction &CGF,
|
|||
// function.
|
||||
CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
|
||||
CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt);
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc)};
|
||||
ThreadID = CGF.EmitRuntimeCall(
|
||||
CreateRuntimeFunction(OMPRTL__kmpc_global_thread_num), Args);
|
||||
createRuntimeFunction(OMPRTL__kmpc_global_thread_num),
|
||||
emitUpdateLocation(CGF, Loc));
|
||||
auto &Elem = OpenMPLocThreadIDMap.FindAndConstruct(CGF.CurFn);
|
||||
Elem.second.ThreadID = ThreadID;
|
||||
}
|
||||
return ThreadID;
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::FunctionFinished(CodeGenFunction &CGF) {
|
||||
void CGOpenMPRuntime::functionFinished(CodeGenFunction &CGF) {
|
||||
assert(CGF.CurFn && "No function in current CodeGenFunction.");
|
||||
if (OpenMPLocThreadIDMap.count(CGF.CurFn))
|
||||
OpenMPLocThreadIDMap.erase(CGF.CurFn);
|
||||
|
@ -248,7 +249,7 @@ llvm::Type *CGOpenMPRuntime::getKmpc_MicroPointerTy() {
|
|||
}
|
||||
|
||||
llvm::Constant *
|
||||
CGOpenMPRuntime::CreateRuntimeFunction(OpenMPRTLFunction Function) {
|
||||
CGOpenMPRuntime::createRuntimeFunction(OpenMPRTLFunction Function) {
|
||||
llvm::Constant *RTLFn = nullptr;
|
||||
switch (Function) {
|
||||
case OMPRTL__kmpc_fork_call: {
|
||||
|
@ -507,31 +508,30 @@ CGOpenMPRuntime::CreateRuntimeFunction(OpenMPRTLFunction Function) {
|
|||
llvm::Constant *
|
||||
CGOpenMPRuntime::getOrCreateThreadPrivateCache(const VarDecl *VD) {
|
||||
// Lookup the entry, lazily creating it if necessary.
|
||||
return GetOrCreateInternalVariable(CGM.Int8PtrPtrTy,
|
||||
return getOrCreateInternalVariable(CGM.Int8PtrPtrTy,
|
||||
Twine(CGM.getMangledName(VD)) + ".cache.");
|
||||
}
|
||||
|
||||
llvm::Value *CGOpenMPRuntime::getOMPAddrOfThreadPrivate(CodeGenFunction &CGF,
|
||||
const VarDecl *VD,
|
||||
llvm::Value *VDAddr,
|
||||
SourceLocation Loc) {
|
||||
llvm::Value *CGOpenMPRuntime::getAddrOfThreadPrivate(CodeGenFunction &CGF,
|
||||
const VarDecl *VD,
|
||||
llvm::Value *VDAddr,
|
||||
SourceLocation Loc) {
|
||||
auto VarTy = VDAddr->getType()->getPointerElementType();
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc),
|
||||
GetOpenMPThreadID(CGF, Loc),
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
CGF.Builder.CreatePointerCast(VDAddr, CGM.Int8PtrTy),
|
||||
CGM.getSize(CGM.GetTargetTypeStoreSize(VarTy)),
|
||||
getOrCreateThreadPrivateCache(VD)};
|
||||
return CGF.EmitRuntimeCall(
|
||||
CreateRuntimeFunction(OMPRTL__kmpc_threadprivate_cached), Args);
|
||||
createRuntimeFunction(OMPRTL__kmpc_threadprivate_cached), Args);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPThreadPrivateVarInit(
|
||||
void CGOpenMPRuntime::emitThreadPrivateVarInit(
|
||||
CodeGenFunction &CGF, llvm::Value *VDAddr, llvm::Value *Ctor,
|
||||
llvm::Value *CopyCtor, llvm::Value *Dtor, SourceLocation Loc) {
|
||||
// Call kmp_int32 __kmpc_global_thread_num(&loc) to init OpenMP runtime
|
||||
// library.
|
||||
auto OMPLoc = EmitOpenMPUpdateLocation(CGF, Loc);
|
||||
CGF.EmitRuntimeCall(CreateRuntimeFunction(OMPRTL__kmpc_global_thread_num),
|
||||
auto OMPLoc = emitUpdateLocation(CGF, Loc);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_global_thread_num),
|
||||
OMPLoc);
|
||||
// Call __kmpc_threadprivate_register(&loc, &var, ctor, cctor/*NULL*/, dtor)
|
||||
// to register constructor/destructor for variable.
|
||||
|
@ -539,10 +539,10 @@ void CGOpenMPRuntime::EmitOMPThreadPrivateVarInit(
|
|||
CGF.Builder.CreatePointerCast(VDAddr, CGM.VoidPtrTy),
|
||||
Ctor, CopyCtor, Dtor};
|
||||
CGF.EmitRuntimeCall(
|
||||
CreateRuntimeFunction(OMPRTL__kmpc_threadprivate_register), Args);
|
||||
createRuntimeFunction(OMPRTL__kmpc_threadprivate_register), Args);
|
||||
}
|
||||
|
||||
llvm::Function *CGOpenMPRuntime::EmitOMPThreadPrivateVarDefinition(
|
||||
llvm::Function *CGOpenMPRuntime::emitThreadPrivateVarDefinition(
|
||||
const VarDecl *VD, llvm::Value *VDAddr, SourceLocation Loc,
|
||||
bool PerformInit, CodeGenFunction *CGF) {
|
||||
VD = VD->getDefinition(CGM.getContext());
|
||||
|
@ -645,43 +645,41 @@ llvm::Function *CGOpenMPRuntime::EmitOMPThreadPrivateVarDefinition(
|
|||
InitCGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, InitFunction,
|
||||
CGM.getTypes().arrangeNullaryFunction(), ArgList,
|
||||
Loc);
|
||||
EmitOMPThreadPrivateVarInit(InitCGF, VDAddr, Ctor, CopyCtor, Dtor, Loc);
|
||||
emitThreadPrivateVarInit(InitCGF, VDAddr, Ctor, CopyCtor, Dtor, Loc);
|
||||
InitCGF.FinishFunction();
|
||||
return InitFunction;
|
||||
}
|
||||
EmitOMPThreadPrivateVarInit(*CGF, VDAddr, Ctor, CopyCtor, Dtor, Loc);
|
||||
emitThreadPrivateVarInit(*CGF, VDAddr, Ctor, CopyCtor, Dtor, Loc);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPParallelCall(CodeGenFunction &CGF,
|
||||
SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct) {
|
||||
void CGOpenMPRuntime::emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct) {
|
||||
// Build call __kmpc_fork_call(loc, 1, microtask, captured_struct/*context*/)
|
||||
llvm::Value *Args[] = {
|
||||
EmitOpenMPUpdateLocation(CGF, Loc),
|
||||
emitUpdateLocation(CGF, Loc),
|
||||
CGF.Builder.getInt32(1), // Number of arguments after 'microtask' argument
|
||||
// (there is only one additional argument - 'context')
|
||||
CGF.Builder.CreateBitCast(OutlinedFn, getKmpc_MicroPointerTy()),
|
||||
CGF.EmitCastToVoidPtr(CapturedStruct)};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_fork_call);
|
||||
auto RTLFn = createRuntimeFunction(OMPRTL__kmpc_fork_call);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPSerialCall(CodeGenFunction &CGF,
|
||||
SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct) {
|
||||
auto ThreadID = GetOpenMPThreadID(CGF, Loc);
|
||||
void CGOpenMPRuntime::emitSerialCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct) {
|
||||
auto ThreadID = getThreadID(CGF, Loc);
|
||||
// Build calls:
|
||||
// __kmpc_serialized_parallel(&Loc, GTid);
|
||||
llvm::Value *SerArgs[] = {EmitOpenMPUpdateLocation(CGF, Loc), ThreadID};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_serialized_parallel);
|
||||
CGF.EmitRuntimeCall(RTLFn, SerArgs);
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc), ThreadID};
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_serialized_parallel),
|
||||
Args);
|
||||
|
||||
// OutlinedFn(>id, &zero, CapturedStruct);
|
||||
auto ThreadIDAddr = EmitThreadIDAddress(CGF, Loc);
|
||||
auto ThreadIDAddr = emitThreadIDAddress(CGF, Loc);
|
||||
auto Int32Ty =
|
||||
CGF.getContext().getIntTypeForBitwidth(/*DestWidth*/ 32, /*Signed*/ true);
|
||||
auto ZeroAddr = CGF.CreateMemTemp(Int32Ty, /*Name*/ ".zero.addr");
|
||||
|
@ -690,9 +688,9 @@ void CGOpenMPRuntime::EmitOMPSerialCall(CodeGenFunction &CGF,
|
|||
CGF.EmitCallOrInvoke(OutlinedFn, OutlinedFnArgs);
|
||||
|
||||
// __kmpc_end_serialized_parallel(&Loc, GTid);
|
||||
llvm::Value *EndSerArgs[] = {EmitOpenMPUpdateLocation(CGF, Loc), ThreadID};
|
||||
RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_end_serialized_parallel);
|
||||
CGF.EmitRuntimeCall(RTLFn, EndSerArgs);
|
||||
llvm::Value *EndArgs[] = {emitUpdateLocation(CGF, Loc), ThreadID};
|
||||
CGF.EmitRuntimeCall(
|
||||
createRuntimeFunction(OMPRTL__kmpc_end_serialized_parallel), EndArgs);
|
||||
}
|
||||
|
||||
// If we're inside an (outlined) parallel region, use the region info's
|
||||
|
@ -701,13 +699,13 @@ void CGOpenMPRuntime::EmitOMPSerialCall(CodeGenFunction &CGF,
|
|||
// regular serial code region, get thread ID by calling kmp_int32
|
||||
// kmpc_global_thread_num(ident_t *loc), stash this thread ID in a temporary and
|
||||
// return the address of that temp.
|
||||
llvm::Value *CGOpenMPRuntime::EmitThreadIDAddress(CodeGenFunction &CGF,
|
||||
llvm::Value *CGOpenMPRuntime::emitThreadIDAddress(CodeGenFunction &CGF,
|
||||
SourceLocation Loc) {
|
||||
if (auto OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo))
|
||||
return CGF.EmitLoadOfLValue(OMPRegionInfo->getThreadIDVariableLValue(CGF),
|
||||
SourceLocation()).getScalarVal();
|
||||
auto ThreadID = GetOpenMPThreadID(CGF, Loc);
|
||||
auto ThreadID = getThreadID(CGF, Loc);
|
||||
auto Int32Ty =
|
||||
CGF.getContext().getIntTypeForBitwidth(/*DestWidth*/ 32, /*Signed*/ true);
|
||||
auto ThreadIDTemp = CGF.CreateMemTemp(Int32Ty, /*Name*/ ".threadid_temp.");
|
||||
|
@ -718,7 +716,7 @@ llvm::Value *CGOpenMPRuntime::EmitThreadIDAddress(CodeGenFunction &CGF,
|
|||
}
|
||||
|
||||
llvm::Constant *
|
||||
CGOpenMPRuntime::GetOrCreateInternalVariable(llvm::Type *Ty,
|
||||
CGOpenMPRuntime::getOrCreateInternalVariable(llvm::Type *Ty,
|
||||
const llvm::Twine &Name) {
|
||||
SmallString<256> Buffer;
|
||||
llvm::raw_svector_ostream Out(Buffer);
|
||||
|
@ -737,31 +735,29 @@ CGOpenMPRuntime::GetOrCreateInternalVariable(llvm::Type *Ty,
|
|||
Elem.first());
|
||||
}
|
||||
|
||||
llvm::Value *CGOpenMPRuntime::GetCriticalRegionLock(StringRef CriticalName) {
|
||||
llvm::Value *CGOpenMPRuntime::getCriticalRegionLock(StringRef CriticalName) {
|
||||
llvm::Twine Name(".gomp_critical_user_", CriticalName);
|
||||
return GetOrCreateInternalVariable(KmpCriticalNameTy, Name.concat(".var"));
|
||||
return getOrCreateInternalVariable(KmpCriticalNameTy, Name.concat(".var"));
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPCriticalRegion(
|
||||
void CGOpenMPRuntime::emitCriticalRegion(
|
||||
CodeGenFunction &CGF, StringRef CriticalName,
|
||||
const std::function<void()> &CriticalOpGen, SourceLocation Loc) {
|
||||
auto RegionLock = GetCriticalRegionLock(CriticalName);
|
||||
auto RegionLock = getCriticalRegionLock(CriticalName);
|
||||
// __kmpc_critical(ident_t *, gtid, Lock);
|
||||
// CriticalOpGen();
|
||||
// __kmpc_end_critical(ident_t *, gtid, Lock);
|
||||
// Prepare arguments and build a call to __kmpc_critical
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc),
|
||||
GetOpenMPThreadID(CGF, Loc), RegionLock};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_critical);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
RegionLock};
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_critical), Args);
|
||||
CriticalOpGen();
|
||||
// Build a call to __kmpc_end_critical
|
||||
RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_end_critical);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_end_critical), Args);
|
||||
}
|
||||
|
||||
static void EmitOMPIfStmt(CodeGenFunction &CGF, llvm::Value *IfCond,
|
||||
const std::function<void()> &BodyOpGen) {
|
||||
static void emitIfStmt(CodeGenFunction &CGF, llvm::Value *IfCond,
|
||||
const std::function<void()> &BodyOpGen) {
|
||||
llvm::Value *CallBool = CGF.EmitScalarConversion(
|
||||
IfCond,
|
||||
CGF.getContext().getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/true),
|
||||
|
@ -778,19 +774,18 @@ static void EmitOMPIfStmt(CodeGenFunction &CGF, llvm::Value *IfCond,
|
|||
CGF.EmitBlock(ContBlock, true);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPMasterRegion(
|
||||
CodeGenFunction &CGF, const std::function<void()> &MasterOpGen,
|
||||
SourceLocation Loc) {
|
||||
void CGOpenMPRuntime::emitMasterRegion(CodeGenFunction &CGF,
|
||||
const std::function<void()> &MasterOpGen,
|
||||
SourceLocation Loc) {
|
||||
// if(__kmpc_master(ident_t *, gtid)) {
|
||||
// MasterOpGen();
|
||||
// __kmpc_end_master(ident_t *, gtid);
|
||||
// }
|
||||
// Prepare arguments and build a call to __kmpc_master
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc),
|
||||
GetOpenMPThreadID(CGF, Loc)};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_master);
|
||||
auto *IsMaster = CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
EmitOMPIfStmt(CGF, IsMaster, [&]() -> void {
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc)};
|
||||
auto *IsMaster =
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_master), Args);
|
||||
emitIfStmt(CGF, IsMaster, [&]() -> void {
|
||||
MasterOpGen();
|
||||
// Build a call to __kmpc_end_master.
|
||||
// OpenMP [1.2.2 OpenMP Language Terminology]
|
||||
|
@ -806,34 +801,31 @@ void CGOpenMPRuntime::EmitOMPMasterRegion(
|
|||
// structured block.
|
||||
// It is analyzed in Sema, so we can just call __kmpc_end_master() on
|
||||
// fallthrough rather than pushing a normal cleanup for it.
|
||||
RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_end_master);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_end_master), Args);
|
||||
});
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPTaskyieldCall(CodeGenFunction &CGF,
|
||||
SourceLocation Loc) {
|
||||
void CGOpenMPRuntime::emitTaskyieldCall(CodeGenFunction &CGF,
|
||||
SourceLocation Loc) {
|
||||
// Build call __kmpc_omp_taskyield(loc, thread_id, 0);
|
||||
llvm::Value *Args[] = {
|
||||
EmitOpenMPUpdateLocation(CGF, Loc), GetOpenMPThreadID(CGF, Loc),
|
||||
emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
llvm::ConstantInt::get(CGM.IntTy, /*V=*/0, /*isSigned=*/true)};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_omp_taskyield);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_omp_taskyield), Args);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPSingleRegion(
|
||||
CodeGenFunction &CGF, const std::function<void()> &SingleOpGen,
|
||||
SourceLocation Loc) {
|
||||
void CGOpenMPRuntime::emitSingleRegion(CodeGenFunction &CGF,
|
||||
const std::function<void()> &SingleOpGen,
|
||||
SourceLocation Loc) {
|
||||
// if(__kmpc_single(ident_t *, gtid)) {
|
||||
// SingleOpGen();
|
||||
// __kmpc_end_single(ident_t *, gtid);
|
||||
// }
|
||||
// Prepare arguments and build a call to __kmpc_single
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc),
|
||||
GetOpenMPThreadID(CGF, Loc)};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_single);
|
||||
auto *IsSingle = CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
EmitOMPIfStmt(CGF, IsSingle, [&]() -> void {
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc)};
|
||||
auto *IsSingle =
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_single), Args);
|
||||
emitIfStmt(CGF, IsSingle, [&]() -> void {
|
||||
SingleOpGen();
|
||||
// Build a call to __kmpc_end_single.
|
||||
// OpenMP [1.2.2 OpenMP Language Terminology]
|
||||
|
@ -849,13 +841,12 @@ void CGOpenMPRuntime::EmitOMPSingleRegion(
|
|||
// structured block.
|
||||
// It is analyzed in Sema, so we can just call __kmpc_end_single() on
|
||||
// fallthrough rather than pushing a normal cleanup for it.
|
||||
RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_end_single);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_end_single), Args);
|
||||
});
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPBarrierCall(CodeGenFunction &CGF,
|
||||
SourceLocation Loc, bool IsExplicit) {
|
||||
void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
bool IsExplicit) {
|
||||
// Build call __kmpc_cancel_barrier(loc, thread_id);
|
||||
auto Flags = static_cast<OpenMPLocationFlags>(
|
||||
OMP_IDENT_KMPC |
|
||||
|
@ -866,10 +857,9 @@ void CGOpenMPRuntime::EmitOMPBarrierCall(CodeGenFunction &CGF,
|
|||
// cancellation constructs introduced in OpenMP 4.0. __kmpc_cancel_barrier()
|
||||
// is provided default by the runtime library so it safe to make such
|
||||
// replacement.
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc, Flags),
|
||||
GetOpenMPThreadID(CGF, Loc)};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_cancel_barrier);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc, Flags),
|
||||
getThreadID(CGF, Loc)};
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_cancel_barrier), Args);
|
||||
}
|
||||
|
||||
/// \brief Schedule types for 'omp for' loops (these enumerators are taken from
|
||||
|
@ -922,12 +912,12 @@ bool CGOpenMPRuntime::isDynamic(OpenMPScheduleClauseKind ScheduleKind) const {
|
|||
return Schedule != OMP_sch_static;
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPForInit(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind ScheduleKind,
|
||||
unsigned IVSize, bool IVSigned,
|
||||
llvm::Value *IL, llvm::Value *LB,
|
||||
llvm::Value *UB, llvm::Value *ST,
|
||||
llvm::Value *Chunk) {
|
||||
void CGOpenMPRuntime::emitForInit(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind ScheduleKind,
|
||||
unsigned IVSize, bool IVSigned,
|
||||
llvm::Value *IL, llvm::Value *LB,
|
||||
llvm::Value *UB, llvm::Value *ST,
|
||||
llvm::Value *Chunk) {
|
||||
OpenMPSchedType Schedule = getRuntimeSchedule(ScheduleKind, Chunk != nullptr);
|
||||
// Call __kmpc_for_static_init(
|
||||
// ident_t *loc, kmp_int32 tid, kmp_int32 schedtype,
|
||||
|
@ -941,8 +931,7 @@ void CGOpenMPRuntime::EmitOMPForInit(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
Chunk = CGF.Builder.getIntN(IVSize, /*C*/ 1);
|
||||
|
||||
llvm::Value *Args[] = {
|
||||
EmitOpenMPUpdateLocation(CGF, Loc, OMP_IDENT_KMPC),
|
||||
GetOpenMPThreadID(CGF, Loc),
|
||||
emitUpdateLocation(CGF, Loc, OMP_IDENT_KMPC), getThreadID(CGF, Loc),
|
||||
CGF.Builder.getInt32(Schedule), // Schedule type
|
||||
IL, // &isLastIter
|
||||
LB, // &LB
|
||||
|
@ -957,36 +946,36 @@ void CGOpenMPRuntime::EmitOMPForInit(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
: OMPRTL__kmpc_for_static_init_4u)
|
||||
: (IVSigned ? OMPRTL__kmpc_for_static_init_8
|
||||
: OMPRTL__kmpc_for_static_init_8u);
|
||||
auto RTLFn = CreateRuntimeFunction(F);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(F), Args);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPForFinish(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind ScheduleKind) {
|
||||
void CGOpenMPRuntime::emitForFinish(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind ScheduleKind) {
|
||||
assert((ScheduleKind == OMPC_SCHEDULE_static ||
|
||||
ScheduleKind == OMPC_SCHEDULE_unknown) &&
|
||||
"Non-static schedule kinds are not yet implemented");
|
||||
// Call __kmpc_for_static_fini(ident_t *loc, kmp_int32 tid);
|
||||
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc, OMP_IDENT_KMPC),
|
||||
GetOpenMPThreadID(CGF, Loc)};
|
||||
auto RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_for_static_fini);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc, OMP_IDENT_KMPC),
|
||||
getThreadID(CGF, Loc)};
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_for_static_fini),
|
||||
Args);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPNumThreadsClause(CodeGenFunction &CGF,
|
||||
llvm::Value *NumThreads,
|
||||
SourceLocation Loc) {
|
||||
void CGOpenMPRuntime::emitNumThreadsClause(CodeGenFunction &CGF,
|
||||
llvm::Value *NumThreads,
|
||||
SourceLocation Loc) {
|
||||
// Build call __kmpc_push_num_threads(&loc, global_tid, num_threads)
|
||||
llvm::Value *Args[] = {
|
||||
EmitOpenMPUpdateLocation(CGF, Loc), GetOpenMPThreadID(CGF, Loc),
|
||||
emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)};
|
||||
llvm::Constant *RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_push_num_threads);
|
||||
CGF.EmitRuntimeCall(RTLFn, Args);
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_push_num_threads),
|
||||
Args);
|
||||
}
|
||||
|
||||
void CGOpenMPRuntime::EmitOMPFlush(CodeGenFunction &CGF, ArrayRef<const Expr *>,
|
||||
SourceLocation Loc) {
|
||||
void CGOpenMPRuntime::emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *>,
|
||||
SourceLocation Loc) {
|
||||
// Build call void __kmpc_flush(ident_t *loc)
|
||||
auto *RTLFn = CreateRuntimeFunction(OMPRTL__kmpc_flush);
|
||||
CGF.EmitRuntimeCall(RTLFn, EmitOpenMPUpdateLocation(CGF, Loc));
|
||||
CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_flush),
|
||||
emitUpdateLocation(CGF, Loc));
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,7 @@ private:
|
|||
/// \brief Map of flags and corresponding default locations.
|
||||
typedef llvm::DenseMap<unsigned, llvm::Value *> OpenMPDefaultLocMapTy;
|
||||
OpenMPDefaultLocMapTy OpenMPDefaultLocMap;
|
||||
llvm::Value *GetOrCreateDefaultOpenMPLocation(OpenMPLocationFlags Flags);
|
||||
llvm::Value *getOrCreateDefaultLocation(OpenMPLocationFlags Flags);
|
||||
/// \brief Describes ident structure that describes a source location.
|
||||
/// All descriptions are taken from
|
||||
/// http://llvm.org/svn/llvm-project/openmp/trunk/runtime/src/kmp.h
|
||||
|
@ -197,9 +197,8 @@ private:
|
|||
/// \brief Emits object of ident_t type with info for source location.
|
||||
/// \param Flags Flags for OpenMP location.
|
||||
///
|
||||
llvm::Value *
|
||||
EmitOpenMPUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPLocationFlags Flags = OMP_IDENT_KMPC);
|
||||
llvm::Value *emitUpdateLocation(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPLocationFlags Flags = OMP_IDENT_KMPC);
|
||||
|
||||
/// \brief Returns pointer to ident_t type.
|
||||
llvm::Type *getIdentTyPointerTy();
|
||||
|
@ -210,7 +209,7 @@ private:
|
|||
/// \brief Returns specified OpenMP runtime function.
|
||||
/// \param Function OpenMP runtime function.
|
||||
/// \return Specified function.
|
||||
llvm::Constant *CreateRuntimeFunction(OpenMPRTLFunction Function);
|
||||
llvm::Constant *createRuntimeFunction(OpenMPRTLFunction Function);
|
||||
|
||||
/// \brief If the specified mangled name is not in the module, create and
|
||||
/// return threadprivate cache object. This object is a pointer's worth of
|
||||
|
@ -221,12 +220,12 @@ private:
|
|||
|
||||
/// \brief Emits address of the word in a memory where current thread id is
|
||||
/// stored.
|
||||
virtual llvm::Value *EmitThreadIDAddress(CodeGenFunction &CGF,
|
||||
virtual llvm::Value *emitThreadIDAddress(CodeGenFunction &CGF,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// \brief Gets thread id value for the current thread.
|
||||
///
|
||||
llvm::Value *GetOpenMPThreadID(CodeGenFunction &CGF, SourceLocation Loc);
|
||||
llvm::Value *getThreadID(CodeGenFunction &CGF, SourceLocation Loc);
|
||||
|
||||
/// \brief Gets (if variable with the given name already exist) or creates
|
||||
/// internal global variable with the specified Name. The created variable has
|
||||
|
@ -234,7 +233,7 @@ private:
|
|||
/// \param Ty Type of the global variable. If it is exist already the type
|
||||
/// must be the same.
|
||||
/// \param Name Name of the variable.
|
||||
llvm::Constant *GetOrCreateInternalVariable(llvm::Type *Ty,
|
||||
llvm::Constant *getOrCreateInternalVariable(llvm::Type *Ty,
|
||||
const llvm::Twine &Name);
|
||||
|
||||
/// \brief Set of threadprivate variables with the generated initializer.
|
||||
|
@ -246,16 +245,16 @@ private:
|
|||
/// \param CopyCtor Pointer to a global copy function for \a VD.
|
||||
/// \param Dtor Pointer to a global destructor function for \a VD.
|
||||
/// \param Loc Location of threadprivate declaration.
|
||||
void EmitOMPThreadPrivateVarInit(CodeGenFunction &CGF, llvm::Value *VDAddr,
|
||||
llvm::Value *Ctor, llvm::Value *CopyCtor,
|
||||
llvm::Value *Dtor, SourceLocation Loc);
|
||||
void emitThreadPrivateVarInit(CodeGenFunction &CGF, llvm::Value *VDAddr,
|
||||
llvm::Value *Ctor, llvm::Value *CopyCtor,
|
||||
llvm::Value *Dtor, SourceLocation Loc);
|
||||
|
||||
/// \brief Returns corresponding lock object for the specified critical region
|
||||
/// name. If the lock object does not exist it is created, otherwise the
|
||||
/// reference to the existing copy is returned.
|
||||
/// \param CriticalName Name of the critical region.
|
||||
///
|
||||
llvm::Value *GetCriticalRegionLock(StringRef CriticalName);
|
||||
llvm::Value *getCriticalRegionLock(StringRef CriticalName);
|
||||
|
||||
public:
|
||||
explicit CGOpenMPRuntime(CodeGenModule &CGM);
|
||||
|
@ -268,13 +267,12 @@ public:
|
|||
/// \param D OpenMP directive.
|
||||
/// \param ThreadIDVar Variable for thread id in the current OpenMP region.
|
||||
///
|
||||
virtual llvm::Value *
|
||||
EmitOpenMPOutlinedFunction(const OMPExecutableDirective &D,
|
||||
const VarDecl *ThreadIDVar);
|
||||
virtual llvm::Value *emitOutlinedFunction(const OMPExecutableDirective &D,
|
||||
const VarDecl *ThreadIDVar);
|
||||
|
||||
/// \brief Cleans up references to the objects in finished function.
|
||||
///
|
||||
void FunctionFinished(CodeGenFunction &CGF);
|
||||
void functionFinished(CodeGenFunction &CGF);
|
||||
|
||||
/// \brief Emits code for parallel call of the \a OutlinedFn with variables
|
||||
/// captured in a record which address is stored in \a CapturedStruct.
|
||||
|
@ -283,9 +281,9 @@ public:
|
|||
/// \param CapturedStruct A pointer to the record with the references to
|
||||
/// variables used in \a OutlinedFn function.
|
||||
///
|
||||
virtual void EmitOMPParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct);
|
||||
virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct);
|
||||
|
||||
/// \brief Emits code for serial call of the \a OutlinedFn with variables
|
||||
/// captured in a record which address is stored in \a CapturedStruct.
|
||||
|
@ -293,41 +291,40 @@ public:
|
|||
/// \param CapturedStruct A pointer to the record with the references to
|
||||
/// variables used in \a OutlinedFn function.
|
||||
///
|
||||
virtual void EmitOMPSerialCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct);
|
||||
virtual void emitSerialCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
llvm::Value *OutlinedFn,
|
||||
llvm::Value *CapturedStruct);
|
||||
|
||||
/// \brief Emits a critical region.
|
||||
/// \param CriticalName Name of the critical region.
|
||||
/// \param CriticalOpGen Generator for the statement associated with the given
|
||||
/// critical region.
|
||||
virtual void EmitOMPCriticalRegion(CodeGenFunction &CGF,
|
||||
StringRef CriticalName,
|
||||
const std::function<void()> &CriticalOpGen,
|
||||
SourceLocation Loc);
|
||||
virtual void emitCriticalRegion(CodeGenFunction &CGF, StringRef CriticalName,
|
||||
const std::function<void()> &CriticalOpGen,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// \brief Emits a master region.
|
||||
/// \param MasterOpGen Generator for the statement associated with the given
|
||||
/// master region.
|
||||
virtual void EmitOMPMasterRegion(CodeGenFunction &CGF,
|
||||
const std::function<void()> &MasterOpGen,
|
||||
SourceLocation Loc);
|
||||
virtual void emitMasterRegion(CodeGenFunction &CGF,
|
||||
const std::function<void()> &MasterOpGen,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// \brief Emits code for a taskyield directive.
|
||||
virtual void EmitOMPTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc);
|
||||
virtual void emitTaskyieldCall(CodeGenFunction &CGF, SourceLocation Loc);
|
||||
|
||||
/// \brief Emits a single region.
|
||||
/// \param SingleOpGen Generator for the statement associated with the given
|
||||
/// single region.
|
||||
virtual void EmitOMPSingleRegion(CodeGenFunction &CGF,
|
||||
const std::function<void()> &SingleOpGen,
|
||||
SourceLocation Loc);
|
||||
virtual void emitSingleRegion(CodeGenFunction &CGF,
|
||||
const std::function<void()> &SingleOpGen,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// \brief Emits explicit barrier for OpenMP threads.
|
||||
/// \param IsExplicit true, if it is explicitly specified barrier.
|
||||
///
|
||||
virtual void EmitOMPBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
bool IsExplicit = true);
|
||||
virtual void emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
bool IsExplicit = true);
|
||||
|
||||
/// \brief Check if the specified \a ScheduleKind is static non-chunked.
|
||||
/// This kind of worksharing directive is emitted without outer loop.
|
||||
|
@ -366,11 +363,11 @@ public:
|
|||
/// \param Chunk Value of the chunk for the static_chunked scheduled loop.
|
||||
/// For the default (nullptr) value, the chunk 1 will be used.
|
||||
///
|
||||
virtual void EmitOMPForInit(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind SchedKind,
|
||||
unsigned IVSize, bool IVSigned, llvm::Value *IL,
|
||||
llvm::Value *LB, llvm::Value *UB, llvm::Value *ST,
|
||||
llvm::Value *Chunk = nullptr);
|
||||
virtual void emitForInit(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind SchedKind, unsigned IVSize,
|
||||
bool IVSigned, llvm::Value *IL, llvm::Value *LB,
|
||||
llvm::Value *UB, llvm::Value *ST,
|
||||
llvm::Value *Chunk = nullptr);
|
||||
|
||||
/// \brief Call the appropriate runtime routine to notify that we finished
|
||||
/// all the work with current loop.
|
||||
|
@ -379,16 +376,16 @@ public:
|
|||
/// \param Loc Clang source location.
|
||||
/// \param ScheduleKind Schedule kind, specified by the 'schedule' clause.
|
||||
///
|
||||
virtual void EmitOMPForFinish(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind ScheduleKind);
|
||||
virtual void emitForFinish(CodeGenFunction &CGF, SourceLocation Loc,
|
||||
OpenMPScheduleClauseKind ScheduleKind);
|
||||
|
||||
/// \brief Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32
|
||||
/// global_tid, kmp_int32 num_threads) to generate code for 'num_threads'
|
||||
/// clause.
|
||||
/// \param NumThreads An integer value of threads.
|
||||
virtual void EmitOMPNumThreadsClause(CodeGenFunction &CGF,
|
||||
llvm::Value *NumThreads,
|
||||
SourceLocation Loc);
|
||||
virtual void emitNumThreadsClause(CodeGenFunction &CGF,
|
||||
llvm::Value *NumThreads,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// \brief Returns address of the threadprivate variable for the current
|
||||
/// thread.
|
||||
|
@ -396,10 +393,10 @@ public:
|
|||
/// \param VDAddr Address of the global variable \a VD.
|
||||
/// \param Loc Location of the reference to threadprivate var.
|
||||
/// \return Address of the threadprivate variable for the current thread.
|
||||
virtual llvm::Value *getOMPAddrOfThreadPrivate(CodeGenFunction &CGF,
|
||||
const VarDecl *VD,
|
||||
llvm::Value *VDAddr,
|
||||
SourceLocation Loc);
|
||||
virtual llvm::Value *getAddrOfThreadPrivate(CodeGenFunction &CGF,
|
||||
const VarDecl *VD,
|
||||
llvm::Value *VDAddr,
|
||||
SourceLocation Loc);
|
||||
|
||||
/// \brief Emit a code for initialization of threadprivate variable. It emits
|
||||
/// a call to runtime library which adds initial value to the newly created
|
||||
|
@ -410,14 +407,14 @@ public:
|
|||
/// \param Loc Location of threadprivate declaration.
|
||||
/// \param PerformInit true if initialization expression is not constant.
|
||||
virtual llvm::Function *
|
||||
EmitOMPThreadPrivateVarDefinition(const VarDecl *VD, llvm::Value *VDAddr,
|
||||
SourceLocation Loc, bool PerformInit,
|
||||
CodeGenFunction *CGF = nullptr);
|
||||
emitThreadPrivateVarDefinition(const VarDecl *VD, llvm::Value *VDAddr,
|
||||
SourceLocation Loc, bool PerformInit,
|
||||
CodeGenFunction *CGF = nullptr);
|
||||
|
||||
/// \brief Emit flush of the variables specified in 'omp flush' directive.
|
||||
/// \param Vars List of variables to flush.
|
||||
virtual void EmitOMPFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
|
||||
SourceLocation Loc);
|
||||
virtual void emitFlush(CodeGenFunction &CGF, ArrayRef<const Expr *> Vars,
|
||||
SourceLocation Loc);
|
||||
};
|
||||
} // namespace CodeGen
|
||||
} // namespace clang
|
||||
|
|
|
@ -249,17 +249,17 @@ static void EmitOMPParallelCall(CodeGenFunction &CGF,
|
|||
auto NumThreadsClause = cast<OMPNumThreadsClause>(C);
|
||||
auto NumThreads = CGF.EmitScalarExpr(NumThreadsClause->getNumThreads(),
|
||||
/*IgnoreResultAssign*/ true);
|
||||
CGF.CGM.getOpenMPRuntime().EmitOMPNumThreadsClause(
|
||||
CGF.CGM.getOpenMPRuntime().emitNumThreadsClause(
|
||||
CGF, NumThreads, NumThreadsClause->getLocStart());
|
||||
}
|
||||
CGF.CGM.getOpenMPRuntime().EmitOMPParallelCall(CGF, S.getLocStart(),
|
||||
OutlinedFn, CapturedStruct);
|
||||
CGF.CGM.getOpenMPRuntime().emitParallelCall(CGF, S.getLocStart(), OutlinedFn,
|
||||
CapturedStruct);
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPParallelDirective(const OMPParallelDirective &S) {
|
||||
auto CS = cast<CapturedStmt>(S.getAssociatedStmt());
|
||||
auto CapturedStruct = GenerateCapturedStmtArgument(*CS);
|
||||
auto OutlinedFn = CGM.getOpenMPRuntime().EmitOpenMPOutlinedFunction(
|
||||
auto OutlinedFn = CGM.getOpenMPRuntime().emitOutlinedFunction(
|
||||
S, *CS->getCapturedDecl()->param_begin());
|
||||
if (auto C = S.getSingleClause(/*K*/ OMPC_if)) {
|
||||
auto Cond = cast<OMPIfClause>(C)->getCondition();
|
||||
|
@ -267,8 +267,8 @@ void CodeGenFunction::EmitOMPParallelDirective(const OMPParallelDirective &S) {
|
|||
if (ThenBlock)
|
||||
EmitOMPParallelCall(*this, S, OutlinedFn, CapturedStruct);
|
||||
else
|
||||
CGM.getOpenMPRuntime().EmitOMPSerialCall(*this, S.getLocStart(),
|
||||
OutlinedFn, CapturedStruct);
|
||||
CGM.getOpenMPRuntime().emitSerialCall(*this, S.getLocStart(),
|
||||
OutlinedFn, CapturedStruct);
|
||||
});
|
||||
} else
|
||||
EmitOMPParallelCall(*this, S, OutlinedFn, CapturedStruct);
|
||||
|
@ -531,8 +531,8 @@ void CodeGenFunction::EmitOMPForOuterLoop(OpenMPScheduleClauseKind ScheduleKind,
|
|||
const unsigned IVSize = getContext().getTypeSize(IVExpr->getType());
|
||||
const bool IVSigned = IVExpr->getType()->hasSignedIntegerRepresentation();
|
||||
|
||||
RT.EmitOMPForInit(*this, S.getLocStart(), ScheduleKind, IVSize, IVSigned, IL,
|
||||
LB, UB, ST, Chunk);
|
||||
RT.emitForInit(*this, S.getLocStart(), ScheduleKind, IVSize, IVSigned, IL, LB,
|
||||
UB, ST, Chunk);
|
||||
auto LoopExit = getJumpDestInCurrentScope("omp.dispatch.end");
|
||||
|
||||
// Start the loop with a block that tests the condition.
|
||||
|
@ -580,7 +580,7 @@ void CodeGenFunction::EmitOMPForOuterLoop(OpenMPScheduleClauseKind ScheduleKind,
|
|||
EmitBlock(LoopExit.getBlock());
|
||||
|
||||
// Tell the runtime we are done.
|
||||
RT.EmitOMPForFinish(*this, S.getLocStart(), ScheduleKind);
|
||||
RT.emitForFinish(*this, S.getLocStart(), ScheduleKind);
|
||||
}
|
||||
|
||||
/// \brief Emit a helper variable and return corresponding lvalue.
|
||||
|
@ -653,9 +653,9 @@ void CodeGenFunction::EmitOMPWorksharingLoop(const OMPLoopDirective &S) {
|
|||
// chunks that are approximately equal in size, and at most one chunk is
|
||||
// distributed to each thread. Note that the size of the chunks is
|
||||
// unspecified in this case.
|
||||
RT.EmitOMPForInit(*this, S.getLocStart(), ScheduleKind, IVSize, IVSigned,
|
||||
IL.getAddress(), LB.getAddress(), UB.getAddress(),
|
||||
ST.getAddress());
|
||||
RT.emitForInit(*this, S.getLocStart(), ScheduleKind, IVSize, IVSigned,
|
||||
IL.getAddress(), LB.getAddress(), UB.getAddress(),
|
||||
ST.getAddress());
|
||||
// UB = min(UB, GlobalUB);
|
||||
EmitIgnoredExpr(S.getEnsureUpperBound());
|
||||
// IV = LB;
|
||||
|
@ -663,7 +663,7 @@ void CodeGenFunction::EmitOMPWorksharingLoop(const OMPLoopDirective &S) {
|
|||
// while (idx <= UB) { BODY; ++idx; }
|
||||
EmitOMPInnerLoop(S, LoopScope);
|
||||
// Tell the runtime we are done.
|
||||
RT.EmitOMPForFinish(*this, S.getLocStart(), ScheduleKind);
|
||||
RT.emitForFinish(*this, S.getLocStart(), ScheduleKind);
|
||||
} else {
|
||||
// Emit the outer loop, which requests its work chunk [LB..UB] from
|
||||
// runtime and runs the inner loop to process it.
|
||||
|
@ -689,8 +689,8 @@ void CodeGenFunction::EmitOMPForDirective(const OMPForDirective &S) {
|
|||
EmitOMPWorksharingLoop(S);
|
||||
|
||||
// Emit an implicit barrier at the end.
|
||||
CGM.getOpenMPRuntime().EmitOMPBarrierCall(*this, S.getLocStart(),
|
||||
/*IsExplicit*/ false);
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(),
|
||||
/*IsExplicit*/ false);
|
||||
if (DI)
|
||||
DI->EmitLexicalBlockEnd(Builder, S.getSourceRange().getEnd());
|
||||
}
|
||||
|
@ -708,7 +708,7 @@ void CodeGenFunction::EmitOMPSectionDirective(const OMPSectionDirective &) {
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPSingleDirective(const OMPSingleDirective &S) {
|
||||
CGM.getOpenMPRuntime().EmitOMPSingleRegion(*this, [&]() -> void {
|
||||
CGM.getOpenMPRuntime().emitSingleRegion(*this, [&]() -> void {
|
||||
InlinedOpenMPRegion Region(*this, S.getAssociatedStmt());
|
||||
RunCleanupsScope Scope(*this);
|
||||
EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
|
@ -717,7 +717,7 @@ void CodeGenFunction::EmitOMPSingleDirective(const OMPSingleDirective &S) {
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPMasterDirective(const OMPMasterDirective &S) {
|
||||
CGM.getOpenMPRuntime().EmitOMPMasterRegion(*this, [&]() -> void {
|
||||
CGM.getOpenMPRuntime().emitMasterRegion(*this, [&]() -> void {
|
||||
InlinedOpenMPRegion Region(*this, S.getAssociatedStmt());
|
||||
RunCleanupsScope Scope(*this);
|
||||
EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
|
@ -726,14 +726,13 @@ void CodeGenFunction::EmitOMPMasterDirective(const OMPMasterDirective &S) {
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPCriticalDirective(const OMPCriticalDirective &S) {
|
||||
CGM.getOpenMPRuntime().EmitOMPCriticalRegion(
|
||||
CGM.getOpenMPRuntime().emitCriticalRegion(
|
||||
*this, S.getDirectiveName().getAsString(), [&]() -> void {
|
||||
InlinedOpenMPRegion Region(*this, S.getAssociatedStmt());
|
||||
RunCleanupsScope Scope(*this);
|
||||
EmitStmt(
|
||||
cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
EnsureInsertPoint();
|
||||
}, S.getLocStart());
|
||||
InlinedOpenMPRegion Region(*this, S.getAssociatedStmt());
|
||||
RunCleanupsScope Scope(*this);
|
||||
EmitStmt(cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt());
|
||||
EnsureInsertPoint();
|
||||
}, S.getLocStart());
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -757,11 +756,11 @@ void CodeGenFunction::EmitOMPTaskDirective(const OMPTaskDirective &) {
|
|||
|
||||
void CodeGenFunction::EmitOMPTaskyieldDirective(
|
||||
const OMPTaskyieldDirective &S) {
|
||||
CGM.getOpenMPRuntime().EmitOMPTaskyieldCall(*this, S.getLocStart());
|
||||
CGM.getOpenMPRuntime().emitTaskyieldCall(*this, S.getLocStart());
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPBarrierDirective(const OMPBarrierDirective &S) {
|
||||
CGM.getOpenMPRuntime().EmitOMPBarrierCall(*this, S.getLocStart());
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart());
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPTaskwaitDirective(const OMPTaskwaitDirective &) {
|
||||
|
@ -769,16 +768,14 @@ void CodeGenFunction::EmitOMPTaskwaitDirective(const OMPTaskwaitDirective &) {
|
|||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPFlushDirective(const OMPFlushDirective &S) {
|
||||
CGM.getOpenMPRuntime().EmitOMPFlush(
|
||||
*this, [&]() -> ArrayRef<const Expr *> {
|
||||
if (auto C = S.getSingleClause(/*K*/ OMPC_flush)) {
|
||||
auto FlushClause = cast<OMPFlushClause>(C);
|
||||
return llvm::makeArrayRef(FlushClause->varlist_begin(),
|
||||
FlushClause->varlist_end());
|
||||
}
|
||||
return llvm::None;
|
||||
}(),
|
||||
S.getLocStart());
|
||||
CGM.getOpenMPRuntime().emitFlush(*this, [&]() -> ArrayRef<const Expr *> {
|
||||
if (auto C = S.getSingleClause(/*K*/ OMPC_flush)) {
|
||||
auto FlushClause = cast<OMPFlushClause>(C);
|
||||
return llvm::makeArrayRef(FlushClause->varlist_begin(),
|
||||
FlushClause->varlist_end());
|
||||
}
|
||||
return llvm::None;
|
||||
}(), S.getLocStart());
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPOrderedDirective(const OMPOrderedDirective &) {
|
||||
|
@ -839,7 +836,7 @@ static void EmitOMPAtomicReadExpr(CodeGenFunction &CGF, bool IsSeqCst,
|
|||
// performed operation to include an implicit flush operation without a
|
||||
// list.
|
||||
if (IsSeqCst)
|
||||
CGF.CGM.getOpenMPRuntime().EmitOMPFlush(CGF, llvm::None, Loc);
|
||||
CGF.CGM.getOpenMPRuntime().emitFlush(CGF, llvm::None, Loc);
|
||||
switch (CGF.getEvaluationKind(V->getType())) {
|
||||
case TEK_Scalar:
|
||||
CGF.EmitStoreOfScalar(
|
||||
|
|
|
@ -83,7 +83,7 @@ CodeGenFunction::~CodeGenFunction() {
|
|||
destroyBlockInfos(FirstBlockInfo);
|
||||
|
||||
if (getLangOpts().OpenMP) {
|
||||
CGM.getOpenMPRuntime().FunctionFinished(*this);
|
||||
CGM.getOpenMPRuntime().functionFinished(*this);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3674,10 +3674,8 @@ void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
|
|||
VD->getAnyInitializer() &&
|
||||
!VD->getAnyInitializer()->isConstantInitializer(getContext(),
|
||||
/*ForRef=*/false);
|
||||
if (auto InitFunction =
|
||||
getOpenMPRuntime().EmitOMPThreadPrivateVarDefinition(
|
||||
VD, GetAddrOfGlobalVar(VD), RefExpr->getLocStart(),
|
||||
PerformInit))
|
||||
if (auto InitFunction = getOpenMPRuntime().emitThreadPrivateVarDefinition(
|
||||
VD, GetAddrOfGlobalVar(VD), RefExpr->getLocStart(), PerformInit))
|
||||
CXXGlobalInits.push_back(InitFunction);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue