xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/ds-sub-offset.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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