]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/AMDGPU/extractelt-to-trunc.ll
Vendor import of llvm release_40 branch r296202:
[FreeBSD/FreeBSD.git] / test / CodeGen / AMDGPU / extractelt-to-trunc.ll
1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
2
3 ; Make sure the add and load are reduced to 32-bits even with the
4 ; bitcast to vector.
5 ; GCN-LABEL: {{^}}bitcast_int_to_vector_extract_0:
6 ; GCN-DAG: s_load_dword [[B:s[0-9]+]]
7 ; GCN-DAG: buffer_load_dword [[A:v[0-9]+]]
8 ; GCN: v_add_i32_e32 [[ADD:v[0-9]+]], vcc, [[B]], [[A]]
9 ; GCN: buffer_store_dword [[ADD]]
10 define void @bitcast_int_to_vector_extract_0(i32 addrspace(1)* %out, i64 addrspace(1)* %in, i64 %b) {
11    %a = load i64, i64 addrspace(1)* %in
12    %add = add i64 %a, %b
13    %val.bc = bitcast i64 %add to <2 x i32>
14    %extract = extractelement <2 x i32> %val.bc, i32 0
15    store i32 %extract, i32 addrspace(1)* %out
16    ret void
17 }
18
19 ; GCN-LABEL: {{^}}bitcast_fp_to_vector_extract_0:
20 ; GCN: buffer_load_dwordx2
21 ; GCN: v_add_f64
22 ; GCN: buffer_store_dword v
23 define void @bitcast_fp_to_vector_extract_0(i32 addrspace(1)* %out, double addrspace(1)* %in, double %b) {
24    %a = load double, double addrspace(1)* %in
25    %add = fadd double %a, %b
26    %val.bc = bitcast double %add to <2 x i32>
27    %extract = extractelement <2 x i32> %val.bc, i32 0
28    store i32 %extract, i32 addrspace(1)* %out
29    ret void
30 }
31
32 ; GCN-LABEL: {{^}}bitcast_int_to_fpvector_extract_0:
33 ; GCN: buffer_load_dwordx2
34 ; GCN: v_add_i32
35 ; GCN: buffer_store_dword
36 define void @bitcast_int_to_fpvector_extract_0(float addrspace(1)* %out, i64 addrspace(1)* %in, i64 %b) {
37    %a = load i64, i64 addrspace(1)* %in
38    %add = add i64 %a, %b
39    %val.bc = bitcast i64 %add to <2 x float>
40    %extract = extractelement <2 x float> %val.bc, i32 0
41    store float %extract, float addrspace(1)* %out
42    ret void
43 }
44
45 ; GCN-LABEL: {{^}}no_extract_volatile_load_extract0:
46 ; GCN: buffer_load_dwordx4
47 ; GCN: buffer_store_dword v
48 define void @no_extract_volatile_load_extract0(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
49 entry:
50   %vec = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in
51   %elt0 = extractelement <4 x i32> %vec, i32 0
52   store i32 %elt0, i32 addrspace(1)* %out
53   ret void
54 }
55
56 ; GCN-LABEL: {{^}}no_extract_volatile_load_extract2:
57 ; GCN: buffer_load_dwordx4
58 ; GCN: buffer_store_dword v
59
60 define void @no_extract_volatile_load_extract2(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
61 entry:
62   %vec = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in
63   %elt2 = extractelement <4 x i32> %vec, i32 2
64   store i32 %elt2, i32 addrspace(1)* %out
65   ret void
66 }
67
68 ; GCN-LABEL: {{^}}no_extract_volatile_load_dynextract:
69 ; GCN: buffer_load_dwordx4
70 ; GCN: buffer_store_dword v
71 define void @no_extract_volatile_load_dynextract(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx) {
72 entry:
73   %vec = load volatile <4 x i32>, <4 x i32> addrspace(1)* %in
74   %eltN = extractelement <4 x i32> %vec, i32 %idx
75   store i32 %eltN, i32 addrspace(1)* %out
76   ret void
77 }