Skip to content

[mlir][NFC] update flang/lib create APIs (12/n) #149914

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions flang/lib/Frontend/FrontendActions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,9 @@ static void addDependentLibs(mlir::ModuleOp mlirModule, CompilerInstance &ci) {
// Add linker options specified by --dependent-lib
auto builder = mlir::OpBuilder(mlirModule.getRegion());
for (const std::string &lib : libs) {
builder.create<mlir::LLVM::LinkerOptionsOp>(
mlirModule.getLoc(), builder.getStrArrayAttr({"/DEFAULTLIB:" + lib}));
mlir::LLVM::LinkerOptionsOp::create(
builder, mlirModule.getLoc(),
builder.getStrArrayAttr({"/DEFAULTLIB:" + lib}));
}
}

Expand Down
14 changes: 7 additions & 7 deletions flang/lib/Optimizer/CodeGen/BoxedProcedure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,8 @@ class BoxprocTypeRewriter : public mlir::TypeConverter {
mlir::ValueRange inputs,
mlir::Location loc) {
assert(inputs.size() == 1);
return builder.create<ConvertOp>(loc, unwrapRefType(type.getEleTy()),
inputs[0]);
return ConvertOp::create(builder, loc, unwrapRefType(type.getEleTy()),
inputs[0]);
}

