88 lines · cpp
1//===-- llvm/CodeGen/LowLevelTypeUtils.cpp --------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9/// \file This file implements the more header-heavy bits of the LLT class to10/// avoid polluting users' namespaces.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/CodeGen/LowLevelTypeUtils.h"15#include "llvm/ADT/APFloat.h"16#include "llvm/IR/DataLayout.h"17#include "llvm/IR/DerivedTypes.h"18using namespace llvm;19 20LLT llvm::getLLTForType(Type &Ty, const DataLayout &DL) {21 if (auto VTy = dyn_cast<VectorType>(&Ty)) {22 auto EC = VTy->getElementCount();23 LLT ScalarTy = getLLTForType(*VTy->getElementType(), DL);24 if (EC.isScalar())25 return ScalarTy;26 return LLT::vector(EC, ScalarTy);27 }28 29 if (auto PTy = dyn_cast<PointerType>(&Ty)) {30 unsigned AddrSpace = PTy->getAddressSpace();31 return LLT::pointer(AddrSpace, DL.getPointerSizeInBits(AddrSpace));32 }33 34 if (Ty.isSized() && !Ty.isScalableTargetExtTy()) {35 // Aggregates are no different from real scalars as far as GlobalISel is36 // concerned.37 auto SizeInBits = DL.getTypeSizeInBits(&Ty);38 assert(SizeInBits != 0 && "invalid zero-sized type");39 return LLT::scalar(SizeInBits);40 }41 42 if (Ty.isTokenTy())43 return LLT::token();44 45 return LLT();46}47 48MVT llvm::getMVTForLLT(LLT Ty) {49 if (!Ty.isVector())50 return MVT::getIntegerVT(Ty.getSizeInBits());51 52 return MVT::getVectorVT(53 MVT::getIntegerVT(Ty.getElementType().getSizeInBits()),54 Ty.getElementCount());55}56 57EVT llvm::getApproximateEVTForLLT(LLT Ty, LLVMContext &Ctx) {58 if (Ty.isVector()) {59 EVT EltVT = getApproximateEVTForLLT(Ty.getElementType(), Ctx);60 return EVT::getVectorVT(Ctx, EltVT, Ty.getElementCount());61 }62 63 return EVT::getIntegerVT(Ctx, Ty.getSizeInBits());64}65 66LLT llvm::getLLTForMVT(MVT Ty) {67 if (!Ty.isVector())68 return LLT::scalar(Ty.getSizeInBits());69 70 return LLT::scalarOrVector(Ty.getVectorElementCount(),71 Ty.getVectorElementType().getSizeInBits());72}73 74const llvm::fltSemantics &llvm::getFltSemanticForLLT(LLT Ty) {75 assert(Ty.isScalar() && "Expected a scalar type.");76 switch (Ty.getSizeInBits()) {77 case 16:78 return APFloat::IEEEhalf();79 case 32:80 return APFloat::IEEEsingle();81 case 64:82 return APFloat::IEEEdouble();83 case 128:84 return APFloat::IEEEquad();85 }86 llvm_unreachable("Invalid FP type size.");87}88