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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants