[flang-commits] [flang] [mlir] [flang][OpenMP] Allow saving first block of an OMP region for allocas (PR #121886)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Tue Jan 7 02:20:47 PST 2025
================
@@ -345,31 +345,37 @@ findAllocaInsertPoint(llvm::IRBuilderBase &builder,
allocaInsertPoint = frame.allocaInsertPoint;
return WalkResult::interrupt();
});
- if (walkResult.wasInterrupted())
- return allocaInsertPoint;
// Otherwise, insert to the entry block of the surrounding function.
- // If the current IRBuilder InsertPoint is the function's entry, it cannot
- // also be used for alloca insertion which would result in insertion order
- // confusion. Create a new BasicBlock for the Builder and use the entry block
- // for the allocs.
+ if (!walkResult.wasInterrupted()) {
+ llvm::BasicBlock &funcEntryBlock =
+ builder.GetInsertBlock()->getParent()->getEntryBlock();
+ allocaInsertPoint = llvm::OpenMPIRBuilder::InsertPointTy(
+ &funcEntryBlock, funcEntryBlock.getFirstInsertionPt());
+ }
+
+ // If the current IRBuilder insertion block is the same as the alloca
+ // insertion block, it cannot also be used for alloca insertion which would
+ // result in insertion order confusion. Create a new BasicBlock for the
+ // Builder and use the entry block for the allocs.
+ //
// TODO: Create a dedicated alloca BasicBlock at function creation such that
// we do not need to move the current InertPoint here.
- if (builder.GetInsertBlock() ==
- &builder.GetInsertBlock()->getParent()->getEntryBlock()) {
+ if (builder.GetInsertBlock() == allocaInsertPoint.getBlock()) {
assert(builder.GetInsertPoint() == builder.GetInsertBlock()->end() &&
"Assuming end of basic block");
- llvm::BasicBlock *entryBB = llvm::BasicBlock::Create(
- builder.getContext(), "entry", builder.GetInsertBlock()->getParent(),
- builder.GetInsertBlock()->getNextNode());
- builder.CreateBr(entryBB);
- builder.SetInsertPoint(entryBB);
+ auto *insertCont = splitBB(
+ llvm::OpenMPIRBuilder::InsertPointTy(
+ allocaInsertPoint.getBlock(), allocaInsertPoint.getBlock()->end()),
+ true, "insert.cont");
+ builder.SetInsertPoint(insertCont, insertCont->end());
}
- llvm::BasicBlock &funcEntryBlock =
- builder.GetInsertBlock()->getParent()->getEntryBlock();
return llvm::OpenMPIRBuilder::InsertPointTy(
- &funcEntryBlock, funcEntryBlock.getFirstInsertionPt());
+ allocaInsertPoint.getBlock(),
+ allocaInsertPoint.getPoint() != allocaInsertPoint.getBlock()->end()
+ ? allocaInsertPoint.getPoint()
+ : allocaInsertPoint.getBlock()->getFirstInsertionPt());
----------------
tblah wrote:
Why not unconditionally put the alloca at the start of the block?
https://github.com/llvm/llvm-project/pull/121886
More information about the flang-commits
mailing list