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