MLIR 23.0.0git
Types.cpp
Go to the documentation of this file.
1//===- Types.cpp - MLIR Type Classes --------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10#include "mlir/IR/Dialect.h"
11
12using namespace mlir;
13using namespace mlir::detail;
14
15//===----------------------------------------------------------------------===//
16// AbstractType
17//===----------------------------------------------------------------------===//
18
20 Type type, function_ref<void(Attribute)> walkAttrsFn,
21 function_ref<void(Type)> walkTypesFn) const {
22 walkImmediateSubElementsFn(type, walkAttrsFn, walkTypesFn);
23}
24
26 ArrayRef<Attribute> replAttrs,
27 ArrayRef<Type> replTypes) const {
28 return replaceImmediateSubElementsFn(type, replAttrs, replTypes);
29}
30
31//===----------------------------------------------------------------------===//
32// Type
33//===----------------------------------------------------------------------===//
34
36
37bool Type::isBF16() const { return llvm::isa<BFloat16Type>(*this); }
38bool Type::isF16() const { return llvm::isa<Float16Type>(*this); }
39bool Type::isTF32() const { return llvm::isa<FloatTF32Type>(*this); }
40bool Type::isF32() const { return llvm::isa<Float32Type>(*this); }
41bool Type::isF64() const { return llvm::isa<Float64Type>(*this); }
42bool Type::isF80() const { return llvm::isa<Float80Type>(*this); }
43bool Type::isF128() const { return llvm::isa<Float128Type>(*this); }
44bool Type::isF8E4M3FN() const { return llvm::isa<Float8E4M3FNType>(*this); }
45bool Type::isF8E5M2() const { return llvm::isa<Float8E5M2Type>(*this); }
46
47bool Type::isFloat() const { return llvm::isa<FloatType>(*this); }
48
49/// Return true if this is a float type with the specified width.
50bool Type::isFloat(unsigned width) const {
51 if (auto fltTy = llvm::dyn_cast<FloatType>(*this))
52 return fltTy.getWidth() == width;
53 return false;
54}
55
56bool Type::isIndex() const { return llvm::isa<IndexType>(*this); }
57
58bool Type::isInteger() const { return llvm::isa<IntegerType>(*this); }
59
60bool Type::isInteger(unsigned width) const {
61 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
62 return intTy.getWidth() == width;
63 return false;
64}
65
67 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
68 return intTy.isSignless();
69 return false;
70}
71
72bool Type::isSignlessInteger(unsigned width) const {
73 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
74 return intTy.isSignless() && intTy.getWidth() == width;
75 return false;
76}
77
79 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
80 return intTy.isSigned();
81 return false;
82}
83
84bool Type::isSignedInteger(unsigned width) const {
85 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
86 return intTy.isSigned() && intTy.getWidth() == width;
87 return false;
88}
89
91 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
92 return intTy.isUnsigned();
93 return false;
94}
95
96bool Type::isUnsignedInteger(unsigned width) const {
97 if (auto intTy = llvm::dyn_cast<IntegerType>(*this))
98 return intTy.isUnsigned() && intTy.getWidth() == width;
99 return false;
100}
101
103 return isSignlessInteger() || llvm::isa<IndexType>(*this);
104}
105
107 return isSignlessInteger() || llvm::isa<IndexType, FloatType>(*this);
108}
109
111 return isSignlessInteger() || llvm::isa<FloatType>(*this);
112}
113
114bool Type::isIntOrIndex() const {
115 return llvm::isa<IntegerType>(*this) || isIndex();
116}
117
118bool Type::isIntOrFloat() const {
119 return llvm::isa<IntegerType, FloatType>(*this);
120}
121
122bool Type::isIntOrIndexOrFloat() const { return isIntOrFloat() || isIndex(); }
123
125 assert(isIntOrFloat() && "only integers and floats have a bitwidth");
126 if (auto intType = llvm::dyn_cast<IntegerType>(*this))
127 return intType.getWidth();
128 return llvm::cast<FloatType>(*this).getWidth();
129}
Type replaceImmediateSubElements(Type type, ArrayRef< Attribute > replAttrs, ArrayRef< Type > replTypes) const
Replace the immediate sub-elements of the given type.
Definition Types.cpp:25
void walkImmediateSubElements(Type type, function_ref< void(Attribute)> walkAttrsFn, function_ref< void(Type)> walkTypesFn) const
Walk the immediate sub-elements of the given type.
Definition Types.cpp:19
Attributes are known-constant values of operations.
Definition Attributes.h:25
MLIRContext * getContext() const
Definition Dialect.h:52
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition Types.h:74
bool isF64() const
Definition Types.cpp:41
bool isTF32() const
Definition Types.cpp:39
bool isFloat() const
Return true if this is an float type (with the specified width).
Definition Types.cpp:47
Dialect & getDialect() const
Get the dialect this type is registered to.
Definition Types.h:107
bool isSignlessIntOrIndex() const
Return true if this is a signless integer or index type.
Definition Types.cpp:102
MLIRContext * getContext() const
Return the MLIRContext in which this type was uniqued.
Definition Types.cpp:35
bool isF8E5M2() const
Definition Types.cpp:45
bool isSignedInteger() const
Return true if this is a signed integer type (with the specified width).
Definition Types.cpp:78
bool isSignlessInteger() const
Return true if this is a signless integer type (with the specified width).
Definition Types.cpp:66
bool isIndex() const
Definition Types.cpp:56
bool isIntOrIndexOrFloat() const
Return true if this is an integer (of any signedness), index, or float type.
Definition Types.cpp:122
bool isF8E4M3FN() const
Definition Types.cpp:44
bool isF32() const
Definition Types.cpp:40
bool isUnsignedInteger() const
Return true if this is an unsigned integer type (with the specified width).
Definition Types.cpp:90
bool isIntOrIndex() const
Return true if this is an integer (of any signedness) or an index type.
Definition Types.cpp:114
bool isInteger() const
Return true if this is an integer type (with the specified width).
Definition Types.cpp:58
bool isIntOrFloat() const
Return true if this is an integer (of any signedness) or a float type.
Definition Types.cpp:118
bool isF128() const
Definition Types.cpp:43
bool isF16() const
Definition Types.cpp:38
bool isF80() const
Definition Types.cpp:42
bool isSignlessIntOrFloat() const
Return true of this is a signless integer or a float type.
Definition Types.cpp:110
unsigned getIntOrFloatBitWidth() const
Return the bit width of an integer or a float type, assert failure on other types.
Definition Types.cpp:124
bool isBF16() const
Definition Types.cpp:37
bool isSignlessIntOrIndexOrFloat() const
Return true if this is a signless integer, index, or float type.
Definition Types.cpp:106
AttrTypeReplacer.
Include the generated interface declarations.
llvm::function_ref< Fn > function_ref
Definition LLVM.h:144