fghanim updated this revision to Diff 240451.
fghanim added a comment.
Adding a new unittest for the this fix. Thanks to JDoerfert for Writing and
providing me with this patch.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D73285/new/
https://reviews.llvm.org/D73285
Files:
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
Index: llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
===================================================================
--- llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -400,6 +400,78 @@
EXPECT_EQ(ForkCI->getArgOperand(3), F->arg_begin());
}
+TEST_F(OpenMPIRBuilderTest, ParallelEndless) {
+ using InsertPointTy = OpenMPIRBuilder::InsertPointTy;
+ OpenMPIRBuilder OMPBuilder(*M);
+ OMPBuilder.initialize();
+ F->setName("func");
+ IRBuilder<> Builder(BB);
+
+ OpenMPIRBuilder::LocationDescription Loc({Builder.saveIP(), DL});
+
+ unsigned NumBodiesGenerated = 0;
+ unsigned NumPrivatizedVars = 0;
+ unsigned NumFinalizationPoints = 0;
+
+ BasicBlock *OutlinedBodyBB = nullptr;
+ auto BodyGenCB = [&](InsertPointTy AllocaIP, InsertPointTy CodeGenIP,
+ BasicBlock &ContinuationIP) {
+ ++NumBodiesGenerated;
+
+ auto *OldBB = OutlinedBodyBB = CodeGenIP.getBlock();
+
+ // Create an endless loop.
+ OldBB->getTerminator()->eraseFromParent();
+ BranchInst::Create(OldBB, OldBB);
+
+ Builder.ClearInsertionPoint();
+ };
+
+ auto PrivCB = [&](InsertPointTy AllocaIP, InsertPointTy CodeGenIP,
+ Value &VPtr, Value *&ReplacementValue) -> InsertPointTy {
+ ++NumPrivatizedVars;
+ return CodeGenIP;
+ };
+
+ auto FiniCB = [&](InsertPointTy CodeGenIP) { ++NumFinalizationPoints; };
+
+ IRBuilder<>::InsertPoint AfterIP =
+ OMPBuilder.CreateParallel(Loc, BodyGenCB, PrivCB, FiniCB, nullptr,
+ nullptr, OMP_PROC_BIND_default, false);
+
+ EXPECT_EQ(NumBodiesGenerated, 1U);
+ EXPECT_EQ(NumPrivatizedVars, 0U);
+ EXPECT_EQ(NumFinalizationPoints, 0U);
+
+ Builder.restoreIP(AfterIP);
+ Builder.CreateRetVoid();
+
+ ASSERT_NE(OutlinedBodyBB, nullptr);
+ Function *OutlinedFn = OutlinedBodyBB->getParent();
+ EXPECT_NE(F, OutlinedFn);
+ EXPECT_FALSE(verifyModule(*M));
+ EXPECT_TRUE(OutlinedFn->hasFnAttribute(Attribute::NoUnwind));
+ EXPECT_TRUE(OutlinedFn->hasFnAttribute(Attribute::NoRecurse));
+ EXPECT_TRUE(OutlinedFn->hasParamAttribute(0, Attribute::NoAlias));
+ EXPECT_TRUE(OutlinedFn->hasParamAttribute(1, Attribute::NoAlias));
+
+ EXPECT_TRUE(OutlinedFn->hasInternalLinkage());
+ EXPECT_EQ(OutlinedFn->arg_size(), 2U);
+
+ EXPECT_EQ(OutlinedFn->getNumUses(), 1U);
+ User *Usr = OutlinedFn->user_back();
+ ASSERT_TRUE(isa<ConstantExpr>(Usr));
+ CallInst *ForkCI = dyn_cast<CallInst>(Usr->user_back());
+ ASSERT_NE(ForkCI, nullptr);
+
+ EXPECT_EQ(ForkCI->getCalledFunction()->getName(), "__kmpc_fork_call");
+ EXPECT_EQ(ForkCI->getNumArgOperands(), 3U);
+ EXPECT_TRUE(isa<GlobalVariable>(ForkCI->getArgOperand(0)));
+ EXPECT_EQ(ForkCI->getArgOperand(1),
+ ConstantInt::get(Type::getInt32Ty(Ctx), 0U));
+ EXPECT_EQ(ForkCI->getArgOperand(2), Usr);
+}
+
TEST_F(OpenMPIRBuilderTest, ParallelIfCond) {
using InsertPointTy = OpenMPIRBuilder::InsertPointTy;
OpenMPIRBuilder OMPBuilder(*M);
Index: llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
===================================================================
--- llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -623,6 +623,7 @@
auto FiniInfo = FinalizationStack.pop_back_val();
assert(FiniInfo.DK == OMPD_parallel &&
"Unexpected finalization stack state!");
+
if (FoundPreFiniBB) {
// PRegPreFiniBB is reachable. Adjust the finalization stack, verify the
// adjustment, and call the finalize function a last time to finalize values
@@ -631,10 +632,7 @@
(void)FiniInfo;
Instruction *PreFiniTI = PRegPreFiniBB->getTerminator();
- assert(PreFiniTI->getNumSuccessors() == 1 &&
- PreFiniTI->getSuccessor(0)->size() == 1 &&
- isa<ReturnInst>(PreFiniTI->getSuccessor(0)->getTerminator()) &&
- "Unexpected CFG structure!");
+ assert(PreFiniTI->getNumSuccessors() == 1 && "Unexpected CFG structure!");
InsertPointTy PreFiniIP(PRegPreFiniBB, PreFiniTI->getIterator());
FiniCB(PreFiniIP);
@@ -665,7 +663,6 @@
for (Instruction *I : ToBeDeleted)
I->eraseFromParent();
- AfterIP.getBlock()->dump();
return AfterIP;
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits