1*676bfb2aSRiver Riddle //===- BuiltinTypeInterfaces.cpp ------------------------------------------===//
2*676bfb2aSRiver Riddle //
3*676bfb2aSRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*676bfb2aSRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5*676bfb2aSRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*676bfb2aSRiver Riddle //
7*676bfb2aSRiver Riddle //===----------------------------------------------------------------------===//
8*676bfb2aSRiver Riddle 
9*676bfb2aSRiver Riddle #include "mlir/IR/BuiltinTypes.h"
10*676bfb2aSRiver Riddle #include "mlir/IR/Diagnostics.h"
11*676bfb2aSRiver Riddle #include "llvm/ADT/Sequence.h"
12*676bfb2aSRiver Riddle 
13*676bfb2aSRiver Riddle using namespace mlir;
14*676bfb2aSRiver Riddle using namespace mlir::detail;
15*676bfb2aSRiver Riddle 
16*676bfb2aSRiver Riddle //===----------------------------------------------------------------------===//
17*676bfb2aSRiver Riddle /// Tablegen Interface Definitions
18*676bfb2aSRiver Riddle //===----------------------------------------------------------------------===//
19*676bfb2aSRiver Riddle 
20*676bfb2aSRiver Riddle #include "mlir/IR/BuiltinTypeInterfaces.cpp.inc"
21*676bfb2aSRiver Riddle 
22*676bfb2aSRiver Riddle //===----------------------------------------------------------------------===//
23*676bfb2aSRiver Riddle // ShapedType
24*676bfb2aSRiver Riddle //===----------------------------------------------------------------------===//
25*676bfb2aSRiver Riddle 
26*676bfb2aSRiver Riddle constexpr int64_t ShapedType::kDynamicSize;
27*676bfb2aSRiver Riddle constexpr int64_t ShapedType::kDynamicStrideOrOffset;
28*676bfb2aSRiver Riddle 
getNumElements(ArrayRef<int64_t> shape)29*676bfb2aSRiver Riddle int64_t ShapedType::getNumElements(ArrayRef<int64_t> shape) {
30*676bfb2aSRiver Riddle   int64_t num = 1;
31*676bfb2aSRiver Riddle   for (int64_t dim : shape) {
32*676bfb2aSRiver Riddle     num *= dim;
33*676bfb2aSRiver Riddle     assert(num >= 0 && "integer overflow in element count computation");
34*676bfb2aSRiver Riddle   }
35*676bfb2aSRiver Riddle   return num;
36*676bfb2aSRiver Riddle }
37*676bfb2aSRiver Riddle 
getSizeInBits() const38*676bfb2aSRiver Riddle int64_t ShapedType::getSizeInBits() const {
39*676bfb2aSRiver Riddle   assert(hasStaticShape() &&
40*676bfb2aSRiver Riddle          "cannot get the bit size of an aggregate with a dynamic shape");
41*676bfb2aSRiver Riddle 
42*676bfb2aSRiver Riddle   auto elementType = getElementType();
43*676bfb2aSRiver Riddle   if (elementType.isIntOrFloat())
44*676bfb2aSRiver Riddle     return elementType.getIntOrFloatBitWidth() * getNumElements();
45*676bfb2aSRiver Riddle 
46*676bfb2aSRiver Riddle   if (auto complexType = elementType.dyn_cast<ComplexType>()) {
47*676bfb2aSRiver Riddle     elementType = complexType.getElementType();
48*676bfb2aSRiver Riddle     return elementType.getIntOrFloatBitWidth() * getNumElements() * 2;
49*676bfb2aSRiver Riddle   }
50*676bfb2aSRiver Riddle   return getNumElements() * elementType.cast<ShapedType>().getSizeInBits();
51*676bfb2aSRiver Riddle }
52