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 "llvm/IR/IntrinsicsSPIRV.h"
11
12using namespace llvm;
13
14bool llvm::SPIRVTTIImpl::collectFlatAddressOperands(
15 SmallVectorImpl<int> &OpIndexes, Intrinsic::ID IID) const {
16 switch (IID) {
17 case Intrinsic::spv_generic_cast_to_ptr_explicit:
18 OpIndexes.push_back(Elt: 0);
19 return true;
20 default:
21 return false;
22 }
23}
24
25Value *llvm::SPIRVTTIImpl::rewriteIntrinsicWithAddressSpace(IntrinsicInst *II,
26 Value *OldV,
27 Value *NewV) const {
28 auto IntrID = II->getIntrinsicID();
29 switch (IntrID) {
30 case Intrinsic::spv_generic_cast_to_ptr_explicit: {
31 unsigned NewAS = NewV->getType()->getPointerAddressSpace();
32 unsigned DstAS = II->getType()->getPointerAddressSpace();
33 return NewAS == DstAS ? NewV
34 : ConstantPointerNull::get(
35 T: PointerType::get(C&: NewV->getContext(), AddressSpace: DstAS));
36 }
37 default:
38 return nullptr;
39 }
40}
41