1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Test that when extracting the same unknown vector index from an 4*9880d681SAndroid Build Coastguard Worker; insertelement the dynamic indexing is folded away. 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #0 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; No dynamic indexing required 9*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extract_insert_same_dynelt_v4i32: 10*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd{{$}} 11*9880d681SAndroid Build Coastguard Worker; GCN-NOT buffer_load_dword 12*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[VAL]] 13*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]] 14*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[VVAL]] 15*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[VVAL]] 16*9880d681SAndroid Build Coastguard Workerdefine void @extract_insert_same_dynelt_v4i32(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %val, i32 %idx) #1 { 17*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 18*9880d681SAndroid Build Coastguard Worker %id.ext = sext i32 %id to i64 19*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr inbounds <4 x i32>, <4 x i32> addrspace(1)* %in, i64 %id.ext 20*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %id.ext 21*9880d681SAndroid Build Coastguard Worker %vec = load <4 x i32>, <4 x i32> addrspace(1)* %gep.in 22*9880d681SAndroid Build Coastguard Worker %insert = insertelement <4 x i32> %vec, i32 %val, i32 %idx 23*9880d681SAndroid Build Coastguard Worker %extract = extractelement <4 x i32> %insert, i32 %idx 24*9880d681SAndroid Build Coastguard Worker store i32 %extract, i32 addrspace(1)* %gep.out 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extract_insert_different_dynelt_v4i32: 29*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4 30*9880d681SAndroid Build Coastguard Worker; GCN: v_movreld_b32 31*9880d681SAndroid Build Coastguard Worker; GCN: v_movrels_b32 32*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v 33*9880d681SAndroid Build Coastguard Workerdefine void @extract_insert_different_dynelt_v4i32(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %val, i32 %idx0, i32 %idx1) #1 { 34*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 35*9880d681SAndroid Build Coastguard Worker %id.ext = sext i32 %id to i64 36*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr inbounds <4 x i32>, <4 x i32> addrspace(1)* %in, i64 %id.ext 37*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %id.ext 38*9880d681SAndroid Build Coastguard Worker %vec = load <4 x i32>, <4 x i32> addrspace(1)* %gep.in 39*9880d681SAndroid Build Coastguard Worker %insert = insertelement <4 x i32> %vec, i32 %val, i32 %idx0 40*9880d681SAndroid Build Coastguard Worker %extract = extractelement <4 x i32> %insert, i32 %idx1 41*9880d681SAndroid Build Coastguard Worker store i32 %extract, i32 addrspace(1)* %gep.out 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extract_insert_same_elt2_v4i32: 46*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd{{$}} 47*9880d681SAndroid Build Coastguard Worker; GCN-NOT buffer_load_dword 48*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[VAL]] 49*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]] 50*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[VVAL]] 51*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[VVAL]] 52*9880d681SAndroid Build Coastguard Workerdefine void @extract_insert_same_elt2_v4i32(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %val, i32 %idx) #1 { 53*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 54*9880d681SAndroid Build Coastguard Worker %id.ext = sext i32 %id to i64 55*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr inbounds <4 x i32>, <4 x i32> addrspace(1)* %in, i64 %id.ext 56*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr inbounds i32, i32 addrspace(1)* %out, i64 %id.ext 57*9880d681SAndroid Build Coastguard Worker %vec = load <4 x i32>, <4 x i32> addrspace(1)* %gep.in 58*9880d681SAndroid Build Coastguard Worker %insert = insertelement <4 x i32> %vec, i32 %val, i32 %idx 59*9880d681SAndroid Build Coastguard Worker %extract = extractelement <4 x i32> %insert, i32 %idx 60*9880d681SAndroid Build Coastguard Worker store i32 %extract, i32 addrspace(1)* %gep.out 61*9880d681SAndroid Build Coastguard Worker ret void 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extract_insert_same_dynelt_v4f32: 65*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[VAL:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xd{{$}} 66*9880d681SAndroid Build Coastguard Worker; GCN-NOT buffer_load_dword 67*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[VAL]] 68*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VVAL:v[0-9]+]], [[VAL]] 69*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[VVAL]] 70*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[VVAL]] 71*9880d681SAndroid Build Coastguard Workerdefine void @extract_insert_same_dynelt_v4f32(float addrspace(1)* %out, <4 x float> addrspace(1)* %in, float %val, i32 %idx) #1 { 72*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 73*9880d681SAndroid Build Coastguard Worker %id.ext = sext i32 %id to i64 74*9880d681SAndroid Build Coastguard Worker %gep.in = getelementptr inbounds <4 x float>, <4 x float> addrspace(1)* %in, i64 %id.ext 75*9880d681SAndroid Build Coastguard Worker %gep.out = getelementptr inbounds float, float addrspace(1)* %out, i64 %id.ext 76*9880d681SAndroid Build Coastguard Worker %vec = load volatile <4 x float>, <4 x float> addrspace(1)* %gep.in 77*9880d681SAndroid Build Coastguard Worker %insert = insertelement <4 x float> %vec, float %val, i32 %idx 78*9880d681SAndroid Build Coastguard Worker %extract = extractelement <4 x float> %insert, i32 %idx 79*9880d681SAndroid Build Coastguard Worker store float %extract, float addrspace(1)* %gep.out 80*9880d681SAndroid Build Coastguard Worker ret void 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 84*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }