@@ -333,6 +333,25 @@ static void printDesignatorComplexPart(mlir::OpAsmPrinter &p,
333
333
p << " real" ;
334
334
}
335
335
}
336
+ template <typename Op>
337
+ static llvm::LogicalResult verifyTypeparams (Op &op, mlir::Type elementType,
338
+ unsigned numLenParam) {
339
+ if (mlir::isa<fir::CharacterType>(elementType)) {
340
+ if (numLenParam != 1 )
341
+ return op.emitOpError (" must be provided one length parameter when the "
342
+ " result is a character" );
343
+ } else if (fir::isRecordWithTypeParameters (elementType)) {
344
+ if (numLenParam !=
345
+ mlir::cast<fir::RecordType>(elementType).getNumLenParams ())
346
+ return op.emitOpError (" must be provided the same number of length "
347
+ " parameters as in the result derived type" );
348
+ } else if (numLenParam != 0 ) {
349
+ return op.emitOpError (
350
+ " must not be provided length parameters if the result "
351
+ " type does not have length parameters" );
352
+ }
353
+ return mlir::success ();
354
+ }
336
355
337
356
llvm::LogicalResult hlfir::DesignateOp::verify () {
338
357
mlir::Type memrefType = getMemref ().getType ();
@@ -462,20 +481,10 @@ llvm::LogicalResult hlfir::DesignateOp::verify() {
462
481
return emitOpError (" shape must be a fir.shape or fir.shapeshift with "
463
482
" the rank of the result" );
464
483
}
465
- auto numLenParam = getTypeparams ().size ();
466
- if (mlir::isa<fir::CharacterType>(outputElementType)) {
467
- if (numLenParam != 1 )
468
- return emitOpError (" must be provided one length parameter when the "
469
- " result is a character" );
470
- } else if (fir::isRecordWithTypeParameters (outputElementType)) {
471
- if (numLenParam !=
472
- mlir::cast<fir::RecordType>(outputElementType).getNumLenParams ())
473
- return emitOpError (" must be provided the same number of length "
474
- " parameters as in the result derived type" );
475
- } else if (numLenParam != 0 ) {
476
- return emitOpError (" must not be provided length parameters if the result "
477
- " type does not have length parameters" );
478
- }
484
+ if (auto res =
485
+ verifyTypeparams (*this , outputElementType, getTypeparams ().size ());
486
+ failed (res))
487
+ return res;
479
488
}
480
489
return mlir::success ();
481
490
}
@@ -1989,6 +1998,45 @@ hlfir::GetLengthOp::canonicalize(GetLengthOp getLength,
1989
1998
return mlir::success ();
1990
1999
}
1991
2000
2001
+ // ===----------------------------------------------------------------------===//
2002
+ // EvaluateInMemoryOp
2003
+ // ===----------------------------------------------------------------------===//
2004
+
2005
+ void hlfir::EvaluateInMemoryOp::build (mlir::OpBuilder &builder,
2006
+ mlir::OperationState &odsState,
2007
+ mlir::Type resultType, mlir::Value shape,
2008
+ mlir::ValueRange typeparams) {
2009
+ odsState.addTypes (resultType);
2010
+ if (shape)
2011
+ odsState.addOperands (shape);
2012
+ odsState.addOperands (typeparams);
2013
+ odsState.addAttribute (
2014
+ getOperandSegmentSizeAttr (),
2015
+ builder.getDenseI32ArrayAttr (
2016
+ {shape ? 1 : 0 , static_cast <int32_t >(typeparams.size ())}));
2017
+ mlir::Region *bodyRegion = odsState.addRegion ();
2018
+ bodyRegion->push_back (new mlir::Block{});
2019
+ mlir::Type memType = fir::ReferenceType::get (
2020
+ hlfir::getFortranElementOrSequenceType (resultType));
2021
+ bodyRegion->front ().addArgument (memType, odsState.location );
2022
+ EvaluateInMemoryOp::ensureTerminator (*bodyRegion, builder, odsState.location );
2023
+ }
2024
+
2025
+ llvm::LogicalResult hlfir::EvaluateInMemoryOp::verify () {
2026
+ unsigned shapeRank = 0 ;
2027
+ if (mlir::Value shape = getShape ())
2028
+ if (auto shapeTy = mlir::dyn_cast<fir::ShapeType>(shape.getType ()))
2029
+ shapeRank = shapeTy.getRank ();
2030
+ auto exprType = mlir::cast<hlfir::ExprType>(getResult ().getType ());
2031
+ if (shapeRank != exprType.getRank ())
2032
+ return emitOpError (" `shape` rank must match the result rank" );
2033
+ mlir::Type elementType = exprType.getElementType ();
2034
+ if (auto res = verifyTypeparams (*this , elementType, getTypeparams ().size ());
2035
+ failed (res))
2036
+ return res;
2037
+ return mlir::success ();
2038
+ }
2039
+
1992
2040
#include " flang/Optimizer/HLFIR/HLFIROpInterfaces.cpp.inc"
1993
2041
#define GET_OP_CLASSES
1994
2042
#include " flang/Optimizer/HLFIR/HLFIREnums.cpp.inc"
0 commit comments