[Mlir-commits] [mlir] [MLIR][OpenMP] Normalize lowering of omp.loop_nest (PR #127217)
Sergio Afonso
llvmlistbot at llvm.org
Thu Feb 20 07:48:06 PST 2025
================
@@ -2348,57 +2364,31 @@ convertOmpSimd(Operation &opInst, llvm::IRBuilderBase &builder,
llvm::Expected<llvm::CanonicalLoopInfo *> loopResult =
ompBuilder->createCanonicalLoop(
loc, bodyGen, lowerBound, upperBound, step,
- /*IsSigned=*/true, /*InclusiveStop=*/true, computeIP);
+ /*IsSigned=*/true, loopOp.getLoopInclusive(), computeIP);
if (failed(handleError(loopResult, *loopOp)))
return failure();
loopInfos.push_back(*loopResult);
}
- // Collapse loops.
- llvm::IRBuilderBase::InsertPoint afterIP = loopInfos.front()->getAfterIP();
- llvm::CanonicalLoopInfo *loopInfo =
- ompBuilder->collapseLoops(ompLoc.DL, loopInfos, {});
-
- llvm::ConstantInt *simdlen = nullptr;
- if (std::optional<uint64_t> simdlenVar = simdOp.getSimdlen())
- simdlen = builder.getInt64(simdlenVar.value());
+ // Collapse loops. Store the insertion point because LoopInfos may get
+ // invalidated.
+ llvm::OpenMPIRBuilder::InsertPointTy afterIP =
+ loopInfos.front()->getAfterIP();
- llvm::ConstantInt *safelen = nullptr;
- if (std::optional<uint64_t> safelenVar = simdOp.getSafelen())
- safelen = builder.getInt64(safelenVar.value());
-
- llvm::MapVector<llvm::Value *, llvm::Value *> alignedVars;
- llvm::omp::OrderKind order = convertOrderKind(simdOp.getOrder());
- llvm::BasicBlock *sourceBlock = builder.GetInsertBlock();
- std::optional<ArrayAttr> alignmentValues = simdOp.getAlignments();
- mlir::OperandRange operands = simdOp.getAlignedVars();
- for (size_t i = 0; i < operands.size(); ++i) {
- llvm::Value *alignment = nullptr;
- llvm::Value *llvmVal = moduleTranslation.lookupValue(operands[i]);
- llvm::Type *ty = llvmVal->getType();
- if (auto intAttr = llvm::dyn_cast<IntegerAttr>((*alignmentValues)[i])) {
- alignment = builder.getInt64(intAttr.getInt());
- assert(ty->isPointerTy() && "Invalid type for aligned variable");
- assert(alignment && "Invalid alignment value");
- auto curInsert = builder.saveIP();
- builder.SetInsertPoint(sourceBlock->getTerminator());
- llvmVal = builder.CreateLoad(ty, llvmVal);
- builder.restoreIP(curInsert);
- alignedVars[llvmVal] = alignment;
- }
- }
- ompBuilder->applySimd(loopInfo, alignedVars,
- simdOp.getIfExpr()
- ? moduleTranslation.lookupValue(simdOp.getIfExpr())
- : nullptr,
- order, simdlen, safelen);
+ // Add a stack frame holding information about the resulting loop after
+ // applying transformations, to be further transformed by parent loop
+ // wrappers.
+ moduleTranslation.stackPush<OpenMPLoopInfoStackFrame>(
----------------
skatrak wrote:
Having said that, I noticed that the current approach can break when other stack frames are inserted by loop wrappers, because it messes up with their order. So they can end up popping the stack frame inserted by the `omp.loop_nest` rather than the one they pushed prior to translating the loop.
I'm going to work on the alternative implementation where `push` and `pop` are done conditionally in `convertHostOrTargetOperation`, and make the necessary changes to `ModuleTranslation` so that there's a non-const way of accessing the stack frames.
https://github.com/llvm/llvm-project/pull/127217
More information about the Mlir-commits
mailing list