diff --git a/flang/include/flang/Optimizer/Dialect/FIRType.h b/flang/include/flang/Optimizer/Dialect/FIRType.h --- a/flang/include/flang/Optimizer/Dialect/FIRType.h +++ b/flang/include/flang/Optimizer/Dialect/FIRType.h @@ -57,15 +57,22 @@ bool isa_fir_or_std_type(mlir::Type t); /// Is `t` a FIR dialect type that implies a memory (de)reference? -bool isa_ref_type(mlir::Type t); +inline bool isa_ref_type(mlir::Type t) { + return t.isa() || t.isa() || t.isa(); +} + +/// Is `t` a boxed type? +inline bool isa_box_type(mlir::Type t) { + return t.isa() || t.isa() || t.isa(); +} /// Is `t` a type that is always trivially pass-by-reference? Specifically, this /// is testing if `t` is a ReferenceType or any box type. Compare this to /// conformsWithPassByRef(), which includes pointers and allocatables. -bool isa_passbyref_type(mlir::Type t); - -/// Is `t` a boxed type? -bool isa_box_type(mlir::Type t); +inline bool isa_passbyref_type(mlir::Type t) { + return t.isa() || isa_box_type(t) || + t.isa(); +} /// Is `t` a type that can conform to be pass-by-reference? Depending on the /// context, these types may simply demote to pass-by-reference or a reference @@ -74,8 +81,14 @@ return isa_ref_type(t) || isa_box_type(t); } +/// Is `t` a derived (record) type? +inline bool isa_derived(mlir::Type t) { return t.isa(); } + /// Is `t` a FIR dialect aggregate type? -bool isa_aggregate(mlir::Type t); +inline bool isa_aggregate(mlir::Type t) { + return t.isa() || fir::isa_derived(t) || + t.isa(); +} /// Extract the `Type` pointed to from a FIR memory reference type. If `t` is /// not a memory reference type, then returns a null `Type`. @@ -109,13 +122,14 @@ return t.isa() || t.isa(); } +/// Is `t` a CHARACTER type with a LEN other than 1? inline bool isa_char_string(mlir::Type t) { if (auto ct = t.dyn_cast_or_null()) return ct.getLen() != fir::CharacterType::singleton(); return false; } -/// Is `t` a box type for which it is not possible to deduce the box size. +/// Is `t` a box type for which it is not possible to deduce the box size? /// It is not possible to deduce the size of a box that describes an entity /// of unknown rank or type. bool isa_unknown_size_box(mlir::Type t); diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp --- a/flang/lib/Optimizer/Dialect/FIRType.cpp +++ b/flang/lib/Optimizer/Dialect/FIRType.cpp @@ -199,24 +199,6 @@ return isa_fir_type(t) || isa_std_type(t); } -bool isa_ref_type(mlir::Type t) { - return t.isa() || t.isa() || t.isa(); -} - -bool isa_box_type(mlir::Type t) { - return t.isa() || t.isa() || t.isa(); -} - -bool isa_passbyref_type(mlir::Type t) { - return t.isa() || isa_box_type(t) || - t.isa(); -} - -bool isa_aggregate(mlir::Type t) { - return t.isa() || t.isa() || - t.isa(); -} - mlir::Type dyn_cast_ptrEleTy(mlir::Type t) { return llvm::TypeSwitch(t) .Case(