1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Tests for indirect addressing on SI, which is implemented using dynamic 5*9880d681SAndroid Build Coastguard Worker; indexing of vectors. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_w_offset: 8*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 4.0 9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 0x40400000 10*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 2.0 11*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 1.0 12*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 14*9880d681SAndroid Build Coastguard Workerdefine void @extract_w_offset(float addrspace(1)* %out, i32 %in) { 15*9880d681SAndroid Build Coastguard Workerentry: 16*9880d681SAndroid Build Coastguard Worker %idx = add i32 %in, 1 17*9880d681SAndroid Build Coastguard Worker %elt = extractelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, i32 %idx 18*9880d681SAndroid Build Coastguard Worker store float %elt, float addrspace(1)* %out 19*9880d681SAndroid Build Coastguard Worker ret void 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; XXX: Could do v_or_b32 directly 23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_w_offset_salu_use_vector: 24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32 25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32 26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32 27*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32 28*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}} 29*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}} 30*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}} 31*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}} 32*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0 33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 34*9880d681SAndroid Build Coastguard Workerdefine void @extract_w_offset_salu_use_vector(i32 addrspace(1)* %out, i32 %in, <4 x i32> %or.val) { 35*9880d681SAndroid Build Coastguard Workerentry: 36*9880d681SAndroid Build Coastguard Worker %idx = add i32 %in, 1 37*9880d681SAndroid Build Coastguard Worker %vec = or <4 x i32> %or.val, <i32 1, i32 2, i32 3, i32 4> 38*9880d681SAndroid Build Coastguard Worker %elt = extractelement <4 x i32> %vec, i32 %idx 39*9880d681SAndroid Build Coastguard Worker store i32 %elt, i32 addrspace(1)* %out 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_wo_offset: 44*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 4.0 45*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 0x40400000 46*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 2.0 47*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 1.0 48*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0 49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 50*9880d681SAndroid Build Coastguard Workerdefine void @extract_wo_offset(float addrspace(1)* %out, i32 %in) { 51*9880d681SAndroid Build Coastguard Workerentry: 52*9880d681SAndroid Build Coastguard Worker %elt = extractelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, i32 %in 53*9880d681SAndroid Build Coastguard Worker store float %elt, float addrspace(1)* %out 54*9880d681SAndroid Build Coastguard Worker ret void 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_neg_offset_sgpr: 58*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 59*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}} 60*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32 v{{[0-9]}}, v0 61*9880d681SAndroid Build Coastguard Workerdefine void @extract_neg_offset_sgpr(i32 addrspace(1)* %out, i32 %offset) { 62*9880d681SAndroid Build Coastguard Workerentry: 63*9880d681SAndroid Build Coastguard Worker %index = add i32 %offset, -512 64*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 %index 65*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 66*9880d681SAndroid Build Coastguard Worker ret void 67*9880d681SAndroid Build Coastguard Worker} 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_neg_offset_sgpr_loaded: 70*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 71*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}} 72*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32 v{{[0-9]}}, v0 73*9880d681SAndroid Build Coastguard Workerdefine void @extract_neg_offset_sgpr_loaded(i32 addrspace(1)* %out, <4 x i32> %vec0, <4 x i32> %vec1, i32 %offset) { 74*9880d681SAndroid Build Coastguard Workerentry: 75*9880d681SAndroid Build Coastguard Worker %index = add i32 %offset, -512 76*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %vec0, %vec1 77*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> %or, i32 %index 78*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_neg_offset_vgpr: 83*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 84*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 85*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, m0, 0xfffffe{{[0-9a-z]+}} 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 v{{[0-9]}}, v0 87*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz 88*9880d681SAndroid Build Coastguard Workerdefine void @extract_neg_offset_vgpr(i32 addrspace(1)* %out) { 89*9880d681SAndroid Build Coastguard Workerentry: 90*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() #1 91*9880d681SAndroid Build Coastguard Worker %index = add i32 %id, -512 92*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 %index 93*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 94*9880d681SAndroid Build Coastguard Worker ret void 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_undef_offset_sgpr: 98*9880d681SAndroid Build Coastguard Workerdefine void @extract_undef_offset_sgpr(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 99*9880d681SAndroid Build Coastguard Workerentry: 100*9880d681SAndroid Build Coastguard Worker %ld = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in 101*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> %ld, i32 undef 102*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 103*9880d681SAndroid Build Coastguard Worker ret void 104*9880d681SAndroid Build Coastguard Worker} 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_undef_offset_sgpr_vector_src: 107*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 108*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, 109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32 110*9880d681SAndroid Build Coastguard Workerdefine void @insert_undef_offset_sgpr_vector_src(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) { 111*9880d681SAndroid Build Coastguard Workerentry: 112*9880d681SAndroid Build Coastguard Worker %ld = load <4 x i32>, <4 x i32> addrspace(1)* %in 113*9880d681SAndroid Build Coastguard Worker %value = insertelement <4 x i32> %ld, i32 5, i32 undef 114*9880d681SAndroid Build Coastguard Worker store <4 x i32> %value, <4 x i32> addrspace(1)* %out 115*9880d681SAndroid Build Coastguard Worker ret void 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_w_offset: 119*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 121*9880d681SAndroid Build Coastguard Workerdefine void @insert_w_offset(float addrspace(1)* %out, i32 %in) { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker %0 = add i32 %in, 1 124*9880d681SAndroid Build Coastguard Worker %1 = insertelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, float 5.0, i32 %0 125*9880d681SAndroid Build Coastguard Worker %2 = extractelement <4 x float> %1, i32 2 126*9880d681SAndroid Build Coastguard Worker store float %2, float addrspace(1)* %out 127*9880d681SAndroid Build Coastguard Worker ret void 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_wo_offset: 131*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 133*9880d681SAndroid Build Coastguard Workerdefine void @insert_wo_offset(float addrspace(1)* %out, i32 %in) { 134*9880d681SAndroid Build Coastguard Workerentry: 135*9880d681SAndroid Build Coastguard Worker %0 = insertelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, float 5.0, i32 %in 136*9880d681SAndroid Build Coastguard Worker %1 = extractelement <4 x float> %0, i32 2 137*9880d681SAndroid Build Coastguard Worker store float %1, float addrspace(1)* %out 138*9880d681SAndroid Build Coastguard Worker ret void 139*9880d681SAndroid Build Coastguard Worker} 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_offset_sgpr: 142*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 143*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}} 144*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v0, v{{[0-9]}} 145*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_offset_sgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out, i32 %offset) { 146*9880d681SAndroid Build Coastguard Workerentry: 147*9880d681SAndroid Build Coastguard Worker %index = add i32 %offset, -512 148*9880d681SAndroid Build Coastguard Worker %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index 149*9880d681SAndroid Build Coastguard Worker store <4 x i32> %value, <4 x i32> addrspace(1)* %out 150*9880d681SAndroid Build Coastguard Worker ret void 151*9880d681SAndroid Build Coastguard Worker} 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; The vector indexed into is originally loaded into an SGPR rather 154*9880d681SAndroid Build Coastguard Worker; than built with a reg_sequence 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_offset_sgpr_loadreg: 157*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 158*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}} 159*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v0, v{{[0-9]}} 160*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_offset_sgpr_loadreg(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out, <4 x i32> %vec, i32 %offset) { 161*9880d681SAndroid Build Coastguard Workerentry: 162*9880d681SAndroid Build Coastguard Worker %index = add i32 %offset, -512 163*9880d681SAndroid Build Coastguard Worker %value = insertelement <4 x i32> %vec, i32 5, i32 %index 164*9880d681SAndroid Build Coastguard Worker store <4 x i32> %value, <4 x i32> addrspace(1)* %out 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_offset_vgpr: 169*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 170*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 171*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, m0, 0xfffffe{{[0-9a-z]+}} 172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v0, v{{[0-9]}} 173*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz 174*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_offset_vgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out) { 175*9880d681SAndroid Build Coastguard Workerentry: 176*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() #1 177*9880d681SAndroid Build Coastguard Worker %index = add i32 %id, -512 178*9880d681SAndroid Build Coastguard Worker %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index 179*9880d681SAndroid Build Coastguard Worker store <4 x i32> %value, <4 x i32> addrspace(1)* %out 180*9880d681SAndroid Build Coastguard Worker ret void 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_inline_offset_vgpr: 184*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector. 185*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 186*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, m0, -{{[0-9]+}} 187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v0, v{{[0-9]}} 188*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz 189*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_inline_offset_vgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out) { 190*9880d681SAndroid Build Coastguard Workerentry: 191*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() #1 192*9880d681SAndroid Build Coastguard Worker %index = add i32 %id, -16 193*9880d681SAndroid Build Coastguard Worker %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index 194*9880d681SAndroid Build Coastguard Worker store <4 x i32> %value, <4 x i32> addrspace(1)* %out 195*9880d681SAndroid Build Coastguard Worker ret void 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker; When the block is split to insert the loop, make sure any other 199*9880d681SAndroid Build Coastguard Worker; places that need to be expanded in the same block are also handled. 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_vgpr_offset_multiple_in_block: 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: {{buffer|flat}}_load_dword [[IDX0:v[0-9]+]] 204*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_mov_b32 [[S_ELT0:s[0-9]+]], 7 205*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_mov_b32 [[S_ELT1:s[0-9]+]], 9 206*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT0:v[0-9]+]], [[S_ELT0]] 207*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT1:v[0-9]+]], [[S_ELT1]] 208*9880d681SAndroid Build Coastguard Worker; CHECK: s_waitcnt vmcnt(0) 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK:s\[[0-9]+:[0-9]+\]]], exec 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP0:BB[0-9]+_[0-9]+]]: 213*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]] 214*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo 215*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]] 216*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc 217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[MOVREL0:v[0-9]+]], [[VEC_ELT0]] 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc 219*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP0]] 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; FIXME: Redundant copy 222*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 exec, [[MASK]] 223*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK2:s\[[0-9]+:[0-9]+\]]], exec 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP1:BB[0-9]+_[0-9]+]]: 226*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]] 227*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo 228*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]] 229*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[MOVREL1:v[0-9]+]], [[VEC_ELT1]] 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc 232*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP1]] 233*9880d681SAndroid Build Coastguard Worker 234*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[MOVREL0]] 235*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[MOVREL1]] 236*9880d681SAndroid Build Coastguard Workerdefine void @extract_vgpr_offset_multiple_in_block(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 addrspace(1)* %in) #0 { 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() #1 239*9880d681SAndroid Build Coastguard Worker %id.ext = zext i32 %id to i64 240*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %id.ext 241*9880d681SAndroid Build Coastguard Worker %idx0 = load volatile i32, i32 addrspace(1)* %gep 242*9880d681SAndroid Build Coastguard Worker %idx1 = add i32 %idx0, 1 243*9880d681SAndroid Build Coastguard Worker %val0 = extractelement <4 x i32> <i32 7, i32 9, i32 11, i32 13>, i32 %idx0 244*9880d681SAndroid Build Coastguard Worker %live.out.reg = call i32 asm sideeffect "s_mov_b32 $0, 17", "={SGPR4}" () 245*9880d681SAndroid Build Coastguard Worker %val1 = extractelement <4 x i32> <i32 7, i32 9, i32 11, i32 13>, i32 %idx1 246*9880d681SAndroid Build Coastguard Worker store volatile i32 %val0, i32 addrspace(1)* %out0 247*9880d681SAndroid Build Coastguard Worker store volatile i32 %val1, i32 addrspace(1)* %out0 248*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %id, 0 249*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb1, label %bb2 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerbb1: 252*9880d681SAndroid Build Coastguard Worker store volatile i32 %live.out.reg, i32 addrspace(1)* undef 253*9880d681SAndroid Build Coastguard Worker br label %bb2 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerbb2: 256*9880d681SAndroid Build Coastguard Worker ret void 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_vgpr_offset_multiple_in_block: 260*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_load_dwordx4 s{{\[}}[[S_ELT0:[0-9]+]]:[[S_ELT3:[0-9]+]]{{\]}} 261*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: {{buffer|flat}}_load_dword [[IDX0:v[0-9]+]] 262*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT0:v[0-9]+]], s[[S_ELT0]] 263*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32 [[INS0:v[0-9]+]], 62 264*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_waitcnt vmcnt(0) 265*9880d681SAndroid Build Coastguard Worker 266*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK:s\[[0-9]+:[0-9]+\]]], exec 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP0:BB[0-9]+_[0-9]+]]: 269*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]] 270*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo 271*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]] 272*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v[[MOVREL0:[0-9]+]], [[INS0]] 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc 275*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP0]] 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker; FIXME: Redundant copy 278*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 exec, [[MASK]] 279*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e32 [[INS1:v[0-9]+]], 63 280*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK]], exec 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP1:BB[0-9]+_[0-9]+]]: 283*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]] 284*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo 285*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]] 286*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc 287*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v[[MOVREL1:[0-9]+]], [[INS1]] 288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc 289*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP1]] 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dwordx4 v{{\[}}[[MOVREL0]]: 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[INS0]] 294*9880d681SAndroid Build Coastguard Workerdefine void @insert_vgpr_offset_multiple_in_block(<4 x i32> addrspace(1)* %out0, <4 x i32> addrspace(1)* %out1, i32 addrspace(1)* %in, <4 x i32> %vec0) #0 { 295*9880d681SAndroid Build Coastguard Workerentry: 296*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() #1 297*9880d681SAndroid Build Coastguard Worker %id.ext = zext i32 %id to i64 298*9880d681SAndroid Build Coastguard Worker %gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %id.ext 299*9880d681SAndroid Build Coastguard Worker %idx0 = load volatile i32, i32 addrspace(1)* %gep 300*9880d681SAndroid Build Coastguard Worker %idx1 = add i32 %idx0, 1 301*9880d681SAndroid Build Coastguard Worker %live.out.val = call i32 asm sideeffect "v_mov_b32 $0, 62", "=v"() 302*9880d681SAndroid Build Coastguard Worker %vec1 = insertelement <4 x i32> %vec0, i32 %live.out.val, i32 %idx0 303*9880d681SAndroid Build Coastguard Worker %vec2 = insertelement <4 x i32> %vec1, i32 63, i32 %idx1 304*9880d681SAndroid Build Coastguard Worker store volatile <4 x i32> %vec2, <4 x i32> addrspace(1)* %out0 305*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %id, 0 306*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %bb1, label %bb2 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Workerbb1: 309*9880d681SAndroid Build Coastguard Worker store volatile i32 %live.out.val, i32 addrspace(1)* undef 310*9880d681SAndroid Build Coastguard Worker br label %bb2 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workerbb2: 313*9880d681SAndroid Build Coastguard Worker ret void 314*9880d681SAndroid Build Coastguard Worker} 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_adjacent_blocks: 317*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[ARG:s[0-9]+]] 318*9880d681SAndroid Build Coastguard Worker; CHECK: s_cmp_lg_i32 319*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_scc0 [[BB4:BB[0-9]+_[0-9]+]] 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 322*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, 323*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32 324*9880d681SAndroid Build Coastguard Worker; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]] 325*9880d681SAndroid Build Coastguard Worker 326*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB4]]: 327*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 328*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, 329*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32 330*9880d681SAndroid Build Coastguard Worker 331*9880d681SAndroid Build Coastguard Worker; CHECK: [[ENDBB]]: 332*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword 333*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 334*9880d681SAndroid Build Coastguard Workerdefine void @extract_adjacent_blocks(i32 %arg) #0 { 335*9880d681SAndroid Build Coastguard Workerbb: 336*9880d681SAndroid Build Coastguard Worker %tmp = icmp eq i32 %arg, 0 337*9880d681SAndroid Build Coastguard Worker br i1 %tmp, label %bb1, label %bb4 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerbb1: 340*9880d681SAndroid Build Coastguard Worker %tmp2 = load volatile <4 x float>, <4 x float> addrspace(1)* undef 341*9880d681SAndroid Build Coastguard Worker %tmp3 = extractelement <4 x float> %tmp2, i32 undef 342*9880d681SAndroid Build Coastguard Worker br label %bb7 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerbb4: 345*9880d681SAndroid Build Coastguard Worker %tmp5 = load volatile <4 x float>, <4 x float> addrspace(1)* undef 346*9880d681SAndroid Build Coastguard Worker %tmp6 = extractelement <4 x float> %tmp5, i32 undef 347*9880d681SAndroid Build Coastguard Worker br label %bb7 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Workerbb7: 350*9880d681SAndroid Build Coastguard Worker %tmp8 = phi float [ %tmp3, %bb1 ], [ %tmp6, %bb4 ] 351*9880d681SAndroid Build Coastguard Worker store volatile float %tmp8, float addrspace(1)* undef 352*9880d681SAndroid Build Coastguard Worker ret void 353*9880d681SAndroid Build Coastguard Worker} 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_adjacent_blocks: 356*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[ARG:s[0-9]+]] 357*9880d681SAndroid Build Coastguard Worker; CHECK: s_cmp_lg_i32 358*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_scc0 [[BB4:BB[0-9]+_[0-9]+]] 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 361*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, 362*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 363*9880d681SAndroid Build Coastguard Worker; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]] 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB4]]: 366*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 367*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, 368*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker; CHECK: [[ENDBB]]: 371*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword 372*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 373*9880d681SAndroid Build Coastguard Workerdefine void @insert_adjacent_blocks(i32 %arg, float %val0) #0 { 374*9880d681SAndroid Build Coastguard Workerbb: 375*9880d681SAndroid Build Coastguard Worker %tmp = icmp eq i32 %arg, 0 376*9880d681SAndroid Build Coastguard Worker br i1 %tmp, label %bb1, label %bb4 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb 379*9880d681SAndroid Build Coastguard Worker %tmp2 = load volatile <4 x float>, <4 x float> addrspace(1)* undef 380*9880d681SAndroid Build Coastguard Worker %tmp3 = insertelement <4 x float> %tmp2, float %val0, i32 undef 381*9880d681SAndroid Build Coastguard Worker br label %bb7 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Workerbb4: ; preds = %bb 384*9880d681SAndroid Build Coastguard Worker %tmp5 = load volatile <4 x float>, <4 x float> addrspace(1)* undef 385*9880d681SAndroid Build Coastguard Worker %tmp6 = insertelement <4 x float> %tmp5, float %val0, i32 undef 386*9880d681SAndroid Build Coastguard Worker br label %bb7 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Workerbb7: ; preds = %bb4, %bb1 389*9880d681SAndroid Build Coastguard Worker %tmp8 = phi <4 x float> [ %tmp3, %bb1 ], [ %tmp6, %bb4 ] 390*9880d681SAndroid Build Coastguard Worker store volatile <4 x float> %tmp8, <4 x float> addrspace(1)* undef 391*9880d681SAndroid Build Coastguard Worker ret void 392*9880d681SAndroid Build Coastguard Worker} 393*9880d681SAndroid Build Coastguard Worker 394*9880d681SAndroid Build Coastguard Worker; FIXME: Should be able to fold zero input to movreld to inline imm? 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}multi_same_block: 397*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[ARG:s[0-9]+]] 398*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[ZERO:v[0-9]+]], 0{{$}} 399*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_add_i32 m0, [[ARG]], -16 400*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v{{[0-9]+}}, [[ZERO]] 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, [[ARG]], -14 403*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}} 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, -1 406*9880d681SAndroid Build Coastguard Worker; CHECK: ds_write_b32 407*9880d681SAndroid Build Coastguard Worker; CHECK: ds_write_b32 408*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 409*9880d681SAndroid Build Coastguard Workerdefine void @multi_same_block(i32 %arg) #0 { 410*9880d681SAndroid Build Coastguard Workerbb: 411*9880d681SAndroid Build Coastguard Worker %tmp1 = add i32 %arg, -16 412*9880d681SAndroid Build Coastguard Worker %tmp2 = insertelement <6 x float> <float 1.700000e+01, float 1.800000e+01, float 1.900000e+01, float 2.000000e+01, float 2.100000e+01, float 2.200000e+01>, float 0.000000e+00, i32 %tmp1 413*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %arg, -16 414*9880d681SAndroid Build Coastguard Worker %tmp4 = insertelement <6 x float> <float 0x40311999A0000000, float 0x40321999A0000000, float 0x40331999A0000000, float 0x40341999A0000000, float 0x40351999A0000000, float 0x40361999A0000000>, float 0x3FB99999A0000000, i32 %tmp3 415*9880d681SAndroid Build Coastguard Worker %tmp5 = bitcast <6 x float> %tmp2 to <6 x i32> 416*9880d681SAndroid Build Coastguard Worker %tmp6 = extractelement <6 x i32> %tmp5, i32 1 417*9880d681SAndroid Build Coastguard Worker %tmp7 = bitcast <6 x float> %tmp4 to <6 x i32> 418*9880d681SAndroid Build Coastguard Worker %tmp8 = extractelement <6 x i32> %tmp7, i32 5 419*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp6, i32 addrspace(3)* undef, align 4 420*9880d681SAndroid Build Coastguard Worker store volatile i32 %tmp8, i32 addrspace(3)* undef, align 4 421*9880d681SAndroid Build Coastguard Worker ret void 422*9880d681SAndroid Build Coastguard Worker} 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Worker; offset puts outside of superegister bounaries, so clamp to 1st element. 425*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_largest_inbounds_offset: 426*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 v{{\[}}[[LO_ELT:[0-9]+]]:[[HI_ELT:[0-9]+]]{{\]}} 427*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[IDX:s[0-9]+]] 428*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, [[IDX]] 429*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[EXTRACT:v[0-9]+]], v[[HI_ELT]] 430*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[EXTRACT]] 431*9880d681SAndroid Build Coastguard Workerdefine void @extract_largest_inbounds_offset(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx) { 432*9880d681SAndroid Build Coastguard Workerentry: 433*9880d681SAndroid Build Coastguard Worker %ld = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in 434*9880d681SAndroid Build Coastguard Worker %offset = add i32 %idx, 3 435*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> %ld, i32 %offset 436*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 437*9880d681SAndroid Build Coastguard Worker ret void 438*9880d681SAndroid Build Coastguard Worker} 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Worker; CHECK-LABL: {{^}}extract_out_of_bounds_offset: 441*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 v{{\[}}[[LO_ELT:[0-9]+]]:[[HI_ELT:[0-9]+]]{{\]}} 442*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[IDX:s[0-9]+]] 443*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, [[IDX]], 4 444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[EXTRACT:v[0-9]+]], v[[LO_ELT]] 445*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[EXTRACT]] 446*9880d681SAndroid Build Coastguard Workerdefine void @extract_out_of_bounds_offset(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx) { 447*9880d681SAndroid Build Coastguard Workerentry: 448*9880d681SAndroid Build Coastguard Worker %ld = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in 449*9880d681SAndroid Build Coastguard Worker %offset = add i32 %idx, 4 450*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> %ld, i32 %offset 451*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 452*9880d681SAndroid Build Coastguard Worker ret void 453*9880d681SAndroid Build Coastguard Worker} 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Worker; Test that the or is folded into the base address register instead of 456*9880d681SAndroid Build Coastguard Worker; added to m0 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extractelement_v4i32_or_index: 459*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[IDX_IN:s[0-9]+]] 460*9880d681SAndroid Build Coastguard Worker; GCN: s_lshl_b32 [[IDX_SHL:s[0-9]+]], [[IDX_IN]] 461*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[IDX_SHL]] 462*9880d681SAndroid Build Coastguard Worker; GCN: s_mov_b32 m0, [[IDX_SHL]] 463*9880d681SAndroid Build Coastguard Worker; GCN: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}} 464*9880d681SAndroid Build Coastguard Workerdefine void @extractelement_v4i32_or_index(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx.in) { 465*9880d681SAndroid Build Coastguard Workerentry: 466*9880d681SAndroid Build Coastguard Worker %ld = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in 467*9880d681SAndroid Build Coastguard Worker %idx.shl = shl i32 %idx.in, 2 468*9880d681SAndroid Build Coastguard Worker %idx = or i32 %idx.shl, 1 469*9880d681SAndroid Build Coastguard Worker %value = extractelement <4 x i32> %ld, i32 %idx 470*9880d681SAndroid Build Coastguard Worker store i32 %value, i32 addrspace(1)* %out 471*9880d681SAndroid Build Coastguard Worker ret void 472*9880d681SAndroid Build Coastguard Worker} 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}insertelement_v4f32_or_index: 475*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[IDX_IN:s[0-9]+]] 476*9880d681SAndroid Build Coastguard Worker; GCN: s_lshl_b32 [[IDX_SHL:s[0-9]+]], [[IDX_IN]] 477*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[IDX_SHL]] 478*9880d681SAndroid Build Coastguard Worker; GCN: s_mov_b32 m0, [[IDX_SHL]] 479*9880d681SAndroid Build Coastguard Worker; GCN: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}} 480*9880d681SAndroid Build Coastguard Workerdefine void @insertelement_v4f32_or_index(<4 x float> addrspace(1)* %out, <4 x float> %a, i32 %idx.in) nounwind { 481*9880d681SAndroid Build Coastguard Worker %idx.shl = shl i32 %idx.in, 2 482*9880d681SAndroid Build Coastguard Worker %idx = or i32 %idx.shl, 1 483*9880d681SAndroid Build Coastguard Worker %vecins = insertelement <4 x float> %a, float 5.000000e+00, i32 %idx 484*9880d681SAndroid Build Coastguard Worker store <4 x float> %vecins, <4 x float> addrspace(1)* %out, align 16 485*9880d681SAndroid Build Coastguard Worker ret void 486*9880d681SAndroid Build Coastguard Worker} 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 491*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 492