219 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s3 4; Make sure memory instructions where the pointer appears in both a5; pointer and value operand work correctly.6 7declare void @user(ptr)8 9; Make sure only the pointer operand use of the store is replaced10define void @store_flat_pointer_to_self() {11; CHECK-LABEL: define void @store_flat_pointer_to_self() {12; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)13; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr14; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 815; CHECK-NEXT: call void @user(ptr [[FLAT]])16; CHECK-NEXT: ret void17;18 %alloca = alloca ptr, align 8, addrspace(5)19 %flat = addrspacecast ptr addrspace(5) %alloca to ptr20 store ptr %flat, ptr %flat, align 821 call void @user(ptr %flat)22 ret void23}24 25define void @store_volatile_flat_pointer_to_self() {26; CHECK-LABEL: define void @store_volatile_flat_pointer_to_self() {27; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)28; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr29; CHECK-NEXT: store volatile ptr [[FLAT]], ptr [[FLAT]], align 830; CHECK-NEXT: call void @user(ptr [[FLAT]])31; CHECK-NEXT: ret void32;33 %alloca = alloca ptr, align 8, addrspace(5)34 %flat = addrspacecast ptr addrspace(5) %alloca to ptr35 store volatile ptr %flat, ptr %flat, align 836 call void @user(ptr %flat)37 ret void38}39 40define ptr @atomicrmw_xchg_flat_pointer_to_self() {41; CHECK-LABEL: define ptr @atomicrmw_xchg_flat_pointer_to_self() {42; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)43; CHECK-NEXT: [[FLAT1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr44; CHECK-NEXT: [[XCHG:%.*]] = atomicrmw xchg ptr addrspace(5) [[ALLOCA]], ptr [[FLAT1]] seq_cst, align 845; CHECK-NEXT: call void @user(ptr [[FLAT1]])46; CHECK-NEXT: ret ptr [[XCHG]]47;48 %alloca = alloca ptr, align 8, addrspace(5)49 %flat = addrspacecast ptr addrspace(5) %alloca to ptr50 %xchg = atomicrmw xchg ptr %flat, ptr %flat seq_cst, align 851 call void @user(ptr %flat)52 ret ptr %xchg53}54 55define ptr @atomicrmw_volatile_xchg_flat_pointer_to_self() {56; CHECK-LABEL: define ptr @atomicrmw_volatile_xchg_flat_pointer_to_self() {57; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)58; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr59; CHECK-NEXT: [[XCHG:%.*]] = atomicrmw volatile xchg ptr [[FLAT]], ptr [[FLAT]] seq_cst, align 860; CHECK-NEXT: call void @user(ptr [[FLAT]])61; CHECK-NEXT: ret ptr [[XCHG]]62;63 %alloca = alloca ptr, align 8, addrspace(5)64 %flat = addrspacecast ptr addrspace(5) %alloca to ptr65 %xchg = atomicrmw volatile xchg ptr %flat, ptr %flat seq_cst, align 866 call void @user(ptr %flat)67 ret ptr %xchg68}69 70define { ptr, i1 } @cmpxchg_flat_pointer_new_to_self(ptr %cmp) {71; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_new_to_self(72; CHECK-SAME: ptr [[CMP:%.*]]) {73; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)74; CHECK-NEXT: [[FLAT1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr75; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg ptr addrspace(5) [[ALLOCA]], ptr [[CMP]], ptr [[FLAT1]] seq_cst seq_cst, align 876; CHECK-NEXT: call void @user(ptr [[FLAT1]])77; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]78;79 %alloca = alloca ptr, align 8, addrspace(5)80 %flat = addrspacecast ptr addrspace(5) %alloca to ptr81 %cmpx = cmpxchg ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 882 call void @user(ptr %flat)83 ret { ptr, i1 } %cmpx84}85 86define { ptr, i1 } @cmpxchg_volatile_flat_pointer_new_to_self(ptr %cmp) {87; CHECK-LABEL: define { ptr, i1 } @cmpxchg_volatile_flat_pointer_new_to_self(88; CHECK-SAME: ptr [[CMP:%.*]]) {89; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)90; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr91; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg volatile ptr [[FLAT]], ptr [[CMP]], ptr [[FLAT]] seq_cst seq_cst, align 892; CHECK-NEXT: call void @user(ptr [[FLAT]])93; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]94;95 %alloca = alloca ptr, align 8, addrspace(5)96 %flat = addrspacecast ptr addrspace(5) %alloca to ptr97 %cmpx = cmpxchg volatile ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 898 call void @user(ptr %flat)99 ret { ptr, i1 } %cmpx100}101 102define { ptr, i1 } @volatile_cmpxchg_flat_pointer_new_to_self(ptr %cmp) {103; CHECK-LABEL: define { ptr, i1 } @volatile_cmpxchg_flat_pointer_new_to_self(104; CHECK-SAME: ptr [[CMP:%.*]]) {105; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)106; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr107; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg volatile ptr [[FLAT]], ptr [[CMP]], ptr [[FLAT]] seq_cst seq_cst, align 8108; CHECK-NEXT: call void @user(ptr [[FLAT]])109; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]110;111 %alloca = alloca ptr, align 8, addrspace(5)112 %flat = addrspacecast ptr addrspace(5) %alloca to ptr113 %cmpx = cmpxchg volatile ptr %flat, ptr %cmp, ptr %flat seq_cst seq_cst, align 8114 call void @user(ptr %flat)115 ret { ptr, i1 } %cmpx116}117 118define { ptr, i1 } @cmpxchg_flat_pointer_cmp_to_self(ptr %new) {119; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_cmp_to_self(120; CHECK-SAME: ptr [[NEW:%.*]]) {121; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)122; CHECK-NEXT: [[FLAT1:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr123; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg ptr addrspace(5) [[ALLOCA]], ptr [[FLAT1]], ptr [[NEW]] seq_cst seq_cst, align 8124; CHECK-NEXT: call void @user(ptr [[FLAT1]])125; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]126;127 %alloca = alloca ptr, align 8, addrspace(5)128 %flat = addrspacecast ptr addrspace(5) %alloca to ptr129 %cmpx = cmpxchg ptr %flat, ptr %flat, ptr %new seq_cst seq_cst, align 8130 call void @user(ptr %flat)131 ret { ptr, i1 } %cmpx132}133 134define { ptr, i1 } @cmpxchg_flat_pointer_cmp_new_self() {135; CHECK-LABEL: define { ptr, i1 } @cmpxchg_flat_pointer_cmp_new_self() {136; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)137; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr138; CHECK-NEXT: [[CMPX:%.*]] = cmpxchg ptr addrspace(5) [[ALLOCA]], ptr [[FLAT]], ptr [[FLAT]] seq_cst seq_cst, align 8139; CHECK-NEXT: call void @user(ptr [[FLAT]])140; CHECK-NEXT: ret { ptr, i1 } [[CMPX]]141;142 %alloca = alloca ptr, align 8, addrspace(5)143 %flat = addrspacecast ptr addrspace(5) %alloca to ptr144 %cmpx = cmpxchg ptr %flat, ptr %flat, ptr %flat seq_cst seq_cst, align 8145 call void @user(ptr %flat)146 ret { ptr, i1 } %cmpx147}148 149define void @multi_store_flat_pointer_to_self() {150; CHECK-LABEL: define void @multi_store_flat_pointer_to_self() {151; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)152; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr153; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8154; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8155; CHECK-NEXT: call void @user(ptr [[FLAT]])156; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8157; CHECK-NEXT: store ptr addrspace(5) [[ALLOCA]], ptr addrspace(5) [[ALLOCA]], align 8158; CHECK-NEXT: ret void159;160 %alloca = alloca ptr, align 8, addrspace(5)161 %flat = addrspacecast ptr addrspace(5) %alloca to ptr162 store ptr %flat, ptr %flat, align 8163 store ptr %flat, ptr %flat, align 8164 call void @user(ptr %flat)165 store ptr %flat, ptr addrspace(5) %alloca, align 8166 store ptr addrspace(5) %alloca, ptr %flat, align 8167 ret void168}169 170define void @mixed_volatile_multi_store_flat_pointer_to_self() {171; CHECK-LABEL: define void @mixed_volatile_multi_store_flat_pointer_to_self() {172; CHECK-NEXT: [[ALLOCA:%.*]] = alloca ptr, align 8, addrspace(5)173; CHECK-NEXT: [[FLAT:%.*]] = addrspacecast ptr addrspace(5) [[ALLOCA]] to ptr174; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8175; CHECK-NEXT: store volatile ptr [[FLAT]], ptr [[FLAT]], align 8176; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8177; CHECK-NEXT: call void @user(ptr [[FLAT]])178; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8179; CHECK-NEXT: store ptr addrspace(5) [[ALLOCA]], ptr addrspace(5) [[ALLOCA]], align 8180; CHECK-NEXT: store volatile ptr [[FLAT]], ptr [[FLAT]], align 8181; CHECK-NEXT: store ptr [[FLAT]], ptr addrspace(5) [[ALLOCA]], align 8182; CHECK-NEXT: ret void183;184 %alloca = alloca ptr, align 8, addrspace(5)185 %flat = addrspacecast ptr addrspace(5) %alloca to ptr186 store ptr %flat, ptr %flat, align 8187 store volatile ptr %flat, ptr %flat, align 8188 store ptr %flat, ptr %flat, align 8189 call void @user(ptr %flat)190 store ptr %flat, ptr addrspace(5) %alloca, align 8191 store ptr addrspace(5) %alloca, ptr %flat, align 8192 store volatile ptr %flat, ptr %flat, align 8193 store ptr %flat, ptr %flat, align 8194 ret void195}196 197define amdgpu_kernel void @uselist_regression_skipped_load(ptr nocapture readonly %Arg, i32 %i) {198; CHECK-LABEL: define amdgpu_kernel void @uselist_regression_skipped_load(199; CHECK-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[I:%.*]]) {200; CHECK-NEXT: [[ENTRY:.*:]]201; CHECK-NEXT: [[ARG_GLOBAL:%.*]] = addrspacecast ptr [[ARG]] to ptr addrspace(1)202; CHECK-NEXT: [[P1:%.*]] = getelementptr inbounds ptr, ptr addrspace(1) [[ARG_GLOBAL]], i32 [[I]]203; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr addrspace(1) [[P1]] to ptr204; CHECK-NEXT: [[P2:%.*]] = load volatile ptr, ptr [[TMP0]], align 8205; CHECK-NEXT: [[P2_GLOBAL:%.*]] = addrspacecast ptr [[P2]] to ptr addrspace(1)206; CHECK-NEXT: store float 0.000000e+00, ptr addrspace(1) [[P2_GLOBAL]], align 4207; CHECK-NEXT: ret void208;209entry:210 %Arg.global = addrspacecast ptr %Arg to ptr addrspace(1)211 %Arg.flat = addrspacecast ptr addrspace(1) %Arg.global to ptr212 %p1 = getelementptr inbounds ptr, ptr %Arg.flat, i32 %i213 %p2 = load volatile ptr, ptr %p1, align 8214 %p2.global = addrspacecast ptr %p2 to ptr addrspace(1)215 %p2.flat = addrspacecast ptr addrspace(1) %p2.global to ptr216 store float 0.000000e+00, ptr %p2.flat, align 4217 ret void218}219