diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2018-05-25 20:16:03 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2018-05-25 20:16:03 +0000 |
commit | 0baba9e7287d5afc5bf163d954079bf2c4741fb3 (patch) | |
tree | 79653ee2df5ebe04bbdf846df42de15cde1f8ee7 /clang/lib | |
parent | 8f77dcadffe06502027bdb2701cd3653ecca919b (diff) | |
download | bcm5719-llvm-0baba9e7287d5afc5bf163d954079bf2c4741fb3.tar.gz bcm5719-llvm-0baba9e7287d5afc5bf163d954079bf2c4741fb3.zip |
[OPENMP, NVPTX] Fixed codegen for orphaned parallel region.
If orphaned parallel region is found, the next code must be emitted:
```
if(__kmpc_is_spmd_exec_mode() || __kmpc_parallel_level(loc, gtid))
Serialized execution.
else if (IsMasterThread())
Prepare and signal worker.
else
Outined function call.
```
llvm-svn: 333301
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp index 559a26f6f35..785ed567606 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp @@ -1845,35 +1845,21 @@ void CGOpenMPRuntimeNVPTX::emitNonSPMDParallelCall( RCG(CGF); } else { // Check for master and then parallelism: - // if (__kmpc_is_spmd_exec_mode()) { + // if (__kmpc_is_spmd_exec_mode() || __kmpc_parallel_level(loc, gtid)) { // Serialized execution. - // } else if (is_master) { + // } else if (master) { // Worker call. - // } else if (__kmpc_parallel_level(loc, gtid)) { - // Serialized execution. // } else { // Outlined function call. // } CGBuilderTy &Bld = CGF.Builder; llvm::BasicBlock *ExitBB = CGF.createBasicBlock(".exit"); - llvm::BasicBlock *SPMDCheckBB = CGF.createBasicBlock(".spmdcheck"); + llvm::BasicBlock *SeqBB = CGF.createBasicBlock(".sequential"); + llvm::BasicBlock *ParallelCheckBB = CGF.createBasicBlock(".parcheck"); llvm::BasicBlock *MasterCheckBB = CGF.createBasicBlock(".mastercheck"); - llvm::BasicBlock *ParallelCheckBB = - CGF.createBasicBlock(".parallelcheck"); llvm::Value *IsSPMD = Bld.CreateIsNotNull(CGF.EmitNounwindRuntimeCall( createNVPTXRuntimeFunction(OMPRTL_NVPTX__kmpc_is_spmd_exec_mode))); - Bld.CreateCondBr(IsSPMD, SPMDCheckBB, MasterCheckBB); - CGF.EmitBlock(SPMDCheckBB); - SeqGen(CGF, Action); - CGF.EmitBranch(ExitBB); - CGF.EmitBlock(MasterCheckBB); - llvm::BasicBlock *MasterThenBB = CGF.createBasicBlock("master.then"); - llvm::Value *IsMaster = - Bld.CreateICmpEQ(getNVPTXThreadID(CGF), getMasterThreadID(CGF)); - Bld.CreateCondBr(IsMaster, MasterThenBB, ParallelCheckBB); - CGF.EmitBlock(MasterThenBB); - L0ParallelGen(CGF, Action); - CGF.EmitBranch(ExitBB); + Bld.CreateCondBr(IsSPMD, SeqBB, ParallelCheckBB); // There is no need to emit line number for unconditional branch. (void)ApplyDebugLocation::CreateEmpty(CGF); CGF.EmitBlock(ParallelCheckBB); @@ -1883,15 +1869,23 @@ void CGOpenMPRuntimeNVPTX::emitNonSPMDParallelCall( createNVPTXRuntimeFunction(OMPRTL_NVPTX__kmpc_parallel_level), {RTLoc, ThreadID}); llvm::Value *Res = Bld.CreateIsNotNull(PL); - llvm::BasicBlock *ThenBlock = CGF.createBasicBlock("omp_if.then"); - llvm::BasicBlock *ElseBlock = CGF.createBasicBlock("omp_if.else"); - Bld.CreateCondBr(Res, ThenBlock, ElseBlock); - // Emit the 'then' code. - CGF.EmitBlock(ThenBlock); + Bld.CreateCondBr(Res, SeqBB, MasterCheckBB); + CGF.EmitBlock(SeqBB); SeqGen(CGF, Action); + CGF.EmitBranch(ExitBB); + // There is no need to emit line number for unconditional branch. + (void)ApplyDebugLocation::CreateEmpty(CGF); + CGF.EmitBlock(MasterCheckBB); + llvm::BasicBlock *MasterThenBB = CGF.createBasicBlock("master.then"); + llvm::BasicBlock *ElseBlock = CGF.createBasicBlock("omp_if.else"); + llvm::Value *IsMaster = + Bld.CreateICmpEQ(getNVPTXThreadID(CGF), getMasterThreadID(CGF)); + Bld.CreateCondBr(IsMaster, MasterThenBB, ElseBlock); + CGF.EmitBlock(MasterThenBB); + L0ParallelGen(CGF, Action); + CGF.EmitBranch(ExitBB); // There is no need to emit line number for unconditional branch. (void)ApplyDebugLocation::CreateEmpty(CGF); - // Emit the 'else' code. CGF.EmitBlock(ElseBlock); RCG(CGF); // There is no need to emit line number for unconditional branch. |