diff options
author | Krzysztof Drewniak <Krzysztof.Drewniak@amd.com> | 2023-05-05 22:03:40 +0000 |
---|---|---|
committer | Krzysztof Drewniak <Krzysztof.Drewniak@amd.com> | 2023-05-12 15:57:53 +0000 |
commit | 53a4adc0deb29fcc1f907ea7bc151fdebecf406d (patch) | |
tree | cc0a1a35ffbb09729673309a7d507c9faccc2c19 /llvm/lib | |
parent | 3f6e4e5b6e9451adf0fc21f3c45076d987fbbfd2 (diff) | |
download | llvm-53a4adc0deb29fcc1f907ea7bc151fdebecf406d.zip llvm-53a4adc0deb29fcc1f907ea7bc151fdebecf406d.tar.gz llvm-53a4adc0deb29fcc1f907ea7bc151fdebecf406d.tar.bz2 |
[AMDGPU] Fix crash with 160-bit p7's by manually defining getPointerTy
While pointers in address space 7 (128 bit rsrc + 32 bit offset)
should be rewritten out of the code before IR translation on AMDGPU,
higher-level analyses may still call MVT getPointerTy() and the like
on the target machine. Currently, since there is no MVT::i160, this
operation ends up causing crashes.
The changes to the data layout that caused such crashes were D149776.
This patch causes getPointerTy() to return the type MVT::v5i32
and getPointerMemTy() to be MVT::v8i32. These are accurate types,
but mean that we can't use vectors of address space 7 pointers during
codegen. This is mostly OK, since vectors of buffers aren't supported
in LPC anyway, but it's a noticable limitation.
Potential alternative solutions include adjusting getPointerTy() to return
an EVT or adding MVT::i160 and MVT::i256, both of which are rather
disruptive to the rest of the compiler.
Reviewed By: foad
Differential Revision: https://reviews.llvm.org/D150002
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/Target/AMDGPU/SIISelLowering.h | 6 |
2 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp index 6c8aa6c..6fad74c 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.cpp +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.cpp @@ -979,6 +979,26 @@ static EVT memVTFromLoadIntrReturn(Type *Ty, unsigned MaxNumLanes) { return memVTFromLoadIntrData(ST->getContainedType(0), MaxNumLanes); } +/// Map address space 7 to MVT::v5i32 because that's its in-memory +/// representation. This return value is vector-typed because there is no +/// MVT::i160 and it is not clear if one can be added. While this could +/// cause issues during codegen, these address space 7 pointers will be +/// rewritten away by then. Therefore, we can return MVT::v5i32 in order +/// to allow pre-codegen passes that query TargetTransformInfo, often for cost +/// modeling, to work. +MVT SITargetLowering::getPointerTy(const DataLayout &DL, unsigned AS) const { + if (AMDGPUAS::BUFFER_FAT_POINTER == AS && DL.getPointerSizeInBits(AS) == 160) + return MVT::v5i32; + return AMDGPUTargetLowering::getPointerTy(DL, AS); +} +/// Similarly, the in-memory representation of a p7 is {p8, i32}, aka +/// v8i32 when padding is added. +MVT SITargetLowering::getPointerMemTy(const DataLayout &DL, unsigned AS) const { + if (AMDGPUAS::BUFFER_FAT_POINTER == AS && DL.getPointerSizeInBits(AS) == 160) + return MVT::v8i32; + return AMDGPUTargetLowering::getPointerMemTy(DL, AS); +} + bool SITargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &CI, MachineFunction &MF, diff --git a/llvm/lib/Target/AMDGPU/SIISelLowering.h b/llvm/lib/Target/AMDGPU/SIISelLowering.h index 7e4b431..e82c97e 100644 --- a/llvm/lib/Target/AMDGPU/SIISelLowering.h +++ b/llvm/lib/Target/AMDGPU/SIISelLowering.h @@ -273,6 +273,12 @@ public: bool isShuffleMaskLegal(ArrayRef<int> /*Mask*/, EVT /*VT*/) const override; + // While address space 7 should never make it to codegen, it still needs to + // have a MVT to prevent some analyses that query this function from breaking, + // so, to work around the lack of i160, map it to v5i32. + MVT getPointerTy(const DataLayout &DL, unsigned AS) const override; + MVT getPointerMemTy(const DataLayout &DL, unsigned AS) const override; + bool getTgtMemIntrinsic(IntrinsicInfo &, const CallInst &, MachineFunction &MF, unsigned IntrinsicID) const override; |