[OPENMP] Improved codegen for outlined functions for 'parallel' directives.

llvm-svn: 213927
This commit is contained in:
Alexey Bataev 2014-07-25 07:55:17 +00:00
parent 94bd553eb8
commit d6c57554f9
1 changed files with 25 additions and 6 deletions

View File

@ -128,12 +128,31 @@ llvm::Value *CGOpenMPRuntime::GetOpenMPGlobalThreadNum(CodeGenFunction &CGF,
if (I != OpenMPGtidMap.end()) {
GTid = I->second;
} else {
// Generate "int32 .kmpc_global_thread_num.addr;"
CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt);
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc)};
GTid = CGF.EmitRuntimeCall(
CreateRuntimeFunction(OMPRTL__kmpc_global_thread_num), Args);
// Check if current function is a function which has first parameter
// with type int32 and name ".global_tid.".
if (!CGF.CurFn->arg_empty() &&
CGF.CurFn->arg_begin()->getType()->isPointerTy() &&
CGF.CurFn->arg_begin()
->getType()
->getPointerElementType()
->isIntegerTy() &&
CGF.CurFn->arg_begin()
->getType()
->getPointerElementType()
->getIntegerBitWidth() == 32 &&
CGF.CurFn->arg_begin()->hasName() &&
CGF.CurFn->arg_begin()->getName() == ".global_tid.") {
CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt);
GTid = CGF.Builder.CreateLoad(CGF.CurFn->arg_begin());
} else {
// Generate "int32 .kmpc_global_thread_num.addr;"
CGBuilderTy::InsertPointGuard IPG(CGF.Builder);
CGF.Builder.SetInsertPoint(CGF.AllocaInsertPt);
llvm::Value *Args[] = {EmitOpenMPUpdateLocation(CGF, Loc)};
GTid = CGF.EmitRuntimeCall(
CreateRuntimeFunction(OMPRTL__kmpc_global_thread_num), Args);
}
OpenMPGtidMap[CGF.CurFn] = GTid;
}
return GTid;