
This PR adds overrides in `SPIRVTTIImpl` for `collectFlatAddressOperands` and `rewriteIntrinsicWithAddressSpace` to enable `InferAddressSpacesPass` to rewrite the `llvm.spv.generic.cast.to.ptr.explicit` intrinsic (corresponding to `OpGenericCastToPtrExplicit`) when the address space of the argument can be inferred. When the destination address space of the cast matches the inferred address space of the argument, the call is replaced with that argument. When they do not match, the cast is replaced with a constant null pointer.
41 lines
1.4 KiB
C++
41 lines
1.4 KiB
C++
//===- SPIRVTargetTransformInfo.cpp - SPIR-V specific TTI -------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "SPIRVTargetTransformInfo.h"
|
|
#include "llvm/IR/IntrinsicsSPIRV.h"
|
|
|
|
using namespace llvm;
|
|
|
|
bool llvm::SPIRVTTIImpl::collectFlatAddressOperands(
|
|
SmallVectorImpl<int> &OpIndexes, Intrinsic::ID IID) const {
|
|
switch (IID) {
|
|
case Intrinsic::spv_generic_cast_to_ptr_explicit:
|
|
OpIndexes.push_back(0);
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
Value *llvm::SPIRVTTIImpl::rewriteIntrinsicWithAddressSpace(IntrinsicInst *II,
|
|
Value *OldV,
|
|
Value *NewV) const {
|
|
auto IntrID = II->getIntrinsicID();
|
|
switch (IntrID) {
|
|
case Intrinsic::spv_generic_cast_to_ptr_explicit: {
|
|
unsigned NewAS = NewV->getType()->getPointerAddressSpace();
|
|
unsigned DstAS = II->getType()->getPointerAddressSpace();
|
|
return NewAS == DstAS ? NewV
|
|
: ConstantPointerNull::get(
|
|
PointerType::get(NewV->getContext(), DstAS));
|
|
}
|
|
default:
|
|
return nullptr;
|
|
}
|
|
}
|