1//===- SPIRVTargetTransformInfo.cpp - SPIR-V specific TTI -------*- C++ -*-===//
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
9#include "SPIRVTargetTransformInfo.h"
10#include "SPIRVSubtarget.h"
11#include "llvm/IR/IntrinsicsSPIRV.h"
12
13using namespace llvm;
14
15bool llvm::SPIRVTTIImpl::collectFlatAddressOperands(
16 SmallVectorImpl<int> &OpIndexes, Intrinsic::ID IID) const {
17 switch (IID) {
18 case Intrinsic::spv_generic_cast_to_ptr_explicit:
19 OpIndexes.push_back(Elt: 0);
20 return true;
21 default:
22 return false;
23 }
24}
25
26Value *llvm::SPIRVTTIImpl::rewriteIntrinsicWithAddressSpace(IntrinsicInst *II,
27 Value *OldV,
28 Value *NewV) const {
29 auto IntrID = II->getIntrinsicID();
30 switch (IntrID) {
31 case Intrinsic::spv_generic_cast_to_ptr_explicit: {
32 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
33 unsigned DstAS = II->getType()->getPointerAddressSpace();
34 return NewAS == DstAS ? NewV
35 : ConstantPointerNull::get(
36 T: PointerType::get(C&: NewV->getContext(), AddressSpace: DstAS));
37 }
38 default:
39 return nullptr;
40 }
41}
42
43bool SPIRVTTIImpl::isLegalMaskedGather(Type *DataType, Align Alignment) const {
44 return ST->canUseExtension(E: SPIRV::Extension::SPV_INTEL_masked_gather_scatter);
45}
46
47bool SPIRVTTIImpl::isLegalMaskedScatter(Type *DataType, Align Alignment) const {
48 return ST->canUseExtension(E: SPIRV::Extension::SPV_INTEL_masked_gather_scatter);
49}
50