llvm-project/llvm/lib/Target/SPIRV/SPIRVTargetTransformInfo.cpp
Justin Cai 1409e1a5e5
[SPIRV] Add logic for OpGenericCastToPtrExplicit rewriting (#146596)
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.
2025-07-10 15:21:39 +01:00

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;
}
}