From: Alexey Bataev Date: Fri, 25 Jul 2014 07:55:17 +0000 (+0000) Subject: [OPENMP] Improved codegen for outlined functions for 'parallel' directives. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5312c46c7cf2f0cacd1b4ae6b24b65f749df607b;p=clang [OPENMP] Improved codegen for outlined functions for 'parallel' directives. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@213927 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGOpenMPRuntime.cpp b/lib/CodeGen/CGOpenMPRuntime.cpp index 12a3a7790e..e5de9fc2f9 100644 --- a/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/lib/CodeGen/CGOpenMPRuntime.cpp @@ -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;