xref: /llvm-project/llvm/test/Transforms/InferAddressSpaces/AMDGPU/store-pointer-to-self.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
13c483b88SMatt Arsenault; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
23c483b88SMatt Arsenault; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s
33c483b88SMatt Arsenault
43c483b88SMatt Arsenault; Make sure memory instructions where the pointer appears in both a
53c483b88SMatt Arsenault; pointer and value operand work correctly.
63c483b88SMatt Arsenault
73c483b88SMatt Arsenaultdeclare void @user(ptr)
83c483b88SMatt Arsenault
93c483b88SMatt Arsenault; Make sure only the pointer operand use of the store is replaced
103c483b88SMatt Arsenaultdefine void @store_flat_pointer_to_self() {
113c483b88SMatt Arsenault; CHECK-LABEL: define void @store_flat_pointer_to_self() {
123c483b88SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
133c483b88SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
143c483b88SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
153c483b88SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
163c483b88SMatt Arsenault; CHECK-NEXT:    ret void
173c483b88SMatt Arsenault;
183c483b88SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
193c483b88SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
203c483b88SMatt Arsenault  store ptr %flat, ptr %flat, align 8
213c483b88SMatt Arsenault  call void @user(ptr %flat)
223c483b88SMatt Arsenault  ret void
233c483b88SMatt Arsenault}
243c483b88SMatt Arsenault
257a51dde4SMatt Arsenaultdefine void @store_volatile_flat_pointer_to_self() {
267a51dde4SMatt Arsenault; CHECK-LABEL: define void @store_volatile_flat_pointer_to_self() {
277a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
287a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
297a51dde4SMatt Arsenault; CHECK-NEXT:    store volatile ptr [[FLAT]], ptr [[FLAT]], align 8
307a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
317a51dde4SMatt Arsenault; CHECK-NEXT:    ret void
327a51dde4SMatt Arsenault;
337a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
347a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
357a51dde4SMatt Arsenault  store volatile ptr %flat, ptr %flat, align 8
367a51dde4SMatt Arsenault  call void @user(ptr %flat)
377a51dde4SMatt Arsenault  ret void
387a51dde4SMatt Arsenault}
397a51dde4SMatt Arsenault
403c483b88SMatt Arsenaultdefine ptr @atomicrmw_xchg_flat_pointer_to_self() {
413c483b88SMatt Arsenault; CHECK-LABEL: define ptr @atomicrmw_xchg_flat_pointer_to_self() {
423c483b88SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
437a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
447a51dde4SMatt Arsenault; CHECK-NEXT:    [[XCHG:%.*]] = atomicrmw xchg ptr addrspace(5) [[ALLOCA]], ptr [[FLAT1]] seq_cst, align 8
457a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT1]])
463c483b88SMatt Arsenault; CHECK-NEXT:    ret ptr [[XCHG]]
473c483b88SMatt Arsenault;
483c483b88SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
493c483b88SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
503c483b88SMatt Arsenault  %xchg = atomicrmw xchg ptr %flat, ptr %flat seq_cst, align 8
513c483b88SMatt Arsenault  call void @user(ptr %flat)
523c483b88SMatt Arsenault  ret ptr %xchg
533c483b88SMatt Arsenault}
543c483b88SMatt Arsenault
557a51dde4SMatt Arsenaultdefine ptr @atomicrmw_volatile_xchg_flat_pointer_to_self() {
567a51dde4SMatt Arsenault; CHECK-LABEL: define ptr @atomicrmw_volatile_xchg_flat_pointer_to_self() {
577a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
587a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
597a51dde4SMatt Arsenault; CHECK-NEXT:    [[XCHG:%.*]] = atomicrmw volatile xchg ptr [[FLAT]], ptr [[FLAT]] seq_cst, align 8
607a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
617a51dde4SMatt Arsenault; CHECK-NEXT:    ret ptr [[XCHG]]
627a51dde4SMatt Arsenault;
637a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
647a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
657a51dde4SMatt Arsenault  %xchg = atomicrmw volatile xchg ptr %flat, ptr %flat seq_cst, align 8
667a51dde4SMatt Arsenault  call void @user(ptr %flat)
677a51dde4SMatt Arsenault  ret ptr %xchg
687a51dde4SMatt Arsenault}
697a51dde4SMatt Arsenault
703c483b88SMatt Arsenaultdefine { ptr, i1 } @cmpxchg_flat_pointer_new_to_self(ptr %cmp) {
713c483b88SMatt Arsenault; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_new_to_self(
723c483b88SMatt Arsenault; CHECK-SAME: ptr [[CMP:%.*]]) {
733c483b88SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
747a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
757a51dde4SMatt Arsenault; CHECK-NEXT:    [[CMPX:%.*]] = cmpxchg ptr addrspace(5) [[ALLOCA]], ptr [[CMP]], ptr [[FLAT1]] seq_cst seq_cst, align 8
767a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT1]])
773c483b88SMatt Arsenault; CHECK-NEXT:    ret { ptr, i1 } [[CMPX]]
783c483b88SMatt Arsenault;
793c483b88SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
803c483b88SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
813c483b88SMatt Arsenault  %cmpx = cmpxchg ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 8
823c483b88SMatt Arsenault  call void @user(ptr %flat)
833c483b88SMatt Arsenault  ret { ptr, i1 } %cmpx
843c483b88SMatt Arsenault}
853c483b88SMatt Arsenault
867a51dde4SMatt Arsenaultdefine { ptr, i1 } @cmpxchg_volatile_flat_pointer_new_to_self(ptr %cmp) {
877a51dde4SMatt Arsenault; CHECK-LABEL: define { ptr, i1 } @cmpxchg_volatile_flat_pointer_new_to_self(
887a51dde4SMatt Arsenault; CHECK-SAME: ptr [[CMP:%.*]]) {
897a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
907a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
917a51dde4SMatt Arsenault; CHECK-NEXT:    [[CMPX:%.*]] = cmpxchg volatile ptr [[FLAT]], ptr [[CMP]], ptr [[FLAT]] seq_cst seq_cst, align 8
927a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
937a51dde4SMatt Arsenault; CHECK-NEXT:    ret { ptr, i1 } [[CMPX]]
947a51dde4SMatt Arsenault;
957a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
967a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
977a51dde4SMatt Arsenault  %cmpx = cmpxchg volatile ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 8
987a51dde4SMatt Arsenault  call void @user(ptr %flat)
997a51dde4SMatt Arsenault  ret { ptr, i1 } %cmpx
1007a51dde4SMatt Arsenault}
1017a51dde4SMatt Arsenault
1027a51dde4SMatt Arsenaultdefine { ptr, i1 } @volatile_cmpxchg_flat_pointer_new_to_self(ptr %cmp) {
1037a51dde4SMatt Arsenault; CHECK-LABEL: define { ptr, i1 } @volatile_cmpxchg_flat_pointer_new_to_self(
1047a51dde4SMatt Arsenault; CHECK-SAME: ptr [[CMP:%.*]]) {
1057a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
1067a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
1077a51dde4SMatt Arsenault; CHECK-NEXT:    [[CMPX:%.*]] = cmpxchg volatile ptr [[FLAT]], ptr [[CMP]], ptr [[FLAT]] seq_cst seq_cst, align 8
1087a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
1097a51dde4SMatt Arsenault; CHECK-NEXT:    ret { ptr, i1 } [[CMPX]]
1107a51dde4SMatt Arsenault;
1117a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
1127a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
1137a51dde4SMatt Arsenault  %cmpx = cmpxchg volatile ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 8
1147a51dde4SMatt Arsenault  call void @user(ptr %flat)
1157a51dde4SMatt Arsenault  ret { ptr, i1 } %cmpx
1167a51dde4SMatt Arsenault}
1177a51dde4SMatt Arsenault
1183c483b88SMatt Arsenaultdefine { ptr, i1 } @cmpxchg_flat_pointer_cmp_to_self(ptr %new) {
1193c483b88SMatt Arsenault; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_cmp_to_self(
1203c483b88SMatt Arsenault; CHECK-SAME: ptr [[NEW:%.*]]) {
1213c483b88SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
1227a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
1237a51dde4SMatt Arsenault; CHECK-NEXT:    [[CMPX:%.*]] = cmpxchg ptr addrspace(5) [[ALLOCA]], ptr [[FLAT1]], ptr [[NEW]] seq_cst seq_cst, align 8
1247a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT1]])
1253c483b88SMatt Arsenault; CHECK-NEXT:    ret { ptr, i1 } [[CMPX]]
1263c483b88SMatt Arsenault;
1273c483b88SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
1283c483b88SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
1293c483b88SMatt Arsenault  %cmpx = cmpxchg ptr %flat, ptr %flat, ptr %new seq_cst seq_cst, align 8
1303c483b88SMatt Arsenault  call void @user(ptr %flat)
1313c483b88SMatt Arsenault  ret { ptr, i1 } %cmpx
1323c483b88SMatt Arsenault}
1337a51dde4SMatt Arsenault
1347a51dde4SMatt Arsenaultdefine { ptr, i1 } @cmpxchg_flat_pointer_cmp_new_self() {
1357a51dde4SMatt Arsenault; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_cmp_new_self() {
1367a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
1377a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
1387a51dde4SMatt Arsenault; CHECK-NEXT:    [[CMPX:%.*]] = cmpxchg ptr addrspace(5) [[ALLOCA]], ptr [[FLAT]], ptr [[FLAT]] seq_cst seq_cst, align 8
1397a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
1407a51dde4SMatt Arsenault; CHECK-NEXT:    ret { ptr, i1 } [[CMPX]]
1417a51dde4SMatt Arsenault;
1427a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
1437a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
1447a51dde4SMatt Arsenault  %cmpx = cmpxchg ptr %flat, ptr %flat, ptr %flat seq_cst seq_cst, align 8
1457a51dde4SMatt Arsenault  call void @user(ptr %flat)
1467a51dde4SMatt Arsenault  ret { ptr, i1 } %cmpx
1477a51dde4SMatt Arsenault}
1487a51dde4SMatt Arsenault
1497a51dde4SMatt Arsenaultdefine void @multi_store_flat_pointer_to_self() {
1507a51dde4SMatt Arsenault; CHECK-LABEL: define void @multi_store_flat_pointer_to_self() {
1517a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
1527a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
1537a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1547a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1557a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
1567a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1577a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr addrspace(5) [[ALLOCA]], ptr addrspace(5) [[ALLOCA]], align 8
1587a51dde4SMatt Arsenault; CHECK-NEXT:    ret void
1597a51dde4SMatt Arsenault;
1607a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
1617a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
1627a51dde4SMatt Arsenault  store ptr %flat, ptr %flat, align 8
1637a51dde4SMatt Arsenault  store ptr %flat, ptr %flat, align 8
1647a51dde4SMatt Arsenault  call void @user(ptr %flat)
1657a51dde4SMatt Arsenault  store ptr %flat, ptr addrspace(5) %alloca, align 8
1667a51dde4SMatt Arsenault  store ptr addrspace(5) %alloca, ptr %flat, align 8
1677a51dde4SMatt Arsenault  ret void
1687a51dde4SMatt Arsenault}
1697a51dde4SMatt Arsenault
1707a51dde4SMatt Arsenaultdefine void @mixed_volatile_multi_store_flat_pointer_to_self() {
1717a51dde4SMatt Arsenault; CHECK-LABEL: define void @mixed_volatile_multi_store_flat_pointer_to_self() {
1727a51dde4SMatt Arsenault; CHECK-NEXT:    [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)
1737a51dde4SMatt Arsenault; CHECK-NEXT:    [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr
1747a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1757a51dde4SMatt Arsenault; CHECK-NEXT:    store volatile ptr [[FLAT]], ptr [[FLAT]], align 8
1767a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1777a51dde4SMatt Arsenault; CHECK-NEXT:    call void @user(ptr [[FLAT]])
1787a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1797a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr addrspace(5) [[ALLOCA]], ptr addrspace(5) [[ALLOCA]], align 8
1807a51dde4SMatt Arsenault; CHECK-NEXT:    store volatile ptr [[FLAT]], ptr [[FLAT]], align 8
1817a51dde4SMatt Arsenault; CHECK-NEXT:    store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8
1827a51dde4SMatt Arsenault; CHECK-NEXT:    ret void
1837a51dde4SMatt Arsenault;
1847a51dde4SMatt Arsenault  %alloca = alloca ptr, align 8, addrspace(5)
1857a51dde4SMatt Arsenault  %flat = addrspacecast ptr addrspace(5) %alloca to ptr
1867a51dde4SMatt Arsenault  store ptr %flat, ptr %flat, align 8
1877a51dde4SMatt Arsenault  store volatile ptr %flat, ptr %flat, align 8
1887a51dde4SMatt Arsenault  store ptr %flat, ptr %flat, align 8
1897a51dde4SMatt Arsenault  call void @user(ptr %flat)
1907a51dde4SMatt Arsenault  store ptr %flat, ptr addrspace(5) %alloca, align 8
1917a51dde4SMatt Arsenault  store ptr addrspace(5) %alloca, ptr %flat, align 8
1927a51dde4SMatt Arsenault  store volatile ptr %flat, ptr %flat, align 8
1937a51dde4SMatt Arsenault  store ptr %flat, ptr %flat, align 8
1947a51dde4SMatt Arsenault  ret void
1957a51dde4SMatt Arsenault}
1967a51dde4SMatt Arsenault
1977a51dde4SMatt Arsenaultdefine amdgpu_kernel void @uselist_regression_skipped_load(ptr nocapture readonly %Arg, i32 %i) {
1987a51dde4SMatt Arsenault; CHECK-LABEL: define amdgpu_kernel void @uselist_regression_skipped_load(
199*29441e4fSNikita Popov; CHECK-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[I:%.*]]) {
2007a51dde4SMatt Arsenault; CHECK-NEXT:  [[ENTRY:.*:]]
2017a51dde4SMatt Arsenault; CHECK-NEXT:    [[ARG_GLOBAL:%.*]] = addrspacecast ptr [[ARG]] to ptr addrspace(1)
2027a51dde4SMatt Arsenault; CHECK-NEXT:    [[P1:%.*]] = getelementptr inbounds ptr, ptr addrspace(1) [[ARG_GLOBAL]], i32 [[I]]
2037a51dde4SMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr addrspace(1) [[P1]] to ptr
2047a51dde4SMatt Arsenault; CHECK-NEXT:    [[P2:%.*]] = load volatile ptr, ptr [[TMP0]], align 8
2057a51dde4SMatt Arsenault; CHECK-NEXT:    [[P2_GLOBAL:%.*]] = addrspacecast ptr [[P2]] to ptr addrspace(1)
2067a51dde4SMatt Arsenault; CHECK-NEXT:    store float 0.000000e+00, ptr addrspace(1) [[P2_GLOBAL]], align 4
2077a51dde4SMatt Arsenault; CHECK-NEXT:    ret void
2087a51dde4SMatt Arsenault;
2097a51dde4SMatt Arsenaultentry:
2107a51dde4SMatt Arsenault  %Arg.global = addrspacecast ptr %Arg to ptr addrspace(1)
2117a51dde4SMatt Arsenault  %Arg.flat = addrspacecast ptr addrspace(1) %Arg.global to ptr
2127a51dde4SMatt Arsenault  %p1 = getelementptr inbounds ptr, ptr %Arg.flat, i32 %i
2137a51dde4SMatt Arsenault  %p2 = load volatile ptr, ptr %p1, align 8
2147a51dde4SMatt Arsenault  %p2.global = addrspacecast ptr %p2 to ptr addrspace(1)
2157a51dde4SMatt Arsenault  %p2.flat = addrspacecast ptr addrspace(1) %p2.global to ptr
2167a51dde4SMatt Arsenault  store float 0.000000e+00, ptr %p2.flat, align 4
2177a51dde4SMatt Arsenault  ret void
2187a51dde4SMatt Arsenault}
219