1; RUN: opt -cost-model -analyze -mtriple=amdgcn-unknown-amdhsa %s | FileCheck -check-prefixes=GCN,CI %s
2; RUN: opt -cost-model -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=fiji %s | FileCheck -check-prefixes=GCN,GFX89 %s
3; RUN: opt -cost-model -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=gfx900 %s | FileCheck -check-prefixes=GCN,GFX89 %s
4; RUN: opt -cost-model -cost-kind=code-size -analyze -mtriple=amdgcn-unknown-amdhsa %s | FileCheck -check-prefixes=GCN,CI %s
5; RUN: opt -cost-model -cost-kind=code-size -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=fiji %s | FileCheck -check-prefixes=GCN,GFX89 %s
6; RUN: opt -cost-model -cost-kind=code-size -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=gfx900 %s | FileCheck -check-prefixes=GCN,GFX89 %s
7
8
9; GCN: 'extractelement_v2i32'
10; GCN: estimated cost of 0 for {{.*}} extractelement <2 x i32>
11define amdgpu_kernel void @extractelement_v2i32(i32 addrspace(1)* %out, <2 x i32> addrspace(1)* %vaddr) {
12  %vec = load <2 x i32>, <2 x i32> addrspace(1)* %vaddr
13  %elt = extractelement <2 x i32> %vec, i32 1
14  store i32 %elt, i32 addrspace(1)* %out
15  ret void
16}
17
18; GCN: 'extractelement_v2f32'
19; GCN: estimated cost of 0 for {{.*}} extractelement <2 x float>
20define amdgpu_kernel void @extractelement_v2f32(float addrspace(1)* %out, <2 x float> addrspace(1)* %vaddr) {
21  %vec = load <2 x float>, <2 x float> addrspace(1)* %vaddr
22  %elt = extractelement <2 x float> %vec, i32 1
23  store float %elt, float addrspace(1)* %out
24  ret void
25}
26
27; GCN: 'extractelement_v3i32'
28; GCN: estimated cost of 0 for {{.*}} extractelement <3 x i32>
29define amdgpu_kernel void @extractelement_v3i32(i32 addrspace(1)* %out, <3 x i32> addrspace(1)* %vaddr) {
30  %vec = load <3 x i32>, <3 x i32> addrspace(1)* %vaddr
31  %elt = extractelement <3 x i32> %vec, i32 1
32  store i32 %elt, i32 addrspace(1)* %out
33  ret void
34}
35
36; GCN: 'extractelement_v4i32'
37; GCN: estimated cost of 0 for {{.*}} extractelement <4 x i32>
38define amdgpu_kernel void @extractelement_v4i32(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %vaddr) {
39  %vec = load <4 x i32>, <4 x i32> addrspace(1)* %vaddr
40  %elt = extractelement <4 x i32> %vec, i32 1
41  store i32 %elt, i32 addrspace(1)* %out
42  ret void
43}
44
45; GCN: 'extractelement_v5i32'
46; GCN: estimated cost of 0 for {{.*}} extractelement <5 x i32>
47define amdgpu_kernel void @extractelement_v5i32(i32 addrspace(1)* %out, <5 x i32> addrspace(1)* %vaddr) {
48  %vec = load <5 x i32>, <5 x i32> addrspace(1)* %vaddr
49  %elt = extractelement <5 x i32> %vec, i32 1
50  store i32 %elt, i32 addrspace(1)* %out
51  ret void
52}
53
54; GCN: 'extractelement_v8i32'
55; GCN: estimated cost of 0 for {{.*}} extractelement <8 x i32>
56define amdgpu_kernel void @extractelement_v8i32(i32 addrspace(1)* %out, <8 x i32> addrspace(1)* %vaddr) {
57  %vec = load <8 x i32>, <8 x i32> addrspace(1)* %vaddr
58  %elt = extractelement <8 x i32> %vec, i32 1
59  store i32 %elt, i32 addrspace(1)* %out
60  ret void
61}
62
63; FIXME: Should be non-0
64; GCN: 'extractelement_v8i32_dynindex'
65; GCN: estimated cost of 2 for {{.*}} extractelement <8 x i32>
66define amdgpu_kernel void @extractelement_v8i32_dynindex(i32 addrspace(1)* %out, <8 x i32> addrspace(1)* %vaddr, i32 %idx) {
67  %vec = load <8 x i32>, <8 x i32> addrspace(1)* %vaddr
68  %elt = extractelement <8 x i32> %vec, i32 %idx
69  store i32 %elt, i32 addrspace(1)* %out
70  ret void
71}
72
73; GCN: 'extractelement_v2i64'
74; GCN: estimated cost of 0 for {{.*}} extractelement <2 x i64>
75define amdgpu_kernel void @extractelement_v2i64(i64 addrspace(1)* %out, <2 x i64> addrspace(1)* %vaddr) {
76  %vec = load <2 x i64>, <2 x i64> addrspace(1)* %vaddr
77  %elt = extractelement <2 x i64> %vec, i64 1
78  store i64 %elt, i64 addrspace(1)* %out
79  ret void
80}
81
82; GCN: 'extractelement_v3i64'
83; GCN: estimated cost of 0 for {{.*}} extractelement <3 x i64>
84define amdgpu_kernel void @extractelement_v3i64(i64 addrspace(1)* %out, <3 x i64> addrspace(1)* %vaddr) {
85  %vec = load <3 x i64>, <3 x i64> addrspace(1)* %vaddr
86  %elt = extractelement <3 x i64> %vec, i64 1
87  store i64 %elt, i64 addrspace(1)* %out
88  ret void
89}
90
91; GCN: 'extractelement_v4i64'
92; GCN: estimated cost of 0 for {{.*}} extractelement <4 x i64>
93define amdgpu_kernel void @extractelement_v4i64(i64 addrspace(1)* %out, <4 x i64> addrspace(1)* %vaddr) {
94  %vec = load <4 x i64>, <4 x i64> addrspace(1)* %vaddr
95  %elt = extractelement <4 x i64> %vec, i64 1
96  store i64 %elt, i64 addrspace(1)* %out
97  ret void
98}
99
100; GCN: 'extractelement_v8i64'
101; GCN: estimated cost of 0 for {{.*}} extractelement <8 x i64>
102define amdgpu_kernel void @extractelement_v8i64(i64 addrspace(1)* %out, <8 x i64> addrspace(1)* %vaddr) {
103  %vec = load <8 x i64>, <8 x i64> addrspace(1)* %vaddr
104  %elt = extractelement <8 x i64> %vec, i64 1
105  store i64 %elt, i64 addrspace(1)* %out
106  ret void
107}
108
109; GCN: 'extractelement_v4i8'
110; GCN: estimated cost of 1 for {{.*}} extractelement <4 x i8>
111define amdgpu_kernel void @extractelement_v4i8(i8 addrspace(1)* %out, <4 x i8> addrspace(1)* %vaddr) {
112  %vec = load <4 x i8>, <4 x i8> addrspace(1)* %vaddr
113  %elt = extractelement <4 x i8> %vec, i8 1
114  store i8 %elt, i8 addrspace(1)* %out
115  ret void
116}
117
118; GCN: 'extractelement_0_v2i16':
119; CI: estimated cost of 1 for {{.*}} extractelement <2 x i16> %vec, i16 0
120; GFX89: estimated cost of 0 for {{.*}} extractelement <2 x i16>
121define amdgpu_kernel void @extractelement_0_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %vaddr) {
122  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %vaddr
123  %elt = extractelement <2 x i16> %vec, i16 0
124  store i16 %elt, i16 addrspace(1)* %out
125  ret void
126}
127
128; GCN: 'extractelement_1_v2i16':
129; GCN: estimated cost of 1 for {{.*}} extractelement <2 x i16>
130define amdgpu_kernel void @extractelement_1_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %vaddr) {
131  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %vaddr
132  %elt = extractelement <2 x i16> %vec, i16 1
133  store i16 %elt, i16 addrspace(1)* %out
134  ret void
135}
136
137; GCN: 'extractelement_var_v2i16'
138; GCN: estimated cost of 1 for {{.*}} extractelement <2 x i16>
139define amdgpu_kernel void @extractelement_var_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %vaddr, i32 %idx) {
140  %vec = load <2 x i16>, <2 x i16> addrspace(1)* %vaddr
141  %elt = extractelement <2 x i16> %vec, i32 %idx
142  store i16 %elt, i16 addrspace(1)* %out
143  ret void
144}
145