xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/extractelt-to-trunc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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; Make sure the add and load are reduced to 32-bits even with the
4*9880d681SAndroid Build Coastguard Worker; bitcast to vector.
5*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}bitcast_int_to_vector_extract_0:
6*9880d681SAndroid Build Coastguard Worker; GCN-DAG: s_load_dword [[B:s[0-9]+]]
7*9880d681SAndroid Build Coastguard Worker; GCN-DAG: buffer_load_dword [[A:v[0-9]+]]
8*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32_e32 [[ADD:v[0-9]+]], vcc, [[B]], [[A]]
9*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword [[ADD]]
10*9880d681SAndroid Build Coastguard Workerdefine void @bitcast_int_to_vector_extract_0(i32 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %b) {
11*9880d681SAndroid Build Coastguard Worker   %a = load i64, i64 addrspace(1)* %in
12*9880d681SAndroid Build Coastguard Worker   %add = add i64 %a, %b
13*9880d681SAndroid Build Coastguard Worker   %val.bc = bitcast i64 %add to <2 x i32>
14*9880d681SAndroid Build Coastguard Worker   %extract = extractelement <2 x i32> %val.bc, i32 0
15*9880d681SAndroid Build Coastguard Worker   store i32 %extract, i32 addrspace(1)* %out
16*9880d681SAndroid Build Coastguard Worker   ret void
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}bitcast_fp_to_vector_extract_0:
20*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2
21*9880d681SAndroid Build Coastguard Worker; GCN: v_add_f64
22*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v
23*9880d681SAndroid Build Coastguard Workerdefine void @bitcast_fp_to_vector_extract_0(i32 addrspace(1)* %out, double addrspace(1)* %in, double %b) {
24*9880d681SAndroid Build Coastguard Worker   %a = load double, double addrspace(1)* %in
25*9880d681SAndroid Build Coastguard Worker   %add = fadd double %a, %b
26*9880d681SAndroid Build Coastguard Worker   %val.bc = bitcast double %add to <2 x i32>
27*9880d681SAndroid Build Coastguard Worker   %extract = extractelement <2 x i32> %val.bc, i32 0
28*9880d681SAndroid Build Coastguard Worker   store i32 %extract, i32 addrspace(1)* %out
29*9880d681SAndroid Build Coastguard Worker   ret void
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}bitcast_int_to_fpvector_extract_0:
33*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx2
34*9880d681SAndroid Build Coastguard Worker; GCN: v_add_i32
35*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword
36*9880d681SAndroid Build Coastguard Workerdefine void @bitcast_int_to_fpvector_extract_0(float addrspace(1)* %out, i64 addrspace(1)* %in, i64 %b) {
37*9880d681SAndroid Build Coastguard Worker   %a = load i64, i64 addrspace(1)* %in
38*9880d681SAndroid Build Coastguard Worker   %add = add i64 %a, %b
39*9880d681SAndroid Build Coastguard Worker   %val.bc = bitcast i64 %add to <2 x float>
40*9880d681SAndroid Build Coastguard Worker   %extract = extractelement <2 x float> %val.bc, i32 0
41*9880d681SAndroid Build Coastguard Worker   store float %extract, float addrspace(1)* %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: {{^}}no_extract_volatile_load_extract0:
46*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
47*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v
48*9880d681SAndroid Build Coastguard Workerdefine void @no_extract_volatile_load_extract0(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  %vec = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in
51*9880d681SAndroid Build Coastguard Worker  %elt0 = extractelement <4 x i32> %vec, i32 0
52*9880d681SAndroid Build Coastguard Worker  store i32 %elt0, i32 addrspace(1)* %out
53*9880d681SAndroid Build Coastguard Worker  ret void
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}no_extract_volatile_load_extract2:
57*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
58*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerdefine void @no_extract_volatile_load_extract2(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
61*9880d681SAndroid Build Coastguard Workerentry:
62*9880d681SAndroid Build Coastguard Worker  %vec = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in
63*9880d681SAndroid Build Coastguard Worker  %elt2 = extractelement <4 x i32> %vec, i32 2
64*9880d681SAndroid Build Coastguard Worker  store i32 %elt2, i32 addrspace(1)* %out
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}no_extract_volatile_load_dynextract:
69*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dwordx4
70*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword v
71*9880d681SAndroid Build Coastguard Workerdefine void @no_extract_volatile_load_dynextract(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx) {
72*9880d681SAndroid Build Coastguard Workerentry:
73*9880d681SAndroid Build Coastguard Worker  %vec = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in
74*9880d681SAndroid Build Coastguard Worker  %eltN = extractelement <4 x i32> %vec, i32 %idx
75*9880d681SAndroid Build Coastguard Worker  store i32 %eltN, i32 addrspace(1)* %out
76*9880d681SAndroid Build Coastguard Worker  ret void
77*9880d681SAndroid Build Coastguard Worker}
78