Files
clang-p2996/llvm/test/Transforms/AtomicExpand/AMDGPU/unaligned-atomic.ll
Alex Richardson 5bc438efcf [AtomicExpand] Avoid creating an unnamed libcall
I recently modified this pass to better support CHERI-RISC-V and while
doing so I noticed that this pass was calling M->getOrInsertFunction()
with the result of TLI->getLibcallName(RTLibType). However, AMDGPU fills
the libcalls array with nullptr, so this creates an anonymous function
instead. This patch changes expandAtomicOpToLibcall to return false in
case the libcall does not exist and changes the assert() in the callees to
a report_fatal_error() instead.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D88800
2020-11-02 17:52:37 +00:00

36 lines
1.8 KiB
LLVM

; RUN: not --crash opt -S -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -atomic-expand %s 2>&1 | FileCheck %s
; The AtomicExpand pass cannot handle missing libcalls (yet) so reports a fatal error.
; CHECK: LLVM ERROR: expandAtomicOpToLibcall shouldn't fail for Load
define i32 @atomic_load_global_align1(i32 addrspace(1)* %ptr) {
; GCN-LABEL: @atomic_load_global_align1(
; GCN-NEXT: [[TMP1:%.*]] = bitcast i32 addrspace(1)* [[PTR:%.*]] to i8 addrspace(1)*
; GCN-NEXT: [[TMP2:%.*]] = addrspacecast i8 addrspace(1)* [[TMP1]] to i8*
; GCN-NEXT: [[TMP3:%.*]] = alloca i32, align 4
; GCN-NEXT: [[TMP4:%.*]] = bitcast i32* [[TMP3]] to i8*
; GCN-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]])
; GCN-NEXT: call void @0(i64 4, i8* [[TMP2]], i8* [[TMP4]], i32 5)
; GCN-NEXT: [[TMP5:%.*]] = load i32, i32* [[TMP3]], align 4
; GCN-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP4]])
; GCN-NEXT: ret i32 [[TMP5]]
;
%val = load atomic i32, i32 addrspace(1)* %ptr seq_cst, align 1
ret i32 %val
}
define void @atomic_store_global_align1(i32 addrspace(1)* %ptr, i32 %val) {
; GCN-LABEL: @atomic_store_global_align1(
; GCN-NEXT: [[TMP1:%.*]] = bitcast i32 addrspace(1)* [[PTR:%.*]] to i8 addrspace(1)*
; GCN-NEXT: [[TMP2:%.*]] = addrspacecast i8 addrspace(1)* [[TMP1]] to i8*
; GCN-NEXT: [[TMP3:%.*]] = alloca i32, align 4
; GCN-NEXT: [[TMP4:%.*]] = bitcast i32* [[TMP3]] to i8*
; GCN-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* [[TMP4]])
; GCN-NEXT: store i32 [[VAL:%.*]], i32* [[TMP3]], align 4
; GCN-NEXT: call void @1(i64 4, i8* [[TMP2]], i8* [[TMP4]], i32 0)
; GCN-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* [[TMP4]])
; GCN-NEXT: ret void
;
store atomic i32 %val, i32 addrspace(1)* %ptr monotonic, align 1
ret void
}