void setLocation(mlir::Location location) { loc = location; }
Expand Down Expand Up @@ -282,17 +282,17 @@ class BoxedProcedurePass
// 32 bytes.
fir::SequenceType::Extent thunkSize = triple.getTrampolineSize();
mlir::Type buffTy = SequenceType::get({thunkSize}, i8Ty);
auto buffer = builder.create<AllocaOp>(loc, buffTy);
auto buffer = AllocaOp::create(builder, loc, buffTy);
mlir::Value closure =
builder.createConvert(loc, i8Ptr, embox.getHost());
mlir::Value tramp = builder.createConvert(loc, i8Ptr, buffer);
mlir::Value func =
builder.createConvert(loc, i8Ptr, embox.getFunc());
builder.create<fir::CallOp>(
loc, factory::getLlvmInitTrampoline(builder),
fir::CallOp::create(
builder, loc, factory::getLlvmInitTrampoline(builder),
llvm::ArrayRef<mlir::Value>{tramp, func, closure});
auto adjustCall = builder.create<fir::CallOp>(
loc, factory::getLlvmAdjustTrampoline(builder),
auto adjustCall = fir::CallOp::create(
builder, loc, factory::getLlvmAdjustTrampoline(builder),
llvm::ArrayRef<mlir::Value>{tramp});
rewriter.replaceOpWithNewOp<ConvertOp>(embox, toTy,
adjustCall.getResult(0));
Expand Down
477 changes: 249 additions & 228 deletions flang/lib/Optimizer/CodeGen/CodeGen.cpp

Large diffs are not rendered by default.

50 changes: 26 additions & 24 deletions flang/lib/Optimizer/CodeGen/FIROpPatterns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,15 @@ mlir::LLVM::ConstantOp ConvertFIRToLLVMPattern::genI32Constant(
int value) const {
mlir::Type i32Ty = rewriter.getI32Type();
mlir::IntegerAttr attr = rewriter.getI32IntegerAttr(value);
return rewriter.create<mlir::LLVM::ConstantOp>(loc, i32Ty, attr);
return mlir::LLVM::ConstantOp::create(rewriter, loc, i32Ty, attr);
}

mlir::LLVM::ConstantOp ConvertFIRToLLVMPattern::genConstantOffset(
mlir::Location loc, mlir::ConversionPatternRewriter &rewriter,
int offset) const {
mlir::Type ity = lowerTy().offsetType();
mlir::IntegerAttr cattr = rewriter.getI32IntegerAttr(offset);
return rewriter.create<mlir::LLVM::ConstantOp>(loc, ity, cattr);
return mlir::LLVM::ConstantOp::create(rewriter, loc, ity, cattr);
}

/// Perform an extension or truncation as needed on an integer value. Lowering
Expand All @@ -80,9 +80,9 @@ mlir::Value ConvertFIRToLLVMPattern::integerCast(
return rewriter.createOrFold<mlir::LLVM::SExtOp>(loc, ty, val);
} else {
if (toSize < fromSize)
return rewriter.create<mlir::LLVM::TruncOp>(loc, ty, val);
return mlir::LLVM::TruncOp::create(rewriter, loc, ty, val);
if (toSize > fromSize)
return rewriter.create<mlir::LLVM::SExtOp>(loc, ty, val);
return mlir::LLVM::SExtOp::create(rewriter, loc, ty, val);
}
return val;
}
Expand All @@ -100,16 +100,16 @@ mlir::Value ConvertFIRToLLVMPattern::getValueFromBox(
mlir::ConversionPatternRewriter &rewriter, int boxValue) const {
if (mlir::isa<mlir::LLVM::LLVMPointerType>(box.getType())) {
auto pty = getLlvmPtrType(resultTy.getContext());
auto p = rewriter.create<mlir::LLVM::GEPOp>(
loc, pty, boxTy.llvm, box,
auto p = mlir::LLVM::GEPOp::create(
rewriter, loc, pty, boxTy.llvm, box,
llvm::ArrayRef<mlir::LLVM::GEPArg>{0, boxValue});
auto fldTy = getBoxEleTy(boxTy.llvm, {boxValue});
auto loadOp = rewriter.create<mlir::LLVM::LoadOp>(loc, fldTy, p);
auto loadOp = mlir::LLVM::LoadOp::create(rewriter, loc, fldTy, p);
auto castOp = integerCast(loc, rewriter, resultTy, loadOp);
attachTBAATag(loadOp, boxTy.fir, nullptr, p);
return castOp;
}
return rewriter.create<mlir::LLVM::ExtractValueOp>(loc, box, boxValue);
return mlir::LLVM::ExtractValueOp::create(rewriter, loc, box, boxValue);
}

/// Method to construct code sequence to get the triple for dimension `dim`
Expand Down Expand Up @@ -147,7 +147,7 @@ mlir::Value ConvertFIRToLLVMPattern::loadDimFieldFromBox(
"in memory");
mlir::LLVM::GEPOp p = genGEP(loc, boxTy.llvm, rewriter, box, 0,
static_cast<int>(kDimsPosInBox), dim, off);
auto loadOp = rewriter.create<mlir::LLVM::LoadOp>(loc, ty, p);
auto loadOp = mlir::LLVM::LoadOp::create(rewriter, loc, ty, p);
attachTBAATag(loadOp, boxTy.fir, nullptr, p);
return loadOp;
}
Expand All @@ -158,12 +158,13 @@ mlir::Value ConvertFIRToLLVMPattern::getDimFieldFromBox(
if (mlir::isa<mlir::LLVM::LLVMPointerType>(box.getType())) {
mlir::LLVM::GEPOp p = genGEP(loc, boxTy.llvm, rewriter, box, 0,
static_cast<int>(kDimsPosInBox), dim, off);
auto loadOp = rewriter.create<mlir::LLVM::LoadOp>(loc, ty, p);
auto loadOp = mlir::LLVM::LoadOp::create(rewriter, loc, ty, p);
attachTBAATag(loadOp, boxTy.fir, nullptr, p);
return loadOp;
}
return rewriter.create<mlir::LLVM::ExtractValueOp>(
loc, box, llvm::ArrayRef<std::int64_t>{kDimsPosInBox, dim, off});
return mlir::LLVM::ExtractValueOp::create(
rewriter, loc, box,
llvm::ArrayRef<std::int64_t>{kDimsPosInBox, dim, off});
}

mlir::Value ConvertFIRToLLVMPattern::getStrideFromBox(
Expand Down Expand Up @@ -251,10 +252,10 @@ mlir::Value ConvertFIRToLLVMPattern::genBoxAttributeCheck(
getValueFromBox(loc, boxTy, box, attrTy, rewriter, kAttributePosInBox);
mlir::LLVM::ConstantOp attrMask = genConstantOffset(loc, rewriter, maskValue);
auto maskRes =
rewriter.create<mlir::LLVM::AndOp>(loc, attrTy, attribute, attrMask);
mlir::LLVM::AndOp::create(rewriter, loc, attrTy, attribute, attrMask);
mlir::LLVM::ConstantOp c0 = genConstantOffset(loc, rewriter, 0);
return rewriter.create<mlir::LLVM::ICmpOp>(loc, mlir::LLVM::ICmpPredicate::ne,
maskRes, c0);
return mlir::LLVM::ICmpOp::create(rewriter, loc,
mlir::LLVM::ICmpPredicate::ne, maskRes, c0);
}

mlir::Value ConvertFIRToLLVMPattern::computeBoxSize(
Expand All @@ -281,10 +282,10 @@ mlir::Value ConvertFIRToLLVMPattern::computeBoxSize(
firBoxType.getBoxTypeWithNewShape(1)))) &&
"descriptor layout requires adding padding for dim field");
mlir::Value sizePerDim = genConstantOffset(loc, rewriter, sizePerDimCst);
mlir::Value dimsSize = rewriter.create<mlir::LLVM::MulOp>(
loc, sizePerDim.getType(), sizePerDim, rank);
mlir::Value size = rewriter.create<mlir::LLVM::AddOp>(
loc, scalarBoxSize.getType(), scalarBoxSize, dimsSize);
mlir::Value dimsSize = mlir::LLVM::MulOp::create(
rewriter, loc, sizePerDim.getType(), sizePerDim, rank);
mlir::Value size = mlir::LLVM::AddOp::create(
rewriter, loc, scalarBoxSize.getType(), scalarBoxSize, dimsSize);
return size;
}

