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