diff options
| author | Johannes Doerfert <johannes@jdoerfert.de> | 2019-12-27 15:53:37 -0600 |
|---|---|---|
| committer | Johannes Doerfert <johannes@jdoerfert.de> | 2019-12-30 13:57:13 -0600 |
| commit | 000c6a5038bc654946b4348e586d685077b06943 (patch) | |
| tree | 45e63249c359a027b79f1825d9a06c1fde7be490 /llvm/unittests/Frontend | |
| parent | 4a7aa252a32a94b1bb61b3dc7f027b4a27ae334f (diff) | |
| download | bcm5719-llvm-000c6a5038bc654946b4348e586d685077b06943.tar.gz bcm5719-llvm-000c6a5038bc654946b4348e586d685077b06943.zip | |
[OpenMP] Use the OpenMPIRBuilder for `omp cancel`
An `omp cancel parallel` needs to be emitted by the OpenMPIRBuilder if
the `parallel` was emitted by the OpenMPIRBuilder. This patch makes
this possible. The cancel logic is shared with the cancel barriers.
Testing is done via unit tests and the clang cancel_codegen.cpp file
once D70290 lands.
Reviewed By: JonChesterfield
Differential Revision: https://reviews.llvm.org/D71948
Diffstat (limited to 'llvm/unittests/Frontend')
| -rw-r--r-- | llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp index 7d2d0b9fe0a..e777149b30e 100644 --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -99,6 +99,122 @@ TEST_F(OpenMPIRBuilderTest, CreateBarrier) { EXPECT_FALSE(verifyModule(*M)); } +TEST_F(OpenMPIRBuilderTest, CreateCancel) { + using InsertPointTy = OpenMPIRBuilder::InsertPointTy; + OpenMPIRBuilder OMPBuilder(*M); + OMPBuilder.initialize(); + + BasicBlock *CBB = BasicBlock::Create(Ctx, "", F); + new UnreachableInst(Ctx, CBB); + auto FiniCB = [&](InsertPointTy IP) { + ASSERT_NE(IP.getBlock(), nullptr); + ASSERT_EQ(IP.getBlock()->end(), IP.getPoint()); + BranchInst::Create(CBB, IP.getBlock()); + }; + OMPBuilder.pushFinalizationCB({FiniCB, OMPD_parallel, true}); + + IRBuilder<> Builder(BB); + + OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP()}); + auto NewIP = OMPBuilder.CreateCancel(Loc, nullptr, OMPD_parallel); + Builder.restoreIP(NewIP); + EXPECT_FALSE(M->global_empty()); + EXPECT_EQ(M->size(), 3U); + EXPECT_EQ(F->size(), 4U); + EXPECT_EQ(BB->size(), 4U); + + CallInst *GTID = dyn_cast<CallInst>(&BB->front()); + EXPECT_NE(GTID, nullptr); + EXPECT_EQ(GTID->getNumArgOperands(), 1U); + EXPECT_EQ(GTID->getCalledFunction()->getName(), "__kmpc_global_thread_num"); + EXPECT_FALSE(GTID->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(GTID->getCalledFunction()->doesNotFreeMemory()); + + CallInst *Cancel = dyn_cast<CallInst>(GTID->getNextNode()); + EXPECT_NE(Cancel, nullptr); + EXPECT_EQ(Cancel->getNumArgOperands(), 3U); + EXPECT_EQ(Cancel->getCalledFunction()->getName(), "__kmpc_cancel"); + EXPECT_FALSE(Cancel->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(Cancel->getCalledFunction()->doesNotFreeMemory()); + EXPECT_EQ(Cancel->getNumUses(), 1U); + Instruction *CancelBBTI = Cancel->getParent()->getTerminator(); + EXPECT_EQ(CancelBBTI->getNumSuccessors(), 2U); + EXPECT_EQ(CancelBBTI->getSuccessor(0), NewIP.getBlock()); + EXPECT_EQ(CancelBBTI->getSuccessor(1)->size(), 1U); + EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getNumSuccessors(), + 1U); + EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getSuccessor(0), + CBB); + + EXPECT_EQ(cast<CallInst>(Cancel)->getArgOperand(1), GTID); + + OMPBuilder.popFinalizationCB(); + + Builder.CreateUnreachable(); + EXPECT_FALSE(verifyModule(*M)); +} + +TEST_F(OpenMPIRBuilderTest, CreateCancelIfCond) { + using InsertPointTy = OpenMPIRBuilder::InsertPointTy; + OpenMPIRBuilder OMPBuilder(*M); + OMPBuilder.initialize(); + + BasicBlock *CBB = BasicBlock::Create(Ctx, "", F); + new UnreachableInst(Ctx, CBB); + auto FiniCB = [&](InsertPointTy IP) { + ASSERT_NE(IP.getBlock(), nullptr); + ASSERT_EQ(IP.getBlock()->end(), IP.getPoint()); + BranchInst::Create(CBB, IP.getBlock()); + }; + OMPBuilder.pushFinalizationCB({FiniCB, OMPD_parallel, true}); + + IRBuilder<> Builder(BB); + + OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP()}); + auto NewIP = OMPBuilder.CreateCancel(Loc, Builder.getTrue(), OMPD_parallel); + Builder.restoreIP(NewIP); + EXPECT_FALSE(M->global_empty()); + EXPECT_EQ(M->size(), 3U); + EXPECT_EQ(F->size(), 7U); + EXPECT_EQ(BB->size(), 1U); + ASSERT_TRUE(isa<BranchInst>(BB->getTerminator())); + ASSERT_EQ(BB->getTerminator()->getNumSuccessors(), 2U); + BB = BB->getTerminator()->getSuccessor(0); + EXPECT_EQ(BB->size(), 4U); + + + CallInst *GTID = dyn_cast<CallInst>(&BB->front()); + EXPECT_NE(GTID, nullptr); + EXPECT_EQ(GTID->getNumArgOperands(), 1U); + EXPECT_EQ(GTID->getCalledFunction()->getName(), "__kmpc_global_thread_num"); + EXPECT_FALSE(GTID->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(GTID->getCalledFunction()->doesNotFreeMemory()); + + CallInst *Cancel = dyn_cast<CallInst>(GTID->getNextNode()); + EXPECT_NE(Cancel, nullptr); + EXPECT_EQ(Cancel->getNumArgOperands(), 3U); + EXPECT_EQ(Cancel->getCalledFunction()->getName(), "__kmpc_cancel"); + EXPECT_FALSE(Cancel->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(Cancel->getCalledFunction()->doesNotFreeMemory()); + EXPECT_EQ(Cancel->getNumUses(), 1U); + Instruction *CancelBBTI = Cancel->getParent()->getTerminator(); + EXPECT_EQ(CancelBBTI->getNumSuccessors(), 2U); + EXPECT_EQ(CancelBBTI->getSuccessor(0)->size(), 1U); + EXPECT_EQ(CancelBBTI->getSuccessor(0)->getUniqueSuccessor(), NewIP.getBlock()); + EXPECT_EQ(CancelBBTI->getSuccessor(1)->size(), 1U); + EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getNumSuccessors(), + 1U); + EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getSuccessor(0), + CBB); + + EXPECT_EQ(cast<CallInst>(Cancel)->getArgOperand(1), GTID); + + OMPBuilder.popFinalizationCB(); + + Builder.CreateUnreachable(); + EXPECT_FALSE(verifyModule(*M)); +} + TEST_F(OpenMPIRBuilderTest, CreateCancelBarrier) { using InsertPointTy = OpenMPIRBuilder::InsertPointTy; OpenMPIRBuilder OMPBuilder(*M); |