Expand Down Expand Up @@ -324,18 +325,19 @@ mlir::Value ConvertFIRToLLVMPattern::genAllocaAndAddrCastWithType(
unsigned allocaAs = getAllocaAddressSpace(rewriter);
unsigned programAs = getProgramAddressSpace(rewriter);

mlir::Value al = rewriter.create<mlir::LLVM::AllocaOp>(
loc, ::getLlvmPtrType(llvmObjectTy.getContext(), allocaAs), llvmObjectTy,
size, alignment);
mlir::Value al = mlir::LLVM::AllocaOp::create(
rewriter, loc, ::getLlvmPtrType(llvmObjectTy.getContext(), allocaAs),
llvmObjectTy, size, alignment);

// if our allocation address space, is not the same as the program address
// space, then we must emit a cast to the program address space before use.
// An example case would be on AMDGPU, where the allocation address space is
// the numeric value 5 (private), and the program address space is 0
// (generic).
if (allocaAs != programAs) {
al = rewriter.create<mlir::LLVM::AddrSpaceCastOp>(
loc, ::getLlvmPtrType(llvmObjectTy.getContext(), programAs), al);
al = mlir::LLVM::AddrSpaceCastOp::create(
rewriter, loc, ::getLlvmPtrType(llvmObjectTy.getContext(), programAs),
al);
}

rewriter.restoreInsertionPoint(thisPt);
Expand Down
39 changes: 20 additions & 19 deletions flang/lib/Optimizer/CodeGen/LowerRepackArrays.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,20 +152,20 @@ PackArrayConversion::matchAndRewrite(fir::PackArrayOp op,

// For now we have to always check if the box is present.
auto isPresent =
builder.create<fir::IsPresentOp>(loc, builder.getI1Type(), box);
fir::IsPresentOp::create(builder, loc, builder.getI1Type(), box);

fir::IfOp ifOp = builder.create<fir::IfOp>(loc, boxType, isPresent,
/*withElseRegion=*/true);
fir::IfOp ifOp = fir::IfOp::create(builder, loc, boxType, isPresent,
/*withElseRegion=*/true);
builder.setInsertionPointToStart(&ifOp.getThenRegion().front());
// The box is present.
auto newBox = genRepackedBox(builder, loc, op);
if (mlir::failed(newBox))
return newBox;
builder.create<fir::ResultOp>(loc, *newBox);
fir::ResultOp::create(builder, loc, *newBox);

// The box is not present. Return original box.
builder.setInsertionPointToStart(&ifOp.getElseRegion().front());
builder.create<fir::ResultOp>(loc, box);
fir::ResultOp::create(builder, loc, box);

rewriter.replaceOp(op, ifOp.getResult(0));
return mlir::success();
Expand Down Expand Up @@ -199,8 +199,8 @@ mlir::Value PackArrayConversion::allocateTempBuffer(
// We need to reset the CFI_attribute_allocatable before
// returning the temporary box to avoid any mishandling
// of the temporary box in Fortran runtime.
base = builder.create<fir::BoxAddrOp>(loc, fir::boxMemRefType(tempBoxType),
base);
base = fir::BoxAddrOp::create(builder, loc, fir::boxMemRefType(tempBoxType),
base);
ptrType = base.getType();
}

Expand Down Expand Up @@ -262,23 +262,24 @@ PackArrayConversion::genRepackedBox(fir::FirOpBuilder &builder,
}

// Create a temporay iff the original is not contigous and is not empty.
auto isNotContiguous = builder.genNot(
loc, builder.create<fir::IsContiguousBoxOp>(loc, box, op.getInnermost()));
auto isNotContiguous =
builder.genNot(loc, fir::IsContiguousBoxOp::create(builder, loc, box,
op.getInnermost()));
auto dataAddr =
builder.create<fir::BoxAddrOp>(loc, fir::boxMemRefType(boxType), box);
fir::BoxAddrOp::create(builder, loc, fir::boxMemRefType(boxType), box);
auto isNotEmpty =
builder.create<fir::IsPresentOp>(loc, builder.getI1Type(), dataAddr);
fir::IsPresentOp::create(builder, loc, builder.getI1Type(), dataAddr);
auto doPack =
builder.create<mlir::arith::AndIOp>(loc, isNotContiguous, isNotEmpty);
mlir::arith::AndIOp::create(builder, loc, isNotContiguous, isNotEmpty);

fir::IfOp ifOp =
builder.create<fir::IfOp>(loc, boxType, doPack, /*withElseRegion=*/true);
fir::IfOp::create(builder, loc, boxType, doPack, /*withElseRegion=*/true);
// Assume that the repacking is unlikely.
ifOp.setUnlikelyIfWeights();

// Return original box.
builder.setInsertionPointToStart(&ifOp.getElseRegion().front());
builder.create<fir::ResultOp>(loc, box);
fir::ResultOp::create(builder, loc, box);

// Create a new box.
builder.setInsertionPointToStart(&ifOp.getThenRegion().front());
Expand Down Expand Up @@ -308,7 +309,7 @@ PackArrayConversion::genRepackedBox(fir::FirOpBuilder &builder,
if (!op.getNoCopy())
fir::runtime::genShallowCopy(builder, loc, tempBox, box,
/*resultIsAllocated=*/true);
builder.create<fir::ResultOp>(loc, tempBox);
fir::ResultOp::create(builder, loc, tempBox);

return ifOp.getResult(0);
}
Expand All @@ -330,15 +331,15 @@ UnpackArrayConversion::matchAndRewrite(fir::UnpackArrayOp op,

// For now we have to always check if the box is present.
auto isPresent =
builder.create<fir::IsPresentOp>(loc, predicateType, originalBox);
fir::IsPresentOp::create(builder, loc, predicateType, originalBox);

builder.genIfThen(loc, isPresent).genThen([&]() {
mlir::Type addrType =
fir::HeapType::get(fir::extractSequenceType(tempBox.getType()));
mlir::Value tempAddr =
builder.create<fir::BoxAddrOp>(loc, addrType, tempBox);
fir::BoxAddrOp::create(builder, loc, addrType, tempBox);
mlir::Value originalAddr =
builder.create<fir::BoxAddrOp>(loc, addrType, originalBox);
fir::BoxAddrOp::create(builder, loc, addrType, originalBox);

auto isNotSame = builder.genPtrCompare(loc, mlir::arith::CmpIPredicate::ne,
tempAddr, originalAddr);
Expand All @@ -356,7 +357,7 @@ UnpackArrayConversion::matchAndRewrite(fir::UnpackArrayOp op,
// to the runtime that uses heap memory, even when the stack
// attribute is set on fir.pack_array.
if (!op.getStack() || !canAllocateTempOnStack(originalBox))
builder.create<fir::FreeMemOp>(loc, tempAddr);
fir::FreeMemOp::create(builder, loc, tempAddr);
})
.getIfOp()
.setUnlikelyIfWeights();
Expand Down
34 changes: 18 additions & 16 deletions flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,13 +103,14 @@ class EmboxConversion : public mlir::OpRewritePattern<fir::EmboxOp> {
auto idxTy = rewriter.getIndexType();
for (auto ext : seqTy.getShape()) {
auto iAttr = rewriter.getIndexAttr(ext);
auto extVal = rewriter.create<mlir::arith::ConstantOp>(loc, idxTy, iAttr);
auto extVal =
mlir::arith::ConstantOp::create(rewriter, loc, idxTy, iAttr);
shapeOpers.push_back(extVal);
}
auto xbox = rewriter.create<fir::cg::XEmboxOp>(
loc, embox.getType(), embox.getMemref(), shapeOpers, mlir::ValueRange{},
auto xbox = fir::cg::XEmboxOp::create(
rewriter, loc, embox.getType(), embox.getMemref(), shapeOpers,
mlir::ValueRange{}, mlir::ValueRange{}, mlir::ValueRange{},
embox.getTypeparams(), embox.getSourceBox(),
mlir::ValueRange{}, embox.getTypeparams(), embox.getSourceBox(),
embox.getAllocatorIdxAttr());
LLVM_DEBUG(llvm::dbgs() << "rewriting " << embox << " to " << xbox << '\n');
rewriter.replaceOp(embox, xbox.getOperation()->getResults());
Expand Down Expand Up @@ -143,10 +144,11 @@ class EmboxConversion : public mlir::OpRewritePattern<fir::EmboxOp> {
substrOpers.assign(sliceOp.getSubstr().begin(),
sliceOp.getSubstr().end());
}
auto xbox = rewriter.create<fir::cg::XEmboxOp>(
loc, embox.getType(), embox.getMemref(), shapeOpers, shiftOpers,
sliceOpers, subcompOpers, substrOpers, embox.getTypeparams(),
embox.getSourceBox(), embox.getAllocatorIdxAttr());
auto xbox = fir::cg::XEmboxOp::create(
rewriter, loc, embox.getType(), embox.getMemref(), shapeOpers,
shiftOpers, sliceOpers, subcompOpers, substrOpers,
embox.getTypeparams(), embox.getSourceBox(),
embox.getAllocatorIdxAttr());
LLVM_DEBUG(llvm::dbgs() << "rewriting " << embox << " to " << xbox << '\n');
rewriter.replaceOp(embox, xbox.getOperation()->getResults());
return mlir::success();
Expand Down Expand Up @@ -201,8 +203,8 @@ class ReboxConversion : public mlir::OpRewritePattern<fir::ReboxOp> {
sliceOp.getSubstr().end());
}

auto xRebox = rewriter.create<fir::cg::XReboxOp>(
loc, rebox.getType(), rebox.getBox(), shapeOpers, shiftOpers,
auto xRebox = fir::cg::XReboxOp::create(
rewriter, loc, rebox.getType(), rebox.getBox(), shapeOpers, shiftOpers,
sliceOpers, subcompOpers, substrOpers);
LLVM_DEBUG(llvm::dbgs()
<< "rewriting " << rebox << " to " << xRebox << '\n');
Expand Down Expand Up @@ -259,9 +261,9 @@ class ArrayCoorConversion : public mlir::OpRewritePattern<fir::ArrayCoorOp> {
"Don't allow substring operations on array_coor. This "
"restriction may be lifted in the future.");
}
auto xArrCoor = rewriter.create<fir::cg::XArrayCoorOp>(
loc, arrCoor.getType(), arrCoor.getMemref(), shapeOpers, shiftOpers,
sliceOpers, subcompOpers, arrCoor.getIndices(),
auto xArrCoor = fir::cg::XArrayCoorOp::create(
rewriter, loc, arrCoor.getType(), arrCoor.getMemref(), shapeOpers,
shiftOpers, sliceOpers, subcompOpers, arrCoor.getIndices(),
arrCoor.getTypeparams());
LLVM_DEBUG(llvm::dbgs()
<< "rewriting " << arrCoor << " to " << xArrCoor << '\n');
Expand Down Expand Up @@ -301,9 +303,9 @@ class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {
return mlir::failure();
}
// FIXME: Add FortranAttrs and CudaAttrs
auto xDeclOp = rewriter.create<fir::cg::XDeclareOp>(
loc, declareOp.getType(), declareOp.getMemref(), shapeOpers, shiftOpers,
declareOp.getTypeparams(), declareOp.getDummyScope(),
auto xDeclOp = fir::cg::XDeclareOp::create(
rewriter, loc, declareOp.getType(), declareOp.getMemref(), shapeOpers,
shiftOpers, declareOp.getTypeparams(), declareOp.getDummyScope(),
declareOp.getUniqName());
LLVM_DEBUG(llvm::dbgs()
<< "rewriting " << declareOp << " to " << xDeclOp << '\n');
Expand Down
2 changes: 1 addition & 1 deletion flang/lib/Optimizer/Dialect/FIRDialect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ struct FIRInlinerInterface : public mlir::DialectInlinerInterface {
mlir::Value input,
mlir::Type resultType,
mlir::Location loc) const final {
return builder.create<fir::ConvertOp>(loc, resultType, input);
return fir::ConvertOp::create(builder, loc, resultType, input);
}
};
} // namespace
Expand Down
Loading