[flang-commits] [flang] [flang] Added fir.create_box operation. (PR #210220)
via flang-commits
flang-commits at lists.llvm.org
Fri Jul 17 03:19:09 PDT 2026
================
@@ -2821,6 +2821,68 @@ mlir::Speculation::Speculatability fir::EmboxOp::getSpeculatability() {
: mlir::Speculation::Speculatable;
}
+//===----------------------------------------------------------------------===//
+// CreateBoxOp
+//===----------------------------------------------------------------------===//
+
+unsigned fir::CreateBoxOp::getRank() {
+ auto boxTy = mlir::cast<fir::BaseBoxType>(getResult().getType());
+ if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(
+ fir::unwrapRefType(boxTy.getEleTy())))
+ return seqTy.getDimension();
+ return 0;
+}
+
+llvm::LogicalResult fir::CreateBoxOp::verify() {
+ auto memEleTy = fir::dyn_cast_ptrEleTy(getMemref().getType());
+ auto seqTy = mlir::dyn_cast_or_null<fir::SequenceType>(memEleTy);
+ if (!seqTy)
+ return emitOpError("memref must be a reference to an array");
+
+ auto boxTy = mlir::cast<fir::BaseBoxType>(getResult().getType());
+ auto boxSeqTy =
+ mlir::dyn_cast<fir::SequenceType>(fir::unwrapRefType(boxTy.getEleTy()));
+ if (!boxSeqTy)
+ return emitOpError("result box must describe an array");
+
+ // The result box must preserve the memref's storage kind so that the
+ // descriptor's CFI attribute field is set correctly and the value matches a
+ // box loaded from the corresponding !fir.ref<!fir.box<...>>:
+ // !fir.heap<...> -> !fir.box<!fir.heap<...>> (allocatable)
+ // !fir.ptr<...> -> !fir.box<!fir.ptr<...>> (pointer)
+ // !fir.ref<...> -> !fir.box<...> (plain)
+ mlir::Type memrefTy = getMemref().getType();
+ mlir::Type boxEleTy = boxTy.getEleTy();
+ if (mlir::isa<fir::HeapType>(memrefTy) !=
+ mlir::isa<fir::HeapType>(boxEleTy) ||
+ mlir::isa<fir::PointerType>(memrefTy) !=
+ mlir::isa<fir::PointerType>(boxEleTy))
+ return emitOpError(
+ "result box element storage kind must match the memref storage kind");
----------------
jeanPerier wrote:
Maybe it is worth also calling `verifyEmboxOpVolatilityInvariants` here to enforce volatile aspects are not dropped.
https://github.com/llvm/llvm-project/pull/210220
More information about the flang-commits
mailing list