brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.0 KiB · 0b2c474 Raw
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