[flang-commits] [flang] 9673a00 - [flang] Remove dims type and gendims op.
Eric Schweitz via flang-commits
flang-commits at lists.llvm.org
Thu Feb 4 14:37:30 PST 2021
Author: Eric Schweitz
Date: 2021-02-04T14:37:07-08:00
New Revision: 9673a0099536e1bc99898d69c89c54087c01d1ce
URL: https://github.com/llvm/llvm-project/commit/9673a0099536e1bc99898d69c89c54087c01d1ce
DIFF: https://github.com/llvm/llvm-project/commit/9673a0099536e1bc99898d69c89c54087c01d1ce.diff
LOG: [flang] Remove dims type and gendims op.
These are no longer part of FIR.
https://github.com/flang-compiler/f18-llvm-project/pull/267
Differential Revision: https://reviews.llvm.org/D96077
Added:
Modified:
flang/include/flang/Optimizer/Dialect/FIROps.td
flang/include/flang/Optimizer/Dialect/FIRType.h
flang/lib/Optimizer/Dialect/FIRDialect.cpp
flang/lib/Optimizer/Dialect/FIRType.cpp
flang/test/Fir/fir-ops.fir
flang/test/Fir/fir-types.fir
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index 60beaf80bf85..6bfbecc7b62a 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -98,9 +98,8 @@ def AnyRefOrBox : TypeConstraint<Or<[fir_ReferenceType.predicate,
"any reference or box">;
// A vector of Fortran triple notation describing a multidimensional array
-def fir_DimsType : Type<CPred<"$_self.isa<fir::DimsType>()">, "dim type">;
def AnyEmboxLike : TypeConstraint<Or<[AnySignlessInteger.predicate,
- Index.predicate, fir_IntegerType.predicate, fir_DimsType.predicate]>,
+ Index.predicate, fir_IntegerType.predicate]>,
"any legal embox argument type">;
def AnyEmboxArg : Type<AnyEmboxLike.predicate, "embox argument type">;
@@ -1077,17 +1076,12 @@ def fir_EmboxOp : fir_Op<"embox", [NoSideEffect]> {
} else {
return emitOpError("LEN parameters require !fir.type type");
}
- for (auto lp : getLenParams())
- if (lp.getType().isa<fir::DimsType>())
- return emitOpError("LEN parameters must be integral type");
}
if (dims().size() == 0) {
// Ok. If there is no dims and no layout map, then emboxing a scalar.
// TODO: Should the type be enforced? It already must agree.
} else if (dims().size() == 1) {
auto d = *dims().begin();
- if (!d.getType().isa<fir::DimsType>())
- return emitOpError("dimension argument must have !fir.dims type");
} else {
return emitOpError("embox can only have one !fir.dim argument");
}
@@ -1263,7 +1257,7 @@ def fir_UnboxOp : fir_SimpleOp<"unbox", [NoSideEffect]> {
AnyIntegerLike, // rank of data
fir_TypeDescType, // abstract type descriptor
AnyIntegerLike, // attribute flags (bitfields)
- fir_DimsType // dimension information (if any)
+ fir_SequenceType // dimension information (if any)
);
}
@@ -1722,42 +1716,6 @@ def fir_FieldIndexOp : fir_OneResultOp<"field_index", [NoSideEffect]> {
}];
}
-def fir_GenDimsOp : fir_OneResultOp<"gendims", [NoSideEffect]> {
-
- let summary = "generate a value of type `!fir.dims`";
-
- let description = [{
- The arguments are an ordered list of integral type values that is a
- multiple of 3 in length. Each such triple is defined as: the lower
- index, the extent, and the stride for that dimension. The dimension
- information is given in the same row-to-column order as Fortran. This
- abstract dimension value must describe a reified object, so all dimension
- information must be specified. The extent must be nonnegative and the
- stride must not be zero.
-
- ```mlir
- %d = fir.gendims %lo, %ext, %str : (index, index, index) -> !fir.dims<1>
- ```
- }];
-
- let arguments = (ins Variadic<AnyIntegerType>:$triples);
-
- let results = (outs fir_DimsType);
-
- let assemblyFormat = [{
- operands attr-dict `:` functional-type(operands, results)
- }];
-
- let verifier = [{
- auto size = triples().size();
- if (size < 1 || size > 16 * 3)
- return emitOpError("incorrect number of args");
- if (size % 3 != 0)
- return emitOpError("requires a multiple of 3 args");
- return mlir::success();
- }];
-}
-
def fir_InsertValueOp : fir_OneResultOp<"insert_value", [NoSideEffect]> {
let summary = "insert a new sub-value into a copy of an existing aggregate";
diff --git a/flang/include/flang/Optimizer/Dialect/FIRType.h b/flang/include/flang/Optimizer/Dialect/FIRType.h
index 086519d846b7..c6fa318acf78 100644
--- a/flang/include/flang/Optimizer/Dialect/FIRType.h
+++ b/flang/include/flang/Optimizer/Dialect/FIRType.h
@@ -40,7 +40,6 @@ struct BoxCharTypeStorage;
struct BoxProcTypeStorage;
struct CharacterTypeStorage;
struct ComplexTypeStorage;
-struct DimsTypeStorage;
struct FieldTypeStorage;
struct HeapTypeStorage;
struct IntegerTypeStorage;
@@ -191,20 +190,6 @@ class BoxProcType : public mlir::Type::TypeBase<BoxProcType, mlir::Type,
mlir::Type eleTy);
};
-/// The type of a runtime vector that describes triples of array dimension
-/// information. A triple consists of a lower bound, upper bound, and
-/// stride. Each dimension of an array entity may have an associated triple that
-/// maps how elements of the array are accessed.
-class DimsType : public mlir::Type::TypeBase<DimsType, mlir::Type,
- detail::DimsTypeStorage> {
-public:
- using Base::Base;
- static DimsType get(mlir::MLIRContext *ctx, unsigned rank);
-
- /// returns -1 if the rank is unknown
- unsigned getRank() const;
-};
-
/// The type of a field name. Implementations may defer the layout of a Fortran
/// derived type until runtime. This implies that the runtime must be able to
/// determine the offset of fields within the entity.
diff --git a/flang/lib/Optimizer/Dialect/FIRDialect.cpp b/flang/lib/Optimizer/Dialect/FIRDialect.cpp
index 66fae2346b8d..477bb1e65ccc 100644
--- a/flang/lib/Optimizer/Dialect/FIRDialect.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRDialect.cpp
@@ -16,9 +16,9 @@ using namespace fir;
fir::FIROpsDialect::FIROpsDialect(mlir::MLIRContext *ctx)
: mlir::Dialect("fir", ctx, mlir::TypeID::get<FIROpsDialect>()) {
addTypes<BoxType, BoxCharType, BoxProcType, CharacterType, fir::ComplexType,
- DimsType, FieldType, HeapType, fir::IntegerType, LenType,
- LogicalType, PointerType, RealType, RecordType, ReferenceType,
- SequenceType, TypeDescType>();
+ FieldType, HeapType, fir::IntegerType, LenType, LogicalType,
+ PointerType, RealType, RecordType, ReferenceType, SequenceType,
+ TypeDescType>();
addAttributes<ClosedIntervalAttr, ExactTypeAttr, LowerBoundAttr,
PointIntervalAttr, RealAttr, SubclassAttr, UpperBoundAttr>();
addOperations<
diff --git a/flang/lib/Optimizer/Dialect/FIRType.cpp b/flang/lib/Optimizer/Dialect/FIRType.cpp
index 3393cb908bbf..9bdb3216c299 100644
--- a/flang/lib/Optimizer/Dialect/FIRType.cpp
+++ b/flang/lib/Optimizer/Dialect/FIRType.cpp
@@ -91,11 +91,6 @@ fir::ComplexType parseComplex(mlir::DialectAsmParser &parser) {
return parseKindSingleton<fir::ComplexType>(parser);
}
-// `dims` `<` rank `>`
-DimsType parseDims(mlir::DialectAsmParser &parser) {
- return parseRankSingleton<DimsType>(parser);
-}
-
// `field`
FieldType parseField(mlir::DialectAsmParser &parser) {
return FieldType::get(parser.getBuilder().getContext());
@@ -186,9 +181,8 @@ static bool isaIntegerType(mlir::Type ty) {
bool verifyRecordMemberType(mlir::Type ty) {
return !(ty.isa<BoxType>() || ty.isa<BoxCharType>() ||
- ty.isa<BoxProcType>() || ty.isa<DimsType>() || ty.isa<FieldType>() ||
- ty.isa<LenType>() || ty.isa<ReferenceType>() ||
- ty.isa<TypeDescType>());
+ ty.isa<BoxProcType>() || ty.isa<FieldType>() || ty.isa<LenType>() ||
+ ty.isa<ReferenceType>() || ty.isa<TypeDescType>());
}
bool verifySameLists(llvm::ArrayRef<RecordType::TypePair> a1,
@@ -325,8 +319,6 @@ mlir::Type fir::parseFirType(FIROpsDialect *, mlir::DialectAsmParser &parser) {
return parseCharacter(parser);
if (typeNameLit == "complex")
return parseComplex(parser);
- if (typeNameLit == "dims")
- return parseDims(parser);
if (typeNameLit == "field")
return parseField(parser);
if (typeNameLit == "heap")
@@ -383,29 +375,6 @@ struct CharacterTypeStorage : public mlir::TypeStorage {
explicit CharacterTypeStorage(KindTy kind) : kind{kind} {}
};
-struct DimsTypeStorage : public mlir::TypeStorage {
- using KeyTy = unsigned;
-
- static unsigned hashKey(const KeyTy &key) { return llvm::hash_combine(key); }
-
- bool operator==(const KeyTy &key) const { return key == getRank(); }
-
- static DimsTypeStorage *construct(mlir::TypeStorageAllocator &allocator,
- unsigned rank) {
- auto *storage = allocator.allocate<DimsTypeStorage>();
- return new (storage) DimsTypeStorage{rank};
- }
-
- unsigned getRank() const { return rank; }
-
-protected:
- unsigned rank;
-
-private:
- DimsTypeStorage() = delete;
- explicit DimsTypeStorage(unsigned rank) : rank{rank} {}
-};
-
/// The type of a derived type part reference
struct FieldTypeStorage : public mlir::TypeStorage {
using KeyTy = KindTy;
@@ -871,14 +840,6 @@ CharacterType fir::CharacterType::get(mlir::MLIRContext *ctxt, KindTy kind) {
int fir::CharacterType::getFKind() const { return getImpl()->getFKind(); }
-// Dims
-
-DimsType fir::DimsType::get(mlir::MLIRContext *ctxt, unsigned rank) {
- return Base::get(ctxt, rank);
-}
-
-unsigned fir::DimsType::getRank() const { return getImpl()->getRank(); }
-
// Field
FieldType fir::FieldType::get(mlir::MLIRContext *ctxt) {
@@ -992,7 +953,7 @@ mlir::Type fir::ReferenceType::getEleTy() const {
mlir::LogicalResult
fir::ReferenceType::verifyConstructionInvariants(mlir::Location loc,
mlir::Type eleTy) {
- if (eleTy.isa<DimsType>() || eleTy.isa<FieldType>() || eleTy.isa<LenType>() ||
+ if (eleTy.isa<FieldType>() || eleTy.isa<LenType>() ||
eleTy.isa<ReferenceType>() || eleTy.isa<TypeDescType>())
return mlir::emitError(loc, "cannot build a reference to type: ")
<< eleTy << '\n';
@@ -1012,10 +973,10 @@ mlir::Type fir::PointerType::getEleTy() const {
static bool canBePointerOrHeapElementType(mlir::Type eleTy) {
return eleTy.isa<BoxType>() || eleTy.isa<BoxCharType>() ||
- eleTy.isa<BoxProcType>() || eleTy.isa<DimsType>() ||
- eleTy.isa<FieldType>() || eleTy.isa<LenType>() ||
- eleTy.isa<HeapType>() || eleTy.isa<PointerType>() ||
- eleTy.isa<ReferenceType>() || eleTy.isa<TypeDescType>();
+ eleTy.isa<BoxProcType>() || eleTy.isa<FieldType>() ||
+ eleTy.isa<LenType>() || eleTy.isa<HeapType>() ||
+ eleTy.isa<PointerType>() || eleTy.isa<ReferenceType>() ||
+ eleTy.isa<TypeDescType>();
}
mlir::LogicalResult
@@ -1100,8 +1061,8 @@ mlir::LogicalResult fir::SequenceType::verifyConstructionInvariants(
mlir::AffineMapAttr map) {
// DIMENSION attribute can only be applied to an intrinsic or record type
if (eleTy.isa<BoxType>() || eleTy.isa<BoxCharType>() ||
- eleTy.isa<BoxProcType>() || eleTy.isa<DimsType>() ||
- eleTy.isa<FieldType>() || eleTy.isa<LenType>() || eleTy.isa<HeapType>() ||
+ eleTy.isa<BoxProcType>() || eleTy.isa<FieldType>() ||
+ eleTy.isa<LenType>() || eleTy.isa<HeapType>() ||
eleTy.isa<PointerType>() || eleTy.isa<ReferenceType>() ||
eleTy.isa<TypeDescType>() || eleTy.isa<SequenceType>())
return mlir::emitError(loc, "cannot build an array of this element type: ")
@@ -1186,9 +1147,9 @@ mlir::LogicalResult
fir::TypeDescType::verifyConstructionInvariants(mlir::Location loc,
mlir::Type eleTy) {
if (eleTy.isa<BoxType>() || eleTy.isa<BoxCharType>() ||
- eleTy.isa<BoxProcType>() || eleTy.isa<DimsType>() ||
- eleTy.isa<FieldType>() || eleTy.isa<LenType>() ||
- eleTy.isa<ReferenceType>() || eleTy.isa<TypeDescType>())
+ eleTy.isa<BoxProcType>() || eleTy.isa<FieldType>() ||
+ eleTy.isa<LenType>() || eleTy.isa<ReferenceType>() ||
+ eleTy.isa<TypeDescType>())
return mlir::emitError(loc, "cannot build a type descriptor of type: ")
<< eleTy << '\n';
return mlir::success();
@@ -1276,10 +1237,6 @@ void fir::printFirType(FIROpsDialect *, mlir::Type ty,
os << '>';
return;
}
- if (auto type = ty.dyn_cast<DimsType>()) {
- os << "dims<" << type.getRank() << '>';
- return;
- }
if (ty.isa<FieldType>()) {
os << "field";
return;
diff --git a/flang/test/Fir/fir-ops.fir b/flang/test/Fir/fir-ops.fir
index 2a17c20cde39..fe10ef77888d 100644
--- a/flang/test/Fir/fir-ops.fir
+++ b/flang/test/Fir/fir-ops.fir
@@ -97,12 +97,10 @@ func @instructions() {
%23 = fir.extract_value %22, %21 : (!fir.type<derived{f:f32}>, !fir.field) -> f32
// CHECK: [[VAL_26:%.*]] = constant 1 : i32
-// CHECK: [[VAL_27:%.*]] = fir.gendims [[VAL_26]], [[VAL_21]], [[VAL_26]] : (i32, i32, i32) -> !fir.dims<1>
// CHECK: [[VAL_28:%.*]] = constant 1.0
// CHECK: [[VAL_29:%.*]] = fir.insert_value [[VAL_24]], [[VAL_28]], [[VAL_23]] : (!fir.type<derived{f:f32}>, f32, !fir.field) -> !fir.type<derived{f:f32}>
// CHECK: [[VAL_30:%.*]] = fir.len_param_index f, !fir.type<derived3{f:f32}>
%c1 = constant 1 : i32
- %24 = fir.gendims %c1, %19, %c1 : (i32, i32, i32) -> !fir.dims<1>
%cf1 = constant 1.0 : f32
%25 = fir.insert_value %22, %cf1, %21 : (!fir.type<derived{f:f32}>, f32, !fir.field) -> !fir.type<derived{f:f32}>
%26 = fir.len_param_index f, !fir.type<derived3{f:f32}>
@@ -142,7 +140,7 @@ func @boxing_match() {
// CHECK: [[VAL_40:%.*]] = fir.alloca !fir.char<1>
// CHECK: [[VAL_41:%.*]] = fir.alloca tuple<i32, f64>
// CHECK: [[VAL_42:%.*]] = fir.embox [[VAL_38]] : (!fir.ref<i32>) -> !fir.box<i32>
-// CHECK: [[VAL_43:%.*]]:6 = fir.unbox [[VAL_42]] : (!fir.box<i32>) -> (!fir.ref<i32>, i32, i32, !fir.tdesc<i32>, i32, !fir.dims<0>)
+// CHECK: [[VAL_43:%.*]]:6 = fir.unbox [[VAL_42]] : (!fir.box<i32>) -> (!fir.ref<i32>, i32, i32, !fir.tdesc<i32>, i32, !fir.array<3x?xindex>)
// CHECK: [[VAL_44:%.*]] = constant 8 : i32
// CHECK: [[VAL_45:%.*]] = fir.undefined !fir.char<1>
// CHECK: [[VAL_46:%.*]] = fir.emboxchar [[VAL_40]], [[VAL_44]] : (!fir.ref<!fir.char<1>>, i32) -> !fir.boxchar<1>
@@ -168,7 +166,7 @@ func @boxing_match() {
%d3 = fir.alloca !fir.char<1>
%e6 = fir.alloca tuple<i32,f64>
%1 = fir.embox %0 : (!fir.ref<i32>) -> !fir.box<i32>
- %2:6 = fir.unbox %1 : (!fir.box<i32>) -> (!fir.ref<i32>,i32,i32,!fir.tdesc<i32>,i32,!fir.dims<0>)
+ %2:6 = fir.unbox %1 : (!fir.box<i32>) -> (!fir.ref<i32>,i32,i32,!fir.tdesc<i32>,i32,!fir.array<3x?xindex>)
%c8 = constant 8 : i32
%3 = fir.undefined !fir.char<1>
%4 = fir.emboxchar %d3, %c8 : (!fir.ref<!fir.char<1>>, i32) -> !fir.boxchar<1>
diff --git a/flang/test/Fir/fir-types.fir b/flang/test/Fir/fir-types.fir
index 4fc752b9da8a..789780809772 100644
--- a/flang/test/Fir/fir-types.fir
+++ b/flang/test/Fir/fir-types.fir
@@ -67,11 +67,7 @@ func private @box4() -> !fir.box<none>
func private @box5() -> !fir.box<!fir.type<derived3{f:f32}>>
// FIR misc. types
-// CHECK-LABEL: func private @oth1() -> !fir.dims<1>
// CHECK-LABEL: func private @oth2() -> !fir.field
// CHECK-LABEL: func private @oth3() -> !fir.tdesc<!fir.type<derived7{f1:f32,f2:f32}>>
-// CHECK-LABEL: func private @oth4() -> !fir.dims<15>
-func private @oth1() -> !fir.dims<1>
func private @oth2() -> !fir.field
func private @oth3() -> !fir.tdesc<!fir.type<derived7{f1:f32,f2:f32}>>
-func private @oth4() -> !fir.dims<15>
More information about the flang-commits
mailing list