diff options
author | Alexey Bataev <a.bataev@outlook.com> | 2021-06-03 14:13:35 -0700 |
---|---|---|
committer | Alexey Bataev <a.bataev@outlook.com> | 2021-06-04 08:24:55 -0700 |
commit | c84a5448b5ac3212303c553866e8d42a5a75ce30 (patch) | |
tree | 199b267d071b6cbaac1e7ee1856a438d759e22e6 /llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | |
parent | a85f5874e2a4d4bad8c53d277e9df183122793ae (diff) | |
download | llvm-c84a5448b5ac3212303c553866e8d42a5a75ce30.zip llvm-c84a5448b5ac3212303c553866e8d42a5a75ce30.tar.gz llvm-c84a5448b5ac3212303c553866e8d42a5a75ce30.tar.bz2 |
[OPENMP]Fix PR50129: omp cancel parallel not working as expected.
Need to emit a call for __kmpc_cancel_barrier in the exit block for
__kmpc_cancel function call if cancellation of the parallel block is
requested.
Differential Revision: https://reviews.llvm.org/D103646
Diffstat (limited to 'llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp')
-rw-r--r-- | llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp index c9e4bed..0df6fe5 100644 --- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp +++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp @@ -231,7 +231,7 @@ TEST_F(OpenMPIRBuilderTest, CreateCancel) { auto NewIP = OMPBuilder.createCancel(Loc, nullptr, OMPD_parallel); Builder.restoreIP(NewIP); EXPECT_FALSE(M->global_empty()); - EXPECT_EQ(M->size(), 3U); + EXPECT_EQ(M->size(), 4U); EXPECT_EQ(F->size(), 4U); EXPECT_EQ(BB->size(), 4U); @@ -252,7 +252,20 @@ TEST_F(OpenMPIRBuilderTest, CreateCancel) { 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)->size(), 3U); + CallInst *GTID1 = dyn_cast<CallInst>(&CancelBBTI->getSuccessor(1)->front()); + EXPECT_NE(GTID1, nullptr); + EXPECT_EQ(GTID1->getNumArgOperands(), 1U); + EXPECT_EQ(GTID1->getCalledFunction()->getName(), "__kmpc_global_thread_num"); + EXPECT_FALSE(GTID1->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(GTID1->getCalledFunction()->doesNotFreeMemory()); + CallInst *Barrier = dyn_cast<CallInst>(GTID1->getNextNode()); + EXPECT_NE(Barrier, nullptr); + EXPECT_EQ(Barrier->getNumArgOperands(), 2U); + EXPECT_EQ(Barrier->getCalledFunction()->getName(), "__kmpc_cancel_barrier"); + EXPECT_FALSE(Barrier->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(Barrier->getCalledFunction()->doesNotFreeMemory()); + EXPECT_EQ(Barrier->getNumUses(), 0U); EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getNumSuccessors(), 1U); EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getSuccessor(0), @@ -286,7 +299,7 @@ TEST_F(OpenMPIRBuilderTest, CreateCancelIfCond) { auto NewIP = OMPBuilder.createCancel(Loc, Builder.getTrue(), OMPD_parallel); Builder.restoreIP(NewIP); EXPECT_FALSE(M->global_empty()); - EXPECT_EQ(M->size(), 3U); + EXPECT_EQ(M->size(), 4U); EXPECT_EQ(F->size(), 7U); EXPECT_EQ(BB->size(), 1U); ASSERT_TRUE(isa<BranchInst>(BB->getTerminator())); @@ -313,7 +326,20 @@ TEST_F(OpenMPIRBuilderTest, CreateCancelIfCond) { 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)->size(), 3U); + CallInst *GTID1 = dyn_cast<CallInst>(&CancelBBTI->getSuccessor(1)->front()); + EXPECT_NE(GTID1, nullptr); + EXPECT_EQ(GTID1->getNumArgOperands(), 1U); + EXPECT_EQ(GTID1->getCalledFunction()->getName(), "__kmpc_global_thread_num"); + EXPECT_FALSE(GTID1->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(GTID1->getCalledFunction()->doesNotFreeMemory()); + CallInst *Barrier = dyn_cast<CallInst>(GTID1->getNextNode()); + EXPECT_NE(Barrier, nullptr); + EXPECT_EQ(Barrier->getNumArgOperands(), 2U); + EXPECT_EQ(Barrier->getCalledFunction()->getName(), "__kmpc_cancel_barrier"); + EXPECT_FALSE(Barrier->getCalledFunction()->doesNotAccessMemory()); + EXPECT_FALSE(Barrier->getCalledFunction()->doesNotFreeMemory()); + EXPECT_EQ(Barrier->getNumUses(), 0U); EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getNumSuccessors(), 1U); EXPECT_EQ(CancelBBTI->getSuccessor(1)->getTerminator()->getSuccessor(0), |