Files
clang-p2996/llvm/test/CodeGen/AMDGPU/invalid-addrspacecast.ll
Matt Arsenault 18ea6c9280 AMDGPU: Stop emitting an error on illegal addrspacecasts (#127487)
These cannot be static compile errors, and should be treated as
poison. Invalid casts may be introduced which are dynamically dead.

For example:

```
  void foo(volatile generic int* x) {
    __builtin_assume(is_shared(x));
    *x = 4;
  }

  void bar() {
    private int y;
    foo(&y); // violation, wrong address space
  }
```

This could produce a compile time backend error or not depending on
the optimization level. Similarly, the new test demonstrates a failure
on a lowered atomicrmw which required inserting runtime address
space checks. The invalid cases are dynamically dead, we should not
error, and the AtomicExpand pass shouldn't have to consider the details
of the incoming pointer to produce valid IR.

This should go to the release branch. This fixes broken -O0 compiles
with 64-bit atomics which would have started failing in
1d0370872f.
2025-02-17 21:03:50 +07:00

68 lines
2.5 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdhsad < %s | FileCheck %s
; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdhsa < %s | FileCheck %s
; Check illegal casts are codegened as poison, and not an error.
define amdgpu_kernel void @use_group_to_global_addrspacecast(ptr addrspace(3) %ptr) {
; CHECK-LABEL: use_group_to_global_addrspacecast:
; CHECK: ; %bb.0:
; CHECK-NEXT: v_mov_b32_e32 v0, 0
; CHECK-NEXT: flat_store_dword v[0:1], v0
; CHECK-NEXT: s_waitcnt vmcnt(0)
; CHECK-NEXT: s_endpgm
%stof = addrspacecast ptr addrspace(3) %ptr to ptr addrspace(1)
store volatile i32 0, ptr addrspace(1) %stof
ret void
}
define amdgpu_kernel void @use_local_to_constant32bit_addrspacecast(ptr addrspace(3) %ptr) {
; CHECK-LABEL: use_local_to_constant32bit_addrspacecast:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_mov_b32 s1, 0
; CHECK-NEXT: s_load_dword s0, s[0:1], 0x0
; CHECK-NEXT: s_endpgm
%stof = addrspacecast ptr addrspace(3) %ptr to ptr addrspace(6)
%load = load volatile i32, ptr addrspace(6) %stof
ret void
}
define amdgpu_kernel void @use_constant32bit_to_local_addrspacecast(ptr addrspace(6) %ptr) {
; CHECK-LABEL: use_constant32bit_to_local_addrspacecast:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_mov_b32 m0, -1
; CHECK-NEXT: ds_read_b32 v0, v0
; CHECK-NEXT: s_endpgm
%cast = addrspacecast ptr addrspace(6) %ptr to ptr addrspace(3)
%load = load volatile i32, ptr addrspace(3) %cast
ret void
}
define amdgpu_kernel void @use_local_to_42_addrspacecast(ptr addrspace(3) %ptr) {
; SDAG-LABEL: use_local_to_42_addrspacecast:
; SDAG: ; %bb.0:
; SDAG-NEXT: v_mov_b32_e32 v0, 0
; SDAG-NEXT: v_mov_b32_e32 v1, 0
; SDAG-NEXT: flat_store_dwordx2 v[0:1], v[0:1]
; SDAG-NEXT: s_waitcnt vmcnt(0)
; SDAG-NEXT: s_endpgm
;
; GISEL-LABEL: use_local_to_42_addrspacecast:
; GISEL: ; %bb.0:
; GISEL-NEXT: s_endpgm
%cast = addrspacecast ptr addrspace(3) %ptr to ptr addrspace(42)
store volatile ptr addrspace(42) %cast, ptr addrspace(1) null
ret void
}
define amdgpu_kernel void @use_42_to_local_addrspacecast(ptr addrspace(42) %ptr) {
; CHECK-LABEL: use_42_to_local_addrspacecast:
; CHECK: ; %bb.0:
; CHECK-NEXT: s_mov_b32 m0, -1
; CHECK-NEXT: ds_read_b32 v0, v0
; CHECK-NEXT: s_endpgm
%cast = addrspacecast ptr addrspace(42) %ptr to ptr addrspace(3)
%load = load volatile i32, ptr addrspace(3) %cast
ret void
}