summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/Frontend
diff options
context:
space:
mode:
authorJohannes Doerfert <johannes@jdoerfert.de>2019-12-27 15:53:37 -0600
committerJohannes Doerfert <johannes@jdoerfert.de>2019-12-30 13:57:13 -0600
commit000c6a5038bc654946b4348e586d685077b06943 (patch)
tree45e63249c359a027b79f1825d9a06c1fde7be490 /llvm/unittests/Frontend
parent4a7aa252a32a94b1bb61b3dc7f027b4a27ae334f (diff)
downloadbcm5719-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.cpp116
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);
OpenPOWER on IntegriCloud