mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 22:00:10 +00:00
[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:
parent
bdb40dd14e
commit
9673a00995
@ -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";
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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<
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user