Skip to content

Conversation

@clementval
Copy link
Contributor

Some more updates found in flang/Lower and flang/Optimizer directories.

See #147168

I think all FIR operation creations have been updated. There are still some other dialect op creations that need an update. I'll try to submit a patch later for those.

@llvmbot llvmbot added flang Flang issues not falling into any other category flang:fir-hlfir flang:codegen labels Aug 5, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 5, 2025

@llvm/pr-subscribers-flang-fir-hlfir

@llvm/pr-subscribers-flang-codegen

Author: Valentin Clement (バレンタイン クレメン) (clementval)

Changes

Some more updates found in flang/Lower and flang/Optimizer directories.

See #147168

I think all FIR operation creations have been updated. There are still some other dialect op creations that need an update. I'll try to submit a patch later for those.


Patch is 81.73 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/152060.diff

12 Files Affected:

  • (modified) flang/include/flang/Optimizer/Builder/FIRBuilder.h (+3-3)
  • (modified) flang/include/flang/Optimizer/Builder/Factory.h (+36-39)
  • (modified) flang/lib/Lower/Bridge.cpp (+128-125)
  • (modified) flang/lib/Lower/ConvertExpr.cpp (+16-18)
  • (modified) flang/lib/Lower/ConvertProcedureDesignator.cpp (+1-1)
  • (modified) flang/lib/Lower/CustomIntrinsicCall.cpp (+1-1)
  • (modified) flang/lib/Lower/IO.cpp (+4-6)
  • (modified) flang/lib/Optimizer/Builder/FIRBuilder.cpp (+51-48)
  • (modified) flang/lib/Optimizer/Builder/IntrinsicCall.cpp (+4-4)
  • (modified) flang/lib/Optimizer/Builder/Runtime/Intrinsics.cpp (+2-3)
  • (modified) flang/lib/Optimizer/CodeGen/TargetRewrite.cpp (+40-37)
  • (modified) flang/lib/Optimizer/Transforms/PolymorphicOpConversion.cpp (+2-3)
diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h index 78ee6f00cbdb0..8b4c2f73a84e8 100644 --- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h +++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h @@ -530,21 +530,21 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener { /// bodies. IfBuilder genIfOp(mlir::Location loc, mlir::TypeRange results, mlir::Value cdt, bool withElseRegion) { - auto op = create<fir::IfOp>(loc, results, cdt, withElseRegion); + auto op = fir::IfOp::create(*this, loc, results, cdt, withElseRegion); return IfBuilder(op, *this); } /// Create an IfOp with no "else" region, and no result values. /// Usage: genIfThen(loc, cdt).genThen(lambda).end(); IfBuilder genIfThen(mlir::Location loc, mlir::Value cdt) { - auto op = create<fir::IfOp>(loc, mlir::TypeRange(), cdt, false); + auto op = fir::IfOp::create(*this, loc, mlir::TypeRange(), cdt, false); return IfBuilder(op, *this); } /// Create an IfOp with an "else" region, and no result values. /// Usage: genIfThenElse(loc, cdt).genThen(lambda).genElse(lambda).end(); IfBuilder genIfThenElse(mlir::Location loc, mlir::Value cdt) { - auto op = create<fir::IfOp>(loc, mlir::TypeRange(), cdt, true); + auto op = fir::IfOp::create(*this, loc, mlir::TypeRange(), cdt, true); return IfBuilder(op, *this); } diff --git a/flang/include/flang/Optimizer/Builder/Factory.h b/flang/include/flang/Optimizer/Builder/Factory.h index 4e5c52ac44e07..e67ef457c8b4c 100644 --- a/flang/include/flang/Optimizer/Builder/Factory.h +++ b/flang/include/flang/Optimizer/Builder/Factory.h @@ -49,8 +49,8 @@ void genCharacterCopy(mlir::Value src, mlir::Value srcLen, mlir::Value dst, if (!srcLen && !dstLen && srcTy.getFKind() == dstTy.getFKind() && srcTy.getLen() == dstTy.getLen()) { // same size, so just use load and store - auto load = builder.template create<fir::LoadOp>(loc, src); - builder.template create<fir::StoreOp>(loc, load, dst); + auto load = fir::LoadOp::create(builder, loc, src); + fir::StoreOp::create(builder, loc, load, dst); return; } auto zero = builder.template create<mlir::arith::ConstantIndexOp>(loc, 0); @@ -70,75 +70,72 @@ void genCharacterCopy(mlir::Value src, mlir::Value srcLen, mlir::Value dst, if (!srcLen && !dstLen && srcTy.getLen() >= dstTy.getLen()) { auto upper = builder.template create<mlir::arith::ConstantIndexOp>( loc, dstTy.getLen() - 1); - auto loop = builder.template create<fir::DoLoopOp>(loc, zero, upper, one); + auto loop = fir::DoLoopOp::create(builder, loc, zero, upper, one); auto insPt = builder.saveInsertionPoint(); builder.setInsertionPointToStart(loop.getBody()); auto csrcTy = toArrayTy(srcTy); - auto csrc = builder.template create<fir::ConvertOp>(loc, csrcTy, src); - auto in = builder.template create<fir::CoordinateOp>( - loc, toCoorTy(csrcTy), csrc, loop.getInductionVar()); - auto load = builder.template create<fir::LoadOp>(loc, in); + auto csrc = fir::ConvertOp::create(builder, loc, csrcTy, src); + auto in = fir::CoordinateOp::create(builder, loc, toCoorTy(csrcTy), csrc, + loop.getInductionVar()); + auto load = fir::LoadOp::create(builder, loc, in); auto cdstTy = toArrayTy(dstTy); - auto cdst = builder.template create<fir::ConvertOp>(loc, cdstTy, dst); - auto out = builder.template create<fir::CoordinateOp>( - loc, toCoorTy(cdstTy), cdst, loop.getInductionVar()); + auto cdst = fir::ConvertOp::create(builder, loc, cdstTy, dst); + auto out = fir::CoordinateOp::create(builder, loc, toCoorTy(cdstTy), cdst, + loop.getInductionVar()); mlir::Value cast = srcTy.getFKind() == dstTy.getFKind() ? load.getResult() - : builder - .template create<fir::ConvertOp>(loc, toEleTy(cdstTy), load) + : fir::ConvertOp::create(builder, loc, toEleTy(cdstTy), load) .getResult(); - builder.template create<fir::StoreOp>(loc, cast, out); + fir::StoreOp::create(builder, loc, cast, out); builder.restoreInsertionPoint(insPt); return; } auto minusOne = [&](mlir::Value v) -> mlir::Value { return builder.template create<mlir::arith::SubIOp>( - loc, builder.template create<fir::ConvertOp>(loc, one.getType(), v), - one); + loc, fir::ConvertOp::create(builder, loc, one.getType(), v), one); }; mlir::Value len = dstLen ? minusOne(dstLen) : builder .template create<mlir::arith::ConstantIndexOp>( loc, dstTy.getLen() - 1) .getResult(); - auto loop = builder.template create<fir::DoLoopOp>(loc, zero, len, one); + auto loop = fir::DoLoopOp::create(builder, loc, zero, len, one); auto insPt = builder.saveInsertionPoint(); builder.setInsertionPointToStart(loop.getBody()); mlir::Value slen = - srcLen - ? builder.template create<fir::ConvertOp>(loc, one.getType(), srcLen) - .getResult() - : builder - .template create<mlir::arith::ConstantIndexOp>(loc, - srcTy.getLen()) - .getResult(); + srcLen ? fir::ConvertOp::create(builder, loc, one.getType(), srcLen) + .getResult() + : builder + .template create<mlir::arith::ConstantIndexOp>( + loc, srcTy.getLen()) + .getResult(); auto cond = builder.template create<mlir::arith::CmpIOp>( loc, mlir::arith::CmpIPredicate::slt, loop.getInductionVar(), slen); - auto ifOp = builder.template create<fir::IfOp>(loc, cond, /*withElse=*/true); + auto ifOp = fir::IfOp::create(builder, loc, cond, /*withElse=*/true); builder.setInsertionPointToStart(&ifOp.getThenRegion().front()); auto csrcTy = toArrayTy(srcTy); - auto csrc = builder.template create<fir::ConvertOp>(loc, csrcTy, src); - auto in = builder.template create<fir::CoordinateOp>( - loc, toCoorTy(csrcTy), csrc, loop.getInductionVar()); - auto load = builder.template create<fir::LoadOp>(loc, in); + auto csrc = fir::ConvertOp::create(builder, loc, csrcTy, src); + auto in = fir::CoordinateOp::create(builder, loc, toCoorTy(csrcTy), csrc, + loop.getInductionVar()); + auto load = fir::LoadOp::create(builder, loc, in); auto cdstTy = toArrayTy(dstTy); - auto cdst = builder.template create<fir::ConvertOp>(loc, cdstTy, dst); - auto out = builder.template create<fir::CoordinateOp>( - loc, toCoorTy(cdstTy), cdst, loop.getInductionVar()); + auto cdst = fir::ConvertOp::create(builder, loc, cdstTy, dst); + auto out = fir::CoordinateOp::create(builder, loc, toCoorTy(cdstTy), cdst, + loop.getInductionVar()); mlir::Value cast = srcTy.getFKind() == dstTy.getFKind() ? load.getResult() - : builder.template create<fir::ConvertOp>(loc, toEleTy(cdstTy), load) + : fir::ConvertOp::create(builder, loc, toEleTy(cdstTy), load) .getResult(); - builder.template create<fir::StoreOp>(loc, cast, out); + fir::StoreOp::create(builder, loc, cast, out); builder.setInsertionPointToStart(&ifOp.getElseRegion().front()); - auto space = builder.template create<fir::StringLitOp>( - loc, toEleTy(cdstTy), llvm::ArrayRef<char>{' '}); - auto cdst2 = builder.template create<fir::ConvertOp>(loc, cdstTy, dst); - auto out2 = builder.template create<fir::CoordinateOp>( - loc, toCoorTy(cdstTy), cdst2, loop.getInductionVar()); - builder.template create<fir::StoreOp>(loc, space, out2); + auto space = fir::StringLitOp::create(builder, loc, toEleTy(cdstTy), + llvm::ArrayRef<char>{' '}); + auto cdst2 = fir::ConvertOp::create(builder, loc, cdstTy, dst); + auto out2 = fir::CoordinateOp::create(builder, loc, toCoorTy(cdstTy), cdst2, + loop.getInductionVar()); + fir::StoreOp::create(builder, loc, space, out2); builder.restoreInsertionPoint(insPt); } diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 1e88431b0eb1f..61476efbee1fc 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -796,7 +796,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { auto empty = fir::factory::createUnallocatedBox( *builder, loc, new_box->getBoxTy(), box.nonDeferredLenParams(), {}); - builder->create<fir::StoreOp>(loc, empty, new_box->getAddr()); + fir::StoreOp::create(*builder, loc, empty, new_box->getAddr()); return; } // Copy allocation status of Allocatables, creating new storage if @@ -843,7 +843,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { auto empty = fir::factory::createUnallocatedBox( *builder, loc, new_box->getBoxTy(), new_box->nonDeferredLenParams(), {}); - builder->create<fir::StoreOp>(loc, empty, new_box->getAddr()); + fir::StoreOp::create(*builder, loc, empty, new_box->getAddr()); }); if_builder.end(); }, @@ -1322,8 +1322,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { if (isPointer) { // Set LHS target to the target of RHS (do not copy the RHS // target data into the LHS target storage). - auto loadVal = builder->create<fir::LoadOp>(loc, rhs); - builder->create<fir::StoreOp>(loc, loadVal, lhs); + auto loadVal = fir::LoadOp::create(*builder, loc, rhs); + fir::StoreOp::create(*builder, loc, loadVal, lhs); } else if (isAllocatable && flags.test(Fortran::semantics::Symbol::Flag::OmpCopyIn)) { // For copyin allocatable variables, RHS must be copied to lhs @@ -1377,8 +1377,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { } else if (lhs.getBoxOf<fir::CharBoxValue>()) { fir::factory::CharacterExprHelper{*builder, loc}.createAssign(lhs, rhs); } else { - auto loadVal = builder->create<fir::LoadOp>(loc, fir::getBase(rhs)); - builder->create<fir::StoreOp>(loc, loadVal, fir::getBase(lhs)); + auto loadVal = fir::LoadOp::create(*builder, loc, fir::getBase(rhs)); + fir::StoreOp::create(*builder, loc, loadVal, fir::getBase(lhs)); } } @@ -1629,7 +1629,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { blockList.push_back(defaultBlock); if (valueList[branchCount - 1] == 0) // Swap IO ERR and default blocks. std::swap(blockList[branchCount - 1], blockList[branchCount]); - builder->create<fir::SelectOp>(loc, selector, valueList, blockList); + fir::SelectOp::create(*builder, loc, selector, valueList, blockList); return; } mlir::Type selectorType = selector.getType(); @@ -1738,13 +1738,13 @@ class FirConverter : public Fortran::lower::AbstractConverter { mlir::Value resultVal = resultSymBox.match( [&](const fir::CharBoxValue &x) -> mlir::Value { if (Fortran::semantics::IsBindCProcedure(functionSymbol)) - return builder->create<fir::LoadOp>(loc, x.getBuffer()); + return fir::LoadOp::create(*builder, loc, x.getBuffer()); return fir::factory::CharacterExprHelper{*builder, loc} .createEmboxChar(x.getBuffer(), x.getLen()); }, [&](const fir::MutableBoxValue &x) -> mlir::Value { mlir::Value resultRef = resultSymBox.getAddr(); - mlir::Value load = builder->create<fir::LoadOp>(loc, resultRef); + mlir::Value load = fir::LoadOp::create(*builder, loc, resultRef); unsigned rank = x.rank(); if (x.isAllocatable() && rank > 0) { // ALLOCATABLE array result must have default lower bounds. @@ -1760,9 +1760,9 @@ class FirConverter : public Fortran::lower::AbstractConverter { llvm::SmallVector<mlir::Value> lbounds{rank, one}; auto shiftTy = fir::ShiftType::get(builder->getContext(), rank); mlir::Value shiftOp = - builder->create<fir::ShiftOp>(loc, shiftTy, lbounds); - load = builder->create<fir::ReboxOp>( - loc, load.getType(), load, shiftOp, /*slice=*/mlir::Value{}); + fir::ShiftOp::create(*builder, loc, shiftTy, lbounds); + load = fir::ReboxOp::create(*builder, loc, load.getType(), load, + shiftOp, /*slice=*/mlir::Value{}); } return load; }, @@ -1776,7 +1776,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { if (resultRef.getType() != resultRefType) resultRef = builder->createConvertWithVolatileCast( loc, resultRefType, resultRef); - return builder->create<fir::LoadOp>(loc, resultRef); + return fir::LoadOp::create(*builder, loc, resultRef); }); genExitRoutine(false, resultVal); } @@ -1802,8 +1802,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { if (Fortran::semantics::IsFunction(symbol)) { genReturnSymbol(symbol); } else if (Fortran::semantics::HasAlternateReturns(symbol)) { - mlir::Value retval = builder->create<fir::LoadOp>( - toLocation(), getAltReturnResult(symbol)); + mlir::Value retval = fir::LoadOp::create(*builder, toLocation(), + getAltReturnResult(symbol)); genExitRoutine(false, retval); } else { genExitRoutine(false); @@ -1956,7 +1956,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { } if (!labelList.empty()) { auto selectExpr = - builder->create<fir::LoadOp>(loc, getSymbolAddress(symbol)); + fir::LoadOp::create(*builder, loc, getSymbolAddress(symbol)); // Add a default error target in case the goto is nonconforming. mlir::Block *errorBlock = builder->getBlock()->splitBlock(builder->getInsertionPoint()); @@ -1968,7 +1968,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { *builder, loc, "Assigned GOTO variable '" + symbol.name().ToString() + "' does not have a valid target label value"); - builder->create<fir::UnreachableOp>(loc); + fir::UnreachableOp::create(*builder, loc); } fir::ReduceOperationEnum @@ -2485,7 +2485,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { if (!isConst) { mlir::Value stepValue = nestSts.back(); info.stepVariable = builder->createTemporary(loc, stepValue.getType()); - builder->create<fir::StoreOp>(loc, stepValue, info.stepVariable); + fir::StoreOp::create(*builder, loc, stepValue, info.stepVariable); } } @@ -2498,8 +2498,9 @@ class FirConverter : public Fortran::lower::AbstractConverter { // The loop variable is a doLoop op argument. mlir::Type loopVarType = info.getLoopVariableType(); - auto loopOp = builder->create<fir::DoLoopOp>( - loc, lowerValue, upperValue, stepValue, /*unordered=*/false, + auto loopOp = fir::DoLoopOp::create( + *builder, loc, lowerValue, upperValue, stepValue, + /*unordered=*/false, /*finalCountValue=*/true, builder->createConvert(loc, loopVarType, lowerValue)); info.loopOp = loopOp; @@ -2507,7 +2508,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { mlir::Value loopValue = loopOp.getRegionIterArgs()[0]; // Update the loop variable value in case it has non-index references. - builder->create<fir::StoreOp>(loc, loopValue, info.loopVariable); + fir::StoreOp::create(*builder, loc, loopValue, info.loopVariable); addLoopAnnotationAttr(info, dirs); continue; } @@ -2539,13 +2540,13 @@ class FirConverter : public Fortran::lower::AbstractConverter { builder->create<mlir::arith::SelectOp>(loc, cond, one, tripCount); } info.tripVariable = builder->createTemporary(loc, tripCount.getType()); - builder->create<fir::StoreOp>(loc, tripCount, info.tripVariable); - builder->create<fir::StoreOp>(loc, lowerValue, info.loopVariable); + fir::StoreOp::create(*builder, loc, tripCount, info.tripVariable); + fir::StoreOp::create(*builder, loc, lowerValue, info.loopVariable); // Unstructured loop header - generate loop condition and mask. // Note - Currently there is no way to tag a loop as a concurrent loop. startBlock(info.headerBlock); - tripCount = builder->create<fir::LoadOp>(loc, info.tripVariable); + tripCount = fir::LoadOp::create(*builder, loc, info.tripVariable); mlir::Value zero = builder->createIntegerConstant(loc, tripCount.getType(), 0); auto cond = builder->create<mlir::arith::CmpIOp>( @@ -2573,7 +2574,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { } if (genDoConcurrent) { - auto loopWrapperOp = builder->create<fir::DoConcurrentOp>(loc); + auto loopWrapperOp = fir::DoConcurrentOp::create(*builder, loc); builder->setInsertionPointToStart( builder->createBlock(&loopWrapperOp.getRegion())); @@ -2583,8 +2584,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { } builder->setInsertionPointToEnd(loopWrapperOp.getBody()); - auto loopOp = builder->create<fir::DoConcurrentLoopOp>( - loc, nestLBs, nestUBs, nestSts, /*loopAnnotation=*/nullptr, + auto loopOp = fir::DoConcurrentLoopOp::create( + *builder, loc, nestLBs, nestUBs, nestSts, /*loopAnnotation=*/nullptr, /*local_vars=*/mlir::ValueRange{}, /*local_syms=*/nullptr, /*reduce_vars=*/mlir::ValueRange{}, /*reduce_byref=*/nullptr, /*reduce_syms=*/nullptr, @@ -2604,7 +2605,7 @@ class FirConverter : public Fortran::lower::AbstractConverter { info.loopOp = loopOp; mlir::Value loopValue = builder->createConvert(loc, info.getLoopVariableType(), blockArg); - builder->create<fir::StoreOp>(loc, loopValue, info.loopVariable); + fir::StoreOp::create(*builder, loc, loopValue, info.loopVariable); if (info.maskExpr) { Fortran::lower::StatementContext stmtCtx; @@ -2612,8 +2613,8 @@ class FirConverter : public Fortran::lower::AbstractConverter { stmtCtx.finalizeAndReset(); mlir::Value maskCondCast = builder->createConvert(loc, builder->getI1Type(), maskCond); - auto ifOp = builder->create<fir::IfOp>(loc, maskCondCast, - /*withElseRegion=*/false); + auto ifOp = fir::IfOp::create(*builder, loc, maskCondCast, + /*withElseRegion=*/false); builder->setInsertionPointToStart(&ifOp.getThenRegion().front()); } } @@ -2659,35 +2660,35 @@ class FirConverter : public Fortran::lower::AbstractConverter { mlir::Value step = builder->createConvert( loc, info.getLoopVariableType(), doLoopOp.getStep()); mlir::Value loopVar = - builder->create<fir::LoadOp>(loc, info.loopVariable); + fir::LoadOp::create(*builder, loc, info.loopVariable); results.push_back( builder->create<mlir::arith::AddIOp>(loc, loopVar, step, iofAttr)); - builder->create<fir::ResultOp>(loc, results); + fir::ResultOp::create(*builder, loc, results); builder->setInsertionPointAfter(doLoopOp); // The loop control variable may be used after the loop. - builder->create<fir::StoreOp>(loc, doLoopOp.getResult(1), - info.loopVariable); + fir::StoreOp::create(*builder, loc, doLoopOp.getResult(1), + info.loopVariable); continue; } // Unstructured loop - decrement tripVariable and step loopVariable. ... [truncated] 
@clementval clementval merged commit 3b23fdb into llvm:main Aug 5, 2025
13 checks passed
@clementval clementval deleted the fir_create_lib branch August 5, 2025 00:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:codegen flang:fir-hlfir flang Flang issues not falling into any other category

4 participants