[Mlir-commits] [mlir] [mlir][OpenMP] Support pure taskloop-local loop bounds (PR #190992)
Jack Styles
llvmlistbot at llvm.org
Mon Apr 13 06:47:47 PDT 2026
================
@@ -2874,6 +2875,171 @@ convertOmpTaskloopWrapperOp(omp::TaskloopWrapperOp loopWrapperOp,
return success();
}
+/// Look up the given value in the mapping, and if it's not there, translate its
+/// defining operation at the current builder insertion point. Only pure,
+/// regionless operations are supported because the same operation will later be
+/// translated again when the taskloop body itself is lowered.
+static llvm::Expected<llvm::Value *>
+lookupOrTranslatePureValue(Value value,
+ LLVM::ModuleTranslation &moduleTranslation,
+ llvm::IRBuilderBase &builder) {
+ if (llvm::Value *mapped = moduleTranslation.lookupValue(value))
+ return mapped;
+
+ Operation *defOp = value.getDefiningOp();
+ if (!defOp)
+ return llvm::make_error<llvm::StringError>(
+ "value is a block argument and is not mapped",
+ llvm::inconvertibleErrorCode());
+ if (defOp->getNumRegions() != 0 || !isPure(defOp))
+ return llvm::make_error<llvm::StringError>(
+ "unsupported op defining taskloop loop bound",
+ llvm::inconvertibleErrorCode());
+
+ SmallVector<Value> mappingsToRemove;
+ mappingsToRemove.reserve(defOp->getNumOperands() + defOp->getNumResults());
+ for (Value operand : defOp->getOperands()) {
+ if (moduleTranslation.lookupValue(operand))
+ continue;
+
+ llvm::Expected<llvm::Value *> operandOrError =
+ lookupOrTranslatePureValue(operand, moduleTranslation, builder);
+ if (!operandOrError)
+ return operandOrError.takeError();
+ moduleTranslation.mapValue(operand, *operandOrError);
+ mappingsToRemove.push_back(operand);
+ }
+
+ if (failed(moduleTranslation.convertOperation(*defOp, builder)))
+ return llvm::make_error<llvm::StringError>(
+ "failed to convert op defining taskloop loop bound",
+ llvm::inconvertibleErrorCode());
+
+ llvm::Value *result = moduleTranslation.lookupValue(value);
+ assert(result && "expected conversion of loop bound op to produce a value");
+
+ for (Value resultValue : defOp->getResults()) {
+ if (moduleTranslation.lookupValue(resultValue))
+ mappingsToRemove.push_back(resultValue);
+ }
+ for (Value mappedValue : mappingsToRemove)
+ moduleTranslation.forgetMapping(mappedValue);
+
+ return result;
+}
+
+static llvm::Error
+computeTaskloopBounds(omp::LoopNestOp loopOp, llvm::IRBuilderBase &builder,
+ LLVM::ModuleTranslation &moduleTranslation,
+ llvm::Value *&lbVal, llvm::Value *&ubVal,
+ llvm::Value *&stepVal) {
+ Operation::operand_range lowerBounds = loopOp.getLoopLowerBounds();
+ Operation::operand_range upperBounds = loopOp.getLoopUpperBounds();
+ Operation::operand_range steps = loopOp.getLoopSteps();
+
+ llvm::Expected<llvm::Value *> firstLbOrErr =
+ lookupOrTranslatePureValue(lowerBounds[0], moduleTranslation, builder);
+ if (!firstLbOrErr)
+ return firstLbOrErr.takeError();
+
+ llvm::Type *boundType = (*firstLbOrErr)->getType();
----------------
Stylie777 wrote:
Ah yes! That makes sense
https://github.com/llvm/llvm-project/pull/190992
More information about the Mlir-commits
mailing list