[Mlir-commits] [mlir] [MLIR][OpenMP] Normalize lowering of omp.loop_nest (PR #127217)
Sergio Afonso
llvmlistbot at llvm.org
Fri Feb 21 02:14:14 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:
I just pushed that change, hopefully this approach makes more sense to you.
https://github.com/llvm/llvm-project/pull/127217
More information about the Mlir-commits
mailing list