1 //===- TypeRange.cpp ------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "mlir/IR/TypeRange.h"
10 #include "mlir/IR/Operation.h"
14 //===----------------------------------------------------------------------===//
17 TypeRange::TypeRange(ArrayRef
<Type
> types
)
18 : TypeRange(types
.data(), types
.size()) {
19 assert(llvm::all_of(types
, [](Type t
) { return t
; }) &&
20 "attempting to construct a TypeRange with null types");
22 TypeRange::TypeRange(OperandRange values
)
23 : TypeRange(values
.begin().getBase(), values
.size()) {}
24 TypeRange::TypeRange(ResultRange values
)
25 : TypeRange(values
.getBase(), values
.size()) {}
26 TypeRange::TypeRange(ValueRange values
) : TypeRange(OwnerT(), values
.size()) {
29 ValueRange::OwnerT owner
= values
.begin().getBase();
30 if (auto *result
= llvm::dyn_cast_if_present
<detail::OpResultImpl
*>(owner
))
32 else if (auto *operand
= llvm::dyn_cast_if_present
<OpOperand
*>(owner
))
35 this->base
= owner
.get
<const Value
*>();
38 /// See `llvm::detail::indexed_accessor_range_base` for details.
39 TypeRange::OwnerT
TypeRange::offset_base(OwnerT object
, ptrdiff_t index
) {
40 if (const auto *value
= llvm::dyn_cast_if_present
<const Value
*>(object
))
41 return {value
+ index
};
42 if (auto *operand
= llvm::dyn_cast_if_present
<OpOperand
*>(object
))
43 return {operand
+ index
};
44 if (auto *result
= llvm::dyn_cast_if_present
<detail::OpResultImpl
*>(object
))
45 return {result
->getNextResultAtOffset(index
)};
46 return {llvm::dyn_cast_if_present
<const Type
*>(object
) + index
};
49 /// See `llvm::detail::indexed_accessor_range_base` for details.
50 Type
TypeRange::dereference_iterator(OwnerT object
, ptrdiff_t index
) {
51 if (const auto *value
= llvm::dyn_cast_if_present
<const Value
*>(object
))
52 return (value
+ index
)->getType();
53 if (auto *operand
= llvm::dyn_cast_if_present
<OpOperand
*>(object
))
54 return (operand
+ index
)->get().getType();
55 if (auto *result
= llvm::dyn_cast_if_present
<detail::OpResultImpl
*>(object
))
56 return result
->getNextResultAtOffset(index
)->getType();
57 return llvm::dyn_cast_if_present
<const Type
*>(object
)[index
];