[flang-commits] [flang] [mlir] [flang][mlir] Add support for implicit linearization in omp.simd (PR #150386)
via flang-commits
flang-commits at lists.llvm.org
Thu Dec 18 04:56:24 PST 2025
================
@@ -3025,9 +3025,36 @@ genStandaloneSimd(lower::AbstractConverter &converter, lower::SymMap &symTable,
simdArgs.priv.vars = simdClauseOps.privateVars;
simdArgs.reduction.syms = simdReductionSyms;
simdArgs.reduction.vars = simdClauseOps.reductionVars;
+
+ std::vector<mlir::Attribute> typeAttrs;
+ // If attributes from explicit `linear(...)` clause are present,
+ // carry them forward.
+ if (simdClauseOps.linearVarTypes && !simdClauseOps.linearVarTypes.empty())
+ typeAttrs.assign(simdClauseOps.linearVarTypes.begin(),
+ simdClauseOps.linearVarTypes.end());
+
+ for (auto [loopVar, loopStep] : llvm::zip(iv, loopNestClauseOps.loopSteps)) {
+ // TODO: Implicit linearization is skipped if iv is a pointer
+ // or an allocatable, due to potential mismatch between the linear
+ // variable type (example !fir.ref<!fir.box<!fir.heap<i32>>>)
+ // and the linear step size (example: i64). Handle this type mismatch
+ // gracefully.
+ if (loopVar->test(Fortran::semantics::Symbol::Flag::OmpLinear) &&
+ !(Fortran::semantics::IsAllocatableOrPointer(*loopVar) ||
+ Fortran::semantics::IsAllocatableOrPointer(loopVar->GetUltimate()))) {
+ const mlir::Value variable = converter.getSymbolAddress(*loopVar);
+ mlir::Type ty = converter.genType(*loopVar);
+ typeAttrs.push_back(mlir::TypeAttr::get(ty));
----------------
NimishMishra wrote:
Okay, that's a good point. I will test on this a bit more.
https://github.com/llvm/llvm-project/pull/150386
More information about the flang-commits
mailing list