1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=CI %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #0 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@lds.obj = addrspace(3) global [256 x i32] undef, align 4 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}write_ds_sub0_offset0_global: 8*9880d681SAndroid Build Coastguard Worker; GCN: v_lshlrev_b32_e32 [[SHL:v[0-9]+]], 2, v0 9*9880d681SAndroid Build Coastguard Worker; GCN: v_sub_i32_e32 [[BASEPTR:v[0-9]+]], vcc, 0, [[SHL]] 10*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VAL:v[0-9]+]], 0x7b 11*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b32 [[BASEPTR]], [[VAL]] offset:12 12*9880d681SAndroid Build Coastguard Workerdefine void @write_ds_sub0_offset0_global() #0 { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #1 15*9880d681SAndroid Build Coastguard Worker %sub1 = sub i32 0, %x.i 16*9880d681SAndroid Build Coastguard Worker %tmp0 = getelementptr [256 x i32], [256 x i32] addrspace(3)* @lds.obj, i32 0, i32 %sub1 17*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32 addrspace(3)* %tmp0, i32 3 18*9880d681SAndroid Build Coastguard Worker store i32 123, i32 addrspace(3)* %arrayidx 19*9880d681SAndroid Build Coastguard Worker ret void 20*9880d681SAndroid Build Coastguard Worker} 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}add_x_shl_neg_to_sub_max_offset: 23*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SCALED:v[0-9]+]], 2, v0 24*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0, [[SCALED]] 25*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 13 26*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b8 [[NEG]], [[K]] offset:65535 27*9880d681SAndroid Build Coastguard Workerdefine void @add_x_shl_neg_to_sub_max_offset() #1 { 28*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #0 29*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %x.i 30*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %neg, 2 31*9880d681SAndroid Build Coastguard Worker %add = add i32 65535, %shl 32*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i32 %add to i8 addrspace(3)* 33*9880d681SAndroid Build Coastguard Worker store i8 13, i8 addrspace(3)* %ptr 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}add_x_shl_neg_to_sub_max_offset_p1: 38*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SCALED:v[0-9]+]], 2, v0 39*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0x10000, [[SCALED]] 40*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 13 41*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b8 [[NEG]], [[K]]{{$}} 42*9880d681SAndroid Build Coastguard Workerdefine void @add_x_shl_neg_to_sub_max_offset_p1() #1 { 43*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #0 44*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %x.i 45*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %neg, 2 46*9880d681SAndroid Build Coastguard Worker %add = add i32 65536, %shl 47*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i32 %add to i8 addrspace(3)* 48*9880d681SAndroid Build Coastguard Worker store i8 13, i8 addrspace(3)* %ptr 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}add_x_shl_neg_to_sub_multi_use: 53*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SCALED:v[0-9]+]], 2, v0 54*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0, [[SCALED]] 55*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 13 56*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_sub 57*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b32 [[NEG]], [[K]] offset:123{{$}} 58*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_sub 59*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b32 [[NEG]], [[K]] offset:456{{$}} 60*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 61*9880d681SAndroid Build Coastguard Workerdefine void @add_x_shl_neg_to_sub_multi_use() #1 { 62*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #0 63*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %x.i 64*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %neg, 2 65*9880d681SAndroid Build Coastguard Worker %add0 = add i32 123, %shl 66*9880d681SAndroid Build Coastguard Worker %add1 = add i32 456, %shl 67*9880d681SAndroid Build Coastguard Worker %ptr0 = inttoptr i32 %add0 to i32 addrspace(3)* 68*9880d681SAndroid Build Coastguard Worker store volatile i32 13, i32 addrspace(3)* %ptr0 69*9880d681SAndroid Build Coastguard Worker %ptr1 = inttoptr i32 %add1 to i32 addrspace(3)* 70*9880d681SAndroid Build Coastguard Worker store volatile i32 13, i32 addrspace(3)* %ptr1 71*9880d681SAndroid Build Coastguard Worker ret void 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}add_x_shl_neg_to_sub_multi_use_same_offset: 75*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SCALED:v[0-9]+]], 2, v0 76*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0, [[SCALED]] 77*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 13 78*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_sub 79*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b32 [[NEG]], [[K]] offset:123{{$}} 80*9880d681SAndroid Build Coastguard Worker; GCN-NOT: v_sub 81*9880d681SAndroid Build Coastguard Worker; GCN: ds_write_b32 [[NEG]], [[K]] offset:123{{$}} 82*9880d681SAndroid Build Coastguard Worker; GCN: s_endpgm 83*9880d681SAndroid Build Coastguard Workerdefine void @add_x_shl_neg_to_sub_multi_use_same_offset() #1 { 84*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #0 85*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %x.i 86*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %neg, 2 87*9880d681SAndroid Build Coastguard Worker %add = add i32 123, %shl 88*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i32 %add to i32 addrspace(3)* 89*9880d681SAndroid Build Coastguard Worker store volatile i32 13, i32 addrspace(3)* %ptr 90*9880d681SAndroid Build Coastguard Worker store volatile i32 13, i32 addrspace(3)* %ptr 91*9880d681SAndroid Build Coastguard Worker ret void 92*9880d681SAndroid Build Coastguard Worker} 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}add_x_shl_neg_to_sub_misaligned_i64_max_offset: 95*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SCALED:v[0-9]+]], 2, v0 96*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0, [[SCALED]] 97*9880d681SAndroid Build Coastguard Worker; GCN: ds_write2_b32 [[NEG]], {{v[0-9]+}}, {{v[0-9]+}} offset0:254 offset1:255 98*9880d681SAndroid Build Coastguard Workerdefine void @add_x_shl_neg_to_sub_misaligned_i64_max_offset() #1 { 99*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #0 100*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %x.i 101*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %neg, 2 102*9880d681SAndroid Build Coastguard Worker %add = add i32 1019, %shl 103*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i32 %add to i64 addrspace(3)* 104*9880d681SAndroid Build Coastguard Worker store i64 123, i64 addrspace(3)* %ptr, align 4 105*9880d681SAndroid Build Coastguard Worker ret void 106*9880d681SAndroid Build Coastguard Worker} 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}add_x_shl_neg_to_sub_misaligned_i64_max_offset_p1: 109*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_lshlrev_b32_e32 [[SCALED:v[0-9]+]], 2, v0 110*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_sub_i32_e32 [[NEG:v[0-9]+]], vcc, 0x3fc, [[SCALED]] 111*9880d681SAndroid Build Coastguard Worker; GCN: ds_write2_b32 [[NEG]], {{v[0-9]+}}, {{v[0-9]+}} offset1:1{{$}} 112*9880d681SAndroid Build Coastguard Workerdefine void @add_x_shl_neg_to_sub_misaligned_i64_max_offset_p1() #1 { 113*9880d681SAndroid Build Coastguard Worker %x.i = call i32 @llvm.amdgcn.workitem.id.x() #0 114*9880d681SAndroid Build Coastguard Worker %neg = sub i32 0, %x.i 115*9880d681SAndroid Build Coastguard Worker %shl = shl i32 %neg, 2 116*9880d681SAndroid Build Coastguard Worker %add = add i32 1020, %shl 117*9880d681SAndroid Build Coastguard Worker %ptr = inttoptr i32 %add to i64 addrspace(3)* 118*9880d681SAndroid Build Coastguard Worker store i64 123, i64 addrspace(3)* %ptr, align 4 119*9880d681SAndroid Build Coastguard Worker ret void 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone } 123*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 124*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind convergent } 125