[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
This commit is contained in:
Eric Schweitz 2021-02-04 13:24:51 -08:00
parent bdb40dd14e
commit 9673a00995
6 changed files with 19 additions and 125 deletions

View file

@ -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";

View file

@ -40,7 +40,6 @@ struct BoxCharTypeStorage;
struct BoxProcTypeStorage;
struct CharacterTypeStorage;
struct ComplexTypeStorage;
struct DimsTypeStorage;
struct FieldTypeStorage;
struct HeapTypeStorage;
struct IntegerTypeStorage;
@ -191,20 +190,6 @@ public:
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.

View file

@ -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<

View file

@ -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 @@ private:
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;

View file

@ -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>

View file

@ -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>